静轾 发表于 2025-6-3 00:18:56

K8s新手系列之DaemonSet资源

概述

官网文档: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实战

# 定义资源清单文件
# 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资源
# kubectl apply -f daemonset-nginx.yaml
daemonset.apps/nginx-daemonset created查看daemonset资源
# 查看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节点上
# 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节点上默认存在一个污点,而上面的案例中没有配置污点容忍,所以没有调度过去
# 查看污点
# kubectl describe node master01 | grep -i taint
Taints:             node-role.kubernetes.io/control-plane:NoSchedule如果需要调度到master节点,需要做污点容忍。
关于污点和污点容忍学习可以阅读这篇文章:K8s中的污点和容忍
示例:
# 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资源
# kubectl apply -f daemonset-nginx.yaml
daemonset.apps/nginx-daemonset configured查看一下
# 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节点也已经调度上了
# 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:v24、快速回滚到上一个版本:
kubectl rollout undo daemonset/example-daemonset
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: K8s新手系列之DaemonSet资源