Deployment 管理的 Pod 容许在一个节点上运行多个副本。html
当须要在节点上运行收集日志或者执行监控任务的容器时,显然不适合启动多个 Pod 副本。node
这种场景下,咱们能够启用 DaemonSet 控制器来管理 Pod。linux
建立一个 DSdocker
cat daemonset.yamlapi
apiVersion: apps/v1 kind: DaemonSet metadata: name: fluentd-elasticsearch namespace: kube-system labels: k8s-app: fluentd-logging spec: selector: matchLabels: name: fluentd-elasticsearch template: metadata: labels: name: fluentd-elasticsearch spec: tolerations: # this toleration is to have the daemonset runnable on master nodes # remove it if your masters can't run pods - key: node-role.kubernetes.io/master effect: NoSchedule containers: - name: fluentd-elasticsearch image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2 resources: limits: memory: 200Mi requests: cpu: 100m memory: 200Mi volumeMounts: - name: varlog mountPath: /var/log - name: varlibdockercontainers mountPath: /var/lib/docker/containers readOnly: true terminationGracePeriodSeconds: 30 volumes: - name: varlog hostPath: path: /var/log - name: varlibdockercontainers hostPath: path: /var/lib/docker/containers
# kubectl apply -f daemonset.yaml daemonset.apps/fluentd-elasticsearch created
查看微信
[root@master01 ~]# kubectl get ds --namespace kube-system NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE fluentd-elasticsearch 6 6 6 6 6 <none> 11m
目前集群中有 3 个 master,3 个 worker,一共 6 个节点,能够看到 6 个节点上都运行了该 node网络
DaemonSet Controller,从 Etcd 里获取全部的 Node 列表,而后遍历全部的 Node。app
而后检查当前这个 Node 上是否是有一个携带了 name=fluentd-elasticsearch 标签的 Pod 在运行。elasticsearch
而检查的结果,大概有这么三种状况:ui
spec.affinity.nodeAffinity
经过命令
# kubectl edit pod fluentd-elasticsearch-22g5r --namespace=kube-system
能够看到 DaemonSet 自动给 Pod 增长了参数
spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchFields: - key: metadata.name operator: In values: - master03
限制了该 Pod 只能运行在 master03 这个 Node 上
tolerations
一样经过上面的命令,能够看到有参数
tolerations: - effect: NoSchedule key: node-role.kubernetes.io/master - effect: NoExecute key: node.kubernetes.io/not-ready operator: Exists - effect: NoExecute key: node.kubernetes.io/unreachable operator: Exists - effect: NoSchedule key: node.kubernetes.io/disk-pressure
意味着能够容忍全部标记有以下“污点”的 Node,能够在这些 Node 上运行
master/not-ready/unreachable/disk-pressure
正常状况下,若是 Node 上被标记了这些“污点”,Pod 被禁止调度到这样的 Node 上运行
但 DaemonSet 给 Pod 加上了 tolerations,使 Pod 能够忽略这些污点,从而成功将 Pod 调度到“污点”节点上
若是节点有故障致使 Pod 启动失败,DaemonSet 会一直尝试,直到 Pod 成功启动
能够在 YAML 中手工指定 .spec.template.spec.affinity,这样 Pod 会运行在指定的 Node 上
nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchFields: - key: metadata.name operator: In values: - target-host-name
若是没有指定该参数,那么 Pod 会运行在全部 Node 上
咱们也能够本身写一个守护进程来执行相似的工做,使用 DaemonSet Pod 有哪些优势呢。
DaemonSet 倾向于精确控制 Pod 运行在哪些机器上,确保这些机器上都有这个 Pod 在运行。
而 Deployment 更适合于管理离用户更近的无状态类 Pod,好比 Web 服务。
它们的共同点是,都不但愿本身管理的 Pod 终止,Pod 出现问题后能够自愈。
微信公众号:zuolinux_com