概述
官网文档:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/daemonset/
DaemonSet简称ds
DaemonSet 在不考虑污点的情况下会确保全部(或者某些)节点上运行一个 Pod 的副本。 当有节点加入集群时, 也会为他们新增一个 Pod 。 当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
使用场景:
- 在每个节点上运行集群守护进程
- 比如:kube-proxy
- 在每个节点上运行日志收集守护进程
- 比如:filebeat
- 在每个节点上运行监控守护进程
- 比如:zabbix-agent2
资源清单文件详解
apiVersion: apps/v1 # API 版本,当前稳定版本为 apps/v1 kind: DaemonSet # 资源类型为 DaemonSet metadata: name: example-daemonset # DaemonSet 名称,需在命名空间内唯一 namespace: default # 所属命名空间,默认值为 default labels: # 标签,用于关联 Pod/Selector 等 app: monitoring spec: selector: # 标签选择器,用于匹配受控的 Pod matchLabels: app: monitoring template: # Pod 模板,定义 Pod 的具体配置 metadata: labels: app: monitoring # 需与 selector.matchLabels 一致 spec: containers: - name: agent # 容器名称 image: agent:v1 # 镜像地址 resources: # 资源限制(可选) requests: cpu: 100m memory: 100Mi limits: cpu: 200m memory: 200Mi nodeSelector: # 节点选择器(可选),指定 Pod 调度到符合条件的节点 disk: ssd tolerations: # 污点容忍(可选),允许 Pod 调度到带有特定污点的节点 - key: "node-role.kubernetes.io/master" operator: "Exists" effect: "NoSchedule" updateStrategy: # 更新策略(可选,默认 RollingUpdate) type: RollingUpdate rollingUpdate: maxUnavailable: 1 # 滚动更新时允许的最大不可用 Pod 数 minReadySeconds: 30 # 等待 Pod 就绪的最短时间(可选)
DaemonSet实战
# 定义资源清单文件 [root@master01 ~/daemonset]# cat daemonset-nginx.yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: nginx-daemonset namespace: default labels: app: nginx spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 hostPort: 30280 # 创建daemonset资源 [root@master01 ~/daemonset]# kubectl apply -f daemonset-nginx.yaml daemonset.apps/nginx-daemonset created
查看daemonset资源
# 查看daemonset资源 [root@master01 ~/daemonset]# kubectl get ds NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE nginx-daemonset 2 2 0 2 0 <none> 5s # 查看pod,发现调度到node01和node02节点上 [root@master01 ~/daemonset]# kubectl get po -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-daemonset-bwgdw 1/1 Running 0 115s 100.95.185.254 node02 <none> <none> nginx-daemonset-dtpw2 1/1 Running 0 115s 100.117.144.153 node01 <none> <none>
为什么master节点上没有调度?
因为master节点上默认存在一个污点,而上面的案例中没有配置污点容忍,所以没有调度过去
# 查看污点 [root@master01 ~/daemonset]# kubectl describe node master01 | grep -i taint Taints: node-role.kubernetes.io/control-plane:NoSchedule
如果需要调度到master节点,需要做污点容忍。
关于污点和污点容忍学习可以阅读这篇文章:K8s中的污点和容忍
示例:
[root@master01 ~/daemonset]# cat daemonset-nginx.yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: nginx-daemonset namespace: default labels: app: nginx spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: # 污点容忍 tolerations: - key: "node-role.kubernetes.io/control-plane" operator: "Exists" effect: "NoSchedule" containers: - name: nginx image: nginx:1.25.3 ports: - containerPort: 80 hostPort: 30280 # 创建daemonset资源 [root@master01 ~/daemonset]# kubectl apply -f daemonset-nginx.yaml daemonset.apps/nginx-daemonset configured
查看一下
[root@master01 ~/daemonset]# kubectl get ds NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE nginx-daemonset 3 3 2 1 2 <none> 9m58s # 查看pod,发现master节点也已经调度上了 [root@master01 ~/daemonset]# kubectl get po -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-daemonset-2pzdk 1/1 Running 0 102s 100.85.170.132 master01 <none> <none> nginx-daemonset-dtpw2 1/1 Running 0 11m 100.117.144.153 node01 <none> <none> nginx-daemonset-fr4dr 0/1 ContainerCreating 0 88s <none> node02 <none> <none>
daemonset资源的管理
查看DaemonSet
语法:
kubectl get daemonset <daemonset-name>
删除DaemonSet
kubectl delete daemonset <daemonset-name>
更新DaemonSet
Damonset资源的更新、回滚策略和Deployment是一样的,可以参考这篇文章:K8s进阶之Deployment的更新&回滚
1、使用kubectl edit命令更新
2、使用对应的资源清单文件进行更新
3、快速更新镜像:
# 语法 kubectl set image daemonset <daemonset资源> <pod-名称>=<镜像>:<镜像tag> # 示例 kubectl set image daemonset/example-daemonset agent=agent:v2
4、快速回滚到上一个版本:
kubectl rollout undo daemonset/example-daemonset