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实战

# 定义资源清单文件 [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 

发表评论

评论已关闭。

相关文章