前言
Deployment 治理的 Pod 容许在一个节点上运行多个正本。
当须要在节点上运行收集日志或者执行监控工作的容器时,显然不适宜启动多个 Pod 正本。
这种场景下,咱们能够启用 DaemonSet 控制器来治理 Pod。
更新历史
- 20200620 – 初稿 – 左程立
- 原文地址 – https://blog.zuolinux.com/2020/06/20/about-controller-daemonset.html
Daemon Pod 的特点
- Pod 运行在集群中的全副或者局部节点上
- 每个节点上只能有一个这样的 Pod
- 当集群中退出了新节点,Pod 会主动在新节点上创立
- 当节点被从集群中移除后,节点上 Pod 会主动被回收掉
Daemon Pod 实用的场景
- 网络插件的 Agent
- 存储插件的 Agent
- 监控工作的 Agent
- 收集日志的 Agent
DaemonSet
创立一个 DS
cat daemonset.yaml
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。
而后查看以后这个 Node 上是不是有一个携带了 name=fluentd-elasticsearch 标签的 Pod 在运行。
而查看的后果,大略有这么三种状况:
- Node 上没有这种 Pod,那么就意味着要在这个 Node 上创立这个 Pod;
- Node 上有这种 Pod,然而数量大于 1,那就阐明要把多余的 Pod 从这个 Node 上删除掉;
- 只有一个这种 Pod,阐明这个节点是失常的。
重要参数
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 胜利启动
仅在局部节点运行 Pod
能够在 YAML 中手工指定 .spec.template.spec.affinity,这样 Pod 会运行在指定的 Node 上
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchFields:
- key: metadata.name
operator: In
values:
- target-host-name
如果没有指定该参数,那么 Pod 会运行在所有 Node 上
DaemonSet 长处
咱们也能够本人写一个守护过程来执行相似的工作,应用 DaemonSet Pod 有哪些长处呢。
- DaemonSet Pod 自带本身监控性能,省去了咱们本人再写一个针对守护过程的监控程序的工作
- DaemonSet Pod 不论运行什么工作,都是对立的语言和治理形式
- DaemonSet Pod 自带了资源限度性能,防止了守护过程长时间运行占用过多资源对宿主机造成影响
结束语
DaemonSet 偏向于准确管制 Pod 运行在哪些机器上,确保这些机器上都有这个 Pod 在运行。
而 Deployment 更适宜于治理离用户更近的无状态类 Pod,比方 Web 服务。
它们的共同点是,都不心愿本人治理的 Pod 终止,Pod 呈现问题后能够自愈。
分割我
微信公众号:zuolinux_com