一、 DaemonSet 概述
     DaemonSet 控制器能够确保 k8s 集群所有的节点都运行一个相同的 pod 副本,当向 k8s 集群中增加 node 节点时,这个 node 节点也会自动创建一个 pod 副本,当 node 节点从 集群移除,这些 pod 也会自动删除;删除 Daemonset 也会删除它们创建的 pod

DaemonSet 工作原理

 daemonset 的控制器会监听 kuberntes 的 daemonset 对象、pod 对象、node 对象,这些被监听的对象之变动,就会触发 syncLoop 循环让 kubernetes 集群朝着 daemonset 对象描述的状态进行演进。

Daemonset 典型的应用场景

在集群的每个节点上运行存储,比如:glusterd 或 ceph。 在每个节点上运行日志收集组件,比如:flunentd 、 logstash、filebeat 等。 在每个节点上运行监控组件,比如:Prometheus、 Node Exporter 、collectd 等。

DaemonSet 与 Deployment 的区别

Deployment 部署的副本 Pod 会分布在各个 Node 上,每个 Node 都可能运行好几个副本。

DaemonSet 的不同之处在于:每个 Node 上最多只能运行一个副本。

二、DaemonSet 资源清单文件编写技巧

[root@k8s-master01 ~]# kubectl explain ds 
  • 字段作用
    apiVersion当前资源使用的 api 版本,跟 VERSION: apps/v1 保持 一致
    kind资源类型,跟 KIND: DaemonSet 保持一致
    metadata元数据,定义 DaemonSet 名字的
    spec定义容器的
    status状态信息,不能改
[root@k8s-master01 ~]# kubectl  explain ds.spec

[root@k8s-master01 ~]# kubectl  explain ds.spec.template

清单模版

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: pod-controller                      # ds名称                      
  labels:                                   # 给ds打标签
    controller: daemonset
spec:
  revisionHistoryLimit: 3                   # 保留历史版本数量,默认为10
  updateStrategy:                           # Pod更新策略,默认是RollingUpdate
    type: RollingUpdate                     # 滚动更新策略。另一种是OnDelete,其没有子属性配置参数 
    rollingUpdate:                          # 当type为RollingUpdate的时候生效,为其配置参数
      maxSurge: 25%                         # 升级过程中可以超过期望的Pod的最大数量,可以为百分比,也可以为整数。默认是25%
      maxUnavailable: 25%                   # 升级过程中最大不可用状态的Pod数量,可以为百分比,也可以为整数。默认是25%
  selector:                                 # 选择器,通过该控制器管理哪些pod
    matchLabels:                            # Labels匹配规则。和matchExpressions类似
      app: nginx-pod                        ###或者
    matchExpressions:                     # Expressions匹配规则。和matchLabels类似 
      - {key: app, operator: 'In', values: ["nginx-pod"]} 
  template:                                 # pod副本创建模板。属性和Pod的属性一样
     metadata:
       labels:
         app: nginx-pod
     spec:
       containers:
         - name: nginx
           image: nginx:latest
           ports:
             - name: nginx-port
               containerPort: 80
               protocol: TCP

三、DaemonSet 使用案例

[root@k8s-master01 ~]# cat pod-controller.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: pod-controller
  labels:
    controller: daemonset
spec:
  selector:
    matchLabels:
      app: nginx-pod
  template:
     metadata:
       labels:
         app: nginx-pod
     spec:
       containers:
         - name: nginx
           image: nginx:latest
           ports:
             - name: nginx-port
               containerPort: 80
               protocol: TCP 
##查看
[root@k8s-master01 ~]# kubectl apply -f pod-controller.yaml 
daemonset.apps/pod-controller created

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐