zoukankan      html  css  js  c++  java
  • Controller之daemonset

    一、Daemonset概念

    (1)DaemonSet 确保所有节点上运行一个 Pod 的副本。 当有节点加入集群时也会为他们新增一个 Pod 。 当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
    (2)DaemonSet 常用来部署一些集群的日志、监控或者其他系统管理应用。典型的应用包括:
    
    *日志收集,比如fluentd,logstash等
    *系统监控,比如Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond等
    *系统程序,比如kube-proxy, kube-dns, glusterd, ceph等
    

    二、Daemonset的Pod是如何被调度的?

    (1)由 DaemonSet 控制器调度
    v1.12以后默认禁用
    
    通常,Kubernetes Scheduler(调度器)决定了 Pod 在哪个节点上运行。然而 DaemonSet Controller 创建的 Pod 已经指定了 .spec.nodeName 字段,因此:
    Node 节点的 unschedulable (opens new window) 字段将被 DaemonSet Controller 忽略DaemonSet Controller 可以在 kubernetes scheduler 启动之前创建 Pod,这个特性在引导集群启动的时候非常有用(集群使用者无需关心)
    
    (2)由默认调度器调度
    v1.12以后默认启用
    
    DaemonSet 确保所以符合条件的节点运行了一个指定的 Pod。通常,Kubernetes Scheduler 决定 Pod 在哪个节点上运行。然而如果 DaemonSet 的 Pod 由 DaemonSet Controller 创建和调度,会引发如下问题:
    *Pod 的行为不一致:普通的 Pod 在创建后处于 Pending 状态,并等待被调度,但是 DaemonSet Pod 创建后,初始状态不是 Pending。这会使用户感到困惑
    *Pod 的优先权(preemption) (opens new window) 由 kubernetes 调度器处理。如果 Pod 优先权被启用,DaemonSet Controller 在创建和调度 Pod 时,不会考虑 Pod 的优先权
    
    Kubernetes v1.12 版本以后,默认通过 kubernetes 调度器来调度 DaemonSet 的 Pod。DaemonSet Controller 将会向 DaemonSet 的 Pod 添加 .spec.nodeAffinity 字段,而不是 .spec.nodeName 字段,并进一步由 kubernetes 调度器将 Pod 绑定到目标节点。如果 DaemonSet 的 Pod 已经存在了 nodeAffinity 字段,该字段的值将被替换。
    
    nodeAffinity:
    
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchFields:
          - key: metadata.name
            operator: In
            values:
            - target-host-nam
    

    此外, node.kubernetes.io/unschedulable:NoSchedule 容忍(toleration)将被自动添加到 DaemonSet 的 Pod 中。由此,默认调度器在调度 DaemonSet 的 Pod 时可以忽略节点的 unschedulable 属性

    三、创建Daemonset示例

    下面的daemonset.yaml文件描述了一个运行fluentd-elasticsearch Docker镜像的DaemonSet

    apiVersion: extensions/v1beta1
    
    kind: DaemonSet
    metadata:
      name: fluentd
    spec:
      template:
        metadata:
          labels:
            app: logging
            id: fluentd
          name: fluentd
        spec:
          containers:
          - name: fluentd-es
            image: gcr.io/google_containers/fluentd-elasticsearch:1.3
            env:
             - name: FLUENTD_ARGS
               value: -qq
            volumeMounts:
             - name: containers
               mountPath: /var/lib/docker/containers
             - name: varlog
               mountPath: /varlog
          volumes:
             - hostPath:
                 path: /var/lib/docker/containers
               name: containers
             - hostPath:
                 path: /var/log
               name: varlog
    

    *我的环境是一个master两个worknode节点,虽然yaml里并没有指定副本数,daemonset仍然在我两个节点里都起了一个pod。

    *任意到一个节点上,登录到容器里挂载的路径,有相关的日志

    kubenetes官网:https://kubernetes.io/zh/docs/concepts/workloads/controllers/daemonset/
    kubenetes社区:https://www.kubernetes.org.cn/daemonset
    kuboard.cn官网:https://kuboard.cn/learning/k8s-intermediate/workload/wl-daemonset/

  • 相关阅读:
    Running APP 使用说明
    Android 控件八 WebView 控件
    Android 控件七 ImageView 控件
    Android 控件六 CheckBox 控件
    Android 控件五 RadioButton 控件
    Android 控件四 EditText 控件
    Android 控件三 TextView 控件实现 Button
    Android 控件二 Button
    Android 基础控件演示实例
    Android 控件一 TextView
  • 原文地址:https://www.cnblogs.com/you-xiaoqing/p/14384834.html
Copyright © 2011-2022 走看看