一、DaemonSet 控制器

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


使用DaemonSet控制器创建的pod,它会确保k8s集群中每一个节点都会有由DaemonSet控制器创建的且完全一样的pod,包括控制节点也会创建同样的pod出来。

1.1 DaemonSet 控制器与deploymen的区别

deployment控制器管理的pod,在不与控制节点定义容忍度的情况下,默认pod副本只能调度到工作节点上,如一个控制节点一个工作节点的情况下,那么所有的pod都将会调度到工作节点。与deploymen控制器不同的DaemonSet控制器则每个node节点只能运行一个pod副本。 

 

可以通过如下命令进行查看字段信息:  kubectl explain daemonset   (daemonset可简写为ds) 如下图所示:

k8s中的DaemonSet控制器介绍及使用该控制器进行pod的滚动更新_k8s 控制器

二、DaemonSet 编写yaml文件

需要在控制节点及工作节点准备一个fluentd镜像,可以使用docker pull fluentd进行下载或者通过别的方式获得。

在test命名空间创建一个由DaemonSet控制器管理的pod

#创建命名空间
[root@k8s-master ~]# kubectl create ns test
namespace/test created


#编写yaml文件
[root@k8s-master ~]# vim daemonset.yaml 


apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset           #定义控制器名称
  namespace: test           #定义命名空间,将控制器在该命名空间创建
  labels:                   #定于控制器标签
    app: daemon
spec:
  selector:                 #定义标签选择器
    matchLabels:            #定义匹配模板的标签,与模板的标签要一致
      pod01: pod02
  template:                 #定义pod模板
    metadata:
      labels:               #定义模板标签
        pod01: pod02
    spec:
      tolerations:          #定义node容忍度(定义控制节点的),默认控制节点自带污点,工作节点不带污点,因为使用该控制器创建pod会在控制节点上也创建相同的pod,所以需要定义容忍度。
      - key: node-role.kubernetes.io/control-plane   #填写控制节点的当前污点,写':'冒号前的那一段(通过该命令查看:kubectl describe node +控制节点名称 | grep -i taints)  
        effect: NoSchedule  #填写当前控制节点的排斥等级,写:冒号后的那一段(查看方法如上一致)
      containers:           #定义容器的运行信息
      - name: my-fluentd
        image: fluentd
        imagePullPolicy: IfNotPresent
        resources:          #定义容器配额信息
          requests:         #定义pod在node节点创建时的请求最小资源配额
            cpu: 100m
            memory: 300Mi
          limits:           #定义pod在node节点创建后的最大使用资源配额
            cpu: 100m
            memory: 300Mi
        volumeMounts:       #定义容器内的卷挂载
        - name: my-volumes001  #定义挂载哪一个存储卷(要与下方定义的存储卷的名称进行匹配)
          mountPath: /test001  #将匹配到的存储卷挂载到容器的该路径下
        - name: my-volumes002
          mountPath: /test002
      volumes:              #定义存储卷
      - name: my-volumes001 #定义第一个卷
        hostPath:           #定义宿主机的该路径为存储卷挂载到容器内
          path: /var/log
      - name: my-volumes002 #定义第二个卷
        hostPath:
          path: /var/log/containers


#创建
[root@k8s-master ~]# kubectl apply -f daemonset.yaml 
daemonset.apps/daemonset created

[root@k8s-master ~]# kubectl get pods -n test 
NAME              READY   STATUS    RESTARTS   AGE
daemonset-2p9dx   1/1     Running   0          9s
daemonset-2rm4x   1/1     Running   0          10s
daemonset-9zccg   1/1     Running   0          9s

#验证集群内三个node节点均创建了相同的pod
[root@k8s-master ~]# kubectl get pods -n test -owide
NAME              READY   STATUS    RESTARTS   AGE   IP               NODE          NOMINATED NODE   READINESS GATES
daemonset-2p9dx   1/1     Running   0          17s   10.244.194.68    k8s-worker1   <none>           <none>
daemonset-2rm4x   1/1     Running   0          18s   10.244.235.195   k8s-master    <none>           <none>
daemonset-9zccg   1/1     Running   0          17s   10.244.126.6     k8s-worker2   <none>           <none>

三、DaemonSet实现pod的滚动更新

daemonset的滚动更新可以通过如下命令进行查看相关字段信息:

kubectl explain ds.spec.updateStrategy

 

因为daemonset控制器管理的pod在node节点上只能创建一个,所以更新的话,它会自动的先删除在创建。

#更新pod需要更换镜像,修改配置文件镜像为httpd并指定端口进行访问测试更新是否成功,修改内容如下所示
[root@k8s-master ~]# cat daemonset.yaml | grep -A 5 containers:
      containers:           #定义容器的运行信息
      - name: my-fluentd
        image: httpd
        ports:
        - containerPort: 80
        imagePullPolicy: IfNotPresent
        
        
#创建更新
[root@k8s-master ~]# kubectl apply -f daemonset.yaml 
daemonset.apps/daemonset configured

#创建更新时动态查看pod状态信息
[root@k8s-master ~]# kubectl get pods -n test -w
NAME              READY   STATUS    RESTARTS   AGE
daemonset-2p9dx   1/1     Running   0          19m
daemonset-2rm4x   1/1     Running   0          19m
daemonset-9zccg   1/1     Running   0          19m            //三个pod更新前的状态都是running
daemonset-2rm4x   1/1     Terminating   0          19m        //开始更新,删除第一个节点上的pod
daemonset-2rm4x   1/1     Terminating   0          19m
daemonset-2rm4x   0/1     Terminating   0          19m
daemonset-2rm4x   0/1     Terminating   0          19m
daemonset-2rm4x   0/1     Terminating   0          19m
daemonset-ln6vl   0/1     Pending       0          0s
daemonset-ln6vl   0/1     Pending       0          0s
daemonset-ln6vl   0/1     ContainerCreating   0          0s   //删除后进行创建
daemonset-ln6vl   0/1     ContainerCreating   0          0s
daemonset-ln6vl   1/1     Running             0          2s   //创建完成 running
daemonset-2p9dx   1/1     Terminating         0          19m  //开始删除第二个节点的pod  如下以此类推直至三个都完成更新
daemonset-2p9dx   1/1     Terminating         0          19m
daemonset-2p9dx   0/1     Terminating         0          19m
daemonset-2p9dx   0/1     Terminating         0          19m
daemonset-2p9dx   0/1     Terminating         0          19m
daemonset-s6nlh   0/1     Pending             0          0s
daemonset-s6nlh   0/1     Pending             0          0s
daemonset-s6nlh   0/1     ContainerCreating   0          0s
daemonset-s6nlh   0/1     ContainerCreating   0          1s
daemonset-s6nlh   1/1     Running             0          2s
daemonset-9zccg   1/1     Terminating         0          19m
daemonset-9zccg   1/1     Terminating         0          20m
daemonset-9zccg   0/1     Terminating         0          20m
daemonset-9zccg   0/1     Terminating         0          20m
daemonset-9zccg   0/1     Terminating         0          20m
daemonset-4s2lx   0/1     Pending             0          0s
daemonset-4s2lx   0/1     Pending             0          0s
daemonset-4s2lx   0/1     ContainerCreating   0          0s
daemonset-4s2lx   0/1     ContainerCreating   0          1s
daemonset-4s2lx   1/1     Running             0          2s    

#完成后查看当前pod状态
[root@k8s-master ~]# kubectl get pods -n test -owide
NAME              READY   STATUS    RESTARTS   AGE   IP               NODE          NOMINATED NODE   READINESS GATES
daemonset-4s2lx   1/1     Running   0          17s   10.244.126.7     k8s-worker2   <none>           <none>
daemonset-ln6vl   1/1     Running   0          26s   10.244.235.196   k8s-master    <none>           <none>
daemonset-s6nlh   1/1     Running   0          22s   10.244.194.69    k8s-worker1   <none>           <none>

#验证是否更新完成,访问显示httpd的主页更新完成
[root@k8s-master ~]# curl 10.244.194.69:80
<html><body><h1>It works!</h1></body></html>