DaemonSet控制器

百度网盘链接:https://pan.baidu.com/s/15t_TSH5RRpCFXV-93JHpNw?pwd=8od3  提取码:8od3

14 DaemonSet控制器

14.1 DaemonSet概述

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

14.1.1 DaemonSet工作原理

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

14.1.2 Daemonset典型的应用场景

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

14.1.3 DaemonSet 与 Deployment 的区别

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

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

14.2 DaemonSet资源清单文件编写技巧

14.2.1 查看定义Daemonset资源需要的字段有哪些?

[root@master1 ~]# kubectl explain ds

KIND:     DaemonSet

VERSION:  apps/v1

FIELDS:

   apiVersion  <string>   #当前资源使用的api版本,跟VERSION:  apps/v1保持一致

   kind   <string>        #资源类型,跟KIND:  DaemonSet保持一致

   metadata    <Object>   #元数据,定义DaemonSet名字的

   spec   <Object>        #定义容器的

   status <Object>        #状态信息,不能改

14.2.2 查看DaemonSet的spec字段如何定义?

[root@master1 ~]# kubectl explain ds.spec

KIND:     DaemonSet

VERSION:  apps/v1

RESOURCE: spec <Object>

FIELDS:

   minReadySeconds <integer>   #当新的pod启动几秒种后,再kill掉旧的pod。

   revisionHistoryLimit <integer> #历史版本

   selector    <Object> -required-  #用于匹配pod的标签选择器

   template    <Object> -required- #定义Pod的模板,基于这个模板定义的所有pod是一样的

   updateStrategy  <Object> #daemonset的升级策略

14.2.3 查看DaemonSet的spec.template字段如何定义?

[root@master1 ~]# kubectl explain ds.spec.template

KIND:     DaemonSet

VERSION:  apps/v1

RESOURCE: template <Object>

FIELDS:

   metadata    <Object>

   spec<Object>

14.3 DaemonSet使用案例

14.3.1 部署日志收集组件fluentd

[root@master1 ~]# vim 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:

      - key: node-role.kubernetes.io/control-plane

        effect: NoSchedule

      containers:

      - name: fluentd-elasticsearch

        image: fluentd:latest

        imagePullPolicy: IfNotPresent

        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

[root@master1 ~]# kubectl apply -f daemonset.yaml

[root@master1 ~]# kubectl get ds -n kube-system

NAME                    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE

fluentd-elasticsearch   3         3         3       3            3                   

[root@master1 ~]# kubectl get pods -n kube-system -o wide

通过上面可以看到在k8s的三个节点均创建了fluentd这个pod,pod的名字是由控制器的名字-随机数组成的。

14.4 Daemonset管理pod

14.4.1 DaemonSet实现pod的滚动更新

[root@master1 ~]# kubectl explain ds.spec.updateStrategy    //查看daemonset的滚动更新策略

KIND:     DaemonSet

VERSION:  apps/v1

RESOURCE: updateStrategy <Object>

FIELDS:

   rollingUpdate   <Object>

   type   <string>

[root@master1 ~]# kubectl explain ds.spec.updateStrategy.rollingUpdate    //查看支持的更新策略

KIND:     DaemonSet

VERSION:  apps/v1

RESOURCE: rollingUpdate <Object>

FIELDS:

   maxUnavailable  <string>

上面表示rollingUpdate更新策略只支持maxUnavailabe,先删除在更新;因为我们不支持一个节点运行两个pod,因此需要先删除一个,在更新一个。

更新镜像版本,可以按照如下方法:

[root@master1 ~]# kubectl set image daemonsets fluentd-elasticsearch fluentd-elasticsearch=ikubernetes/filebeat:5.6.6-alpine -n kube-system

posted @ 2022-12-27 00:52  Krill_ss  阅读(37)  评论(0编辑  收藏  举报