kubernetes之DaemonSet以及滚动更新

打印 上一主题 下一主题

主题 914|帖子 914|积分 2742

1.什么是DaemonSet?

1.1DaemonSet是Pod控制器的又一种实现方式,用于在集群中的全部节点上同时运行一份指定的Pod资源副本,后续加入集群的节点也会自动创建一个相关的Pod对象,当从集群移除节点时,此类Pod对象也将被自动回收无需创建。管理员也可以使用"节点选择器"以及标签指定仅在部分具有特定特征的节点上运行指定的Pod对象。
1.2官方文档: https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/daemonset/
2.DaemonSet的用法


  • 在每个节点上运行集群存储守护进程,如glusterd或Ceph;
  • 在每个节点上运行日志收集守护进程,如fluentd、logstash;
  • 在每个节点上运行监控系统代理程序,如Prometheus Node Exporter;
  • 在每个节点上运行网络插件为Pod提供网络服务,如flannel、Calico;
  • 在每个节点上运行kube-Proxy通过API-Server持续监控各个Service及其关联的Pod对象,并将其创建或变动实时反应至当前节点相应的iptables、ipvs规则上;
3.DaemonSet资源规范

DaemonSet是标准的K8s资源类型,它在Spec字段中嵌套了Selector、Template和minReadySeconds,并且功能和用法基本相同,但它不支持使用Replicas,DaemonSet并不是基于期望的副本数来控制Pod资源数量,而是基于节点数量来控制Pod数量;
  1. apiVersion: apps/v1   # API群组及版本;
  2. kind: DaemonSet      # 资源类型;
  3. metadata:             # Pod元数据;
  4.    name:              # 资源名称,在作用域中要唯一;
  5.    namespace: <string>         # 名称空间,DaemonSet隶属名称空间级别;
  6. spec:
  7.   minReadySeconds: <integer>   # Pod就绪后多少秒内任一容器无Crash方可为就绪,来控制滚动更新的速度,默认值为0,表示新建的Pod对象一旦"就绪"将立即被视作可用,随后开始下一轮更新。如果设定了spec.minReadySeconds: 3表示新建的Pod对象至少要成功运行多久才会被视作可用,即就绪之后还要等待指定的3s才能开始下一批次的更新,在一个批次内新建的所有Pod就绪探测失败,都会导致滚动更新被终止,因此为minReadySeconds设定一个合理的值,不仅能够减缓更新的速度,还能够让Deployment提前发现一部分程序因为Bug导致的升级故障,生产环境中为Pod设置指针探测。
  8.   selector: <Object>           # 标签选择器,必须匹配template字段中Pod模板中的标签;
  9.   template: <Object>           # Pod模板对象;
  10.     metadata: <Object>         # Pod名称
  11.     spec: <Object>             # Pod详情
  12.   revisionHistoryLimit: <integer>  # 滚动更新历史记录数量,默认为10;
  13.   updateStrategy: <Object>               # 滚动更新策略;
  14.     type: <string>                 # 滚动更新类型,可用值有OnDelete和Rollingupdate;
  15.     rollingUpdate: <Object>       # 滚动更新参数,专用于RollingUpdate类型;
  16.       maxSurge: <string>           # 更新期间可比期望的Pod数量多出的数量和比例;
  17.       maxUnavailable: <string>     # 更新期间可比期望的Pod数量缺少的数量或比例;
  18.   
复制代码
4.DaemonSet部署Node_exporter示例

  1. # 示例配置文件
  2. root@kubernetes-master01:~# cat daemonSet-node_exporter.yaml
  3. apiVersion: apps/v1
  4. kind: DaemonSet
  5. metadata:
  6.   name: node-exporter
  7.   namespace: default
  8. spec:
  9.   selector:
  10.     matchLabels:
  11.       app: node-exporter
  12.   template:
  13.     metadata:
  14.       labels:
  15.         app: node-exporter
  16.     spec:
  17.       hostNetwork: true                    # 共享主机网络
  18.       hostPID: true                        # 获取主机的PID
  19.       containers:
  20.       - name: prometheus-node-exporter
  21.         image: prom/node-exporter:v0.18.0
  22.         ports:
  23.         - name: node-ex-http
  24.           containerPort: 9100
  25.           hostPort: 9100                  # 监听在节点的9100端口上面,节点的9100,实际就在访问这个Pod
  26.         livenessProbe:
  27.           tcpSocket:
  28.             port: node-ex-http
  29.           initialDelaySeconds: 5
  30.         readinessProbe:
  31.           httpGet:
  32.             path: '/metrics'
  33.             port: node-ex-http
  34.           initialDelaySeconds: 5
  35. root@kubernetes-master01:~# kubectl apply -f daemonSet-node_exporter.yaml
复制代码
4.1 查看Pod实例;
  1. root@kubernetes-master01:~# kubectl get pods -o wide -l app=node-exporter
  2. NAME                  READY   STATUS    RESTARTS   AGE   IP           NODE                NOMINATED NODE   READINESS GATES
  3. node-exporter-l7lfh   1/1     Running   0          55s   xx.0.0.xx   kubernetes-xxx    <none>            <none>
  4. node-exporter-qljd6   1/1     Running   0          55s   xx.0.0.xx   kubernetes-xxx    <none>            <none>
复制代码
4.2 describe命令查看详细信息;
  1. # DaemonSet也可以简写为ds;
  2. root@kubernetes-master01:~# kubectl get daemonset
  3. NAME            DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
  4. node-exporter   2         2         2       2            2           <none>          3m9s
  5. # describe查看详细信息;
  6. root@kubernetes-master01:~# kubectl describe ds node-exporter
  7. Name:           node-exporter
  8. Selector:       app=node-exporter
  9. Node-Selector:  <none>
  10. Labels:         <none>
  11. Annotations:    deprecated.daemonset.template.generation: 1
  12. Desired Number of Nodes Scheduled: 2   # 期望的Pod副本数
  13. Current Number of Nodes Scheduled: 2   #
  14. Number of Nodes Scheduled with Up-to-date Pods: 2
  15. Number of Nodes Scheduled with Available Pods: 2
  16. Number of Nodes Misscheduled: 0
  17. Pods Status:  2 Running / 0 Waiting / 0 Succeeded / 0 Failed
  18. Pod Template:   # 两个Pod都是Running
  19.   Labels:  app=node-exporter
  20.   Containers:
  21.    prometheus-node-exporter:
  22.     Image:        prom/node-exporter:v0.18.0  # Pod使用的镜像
  23.     Port:         9100/TCP                     # Pod的端口
  24.     Host Port:    9100/TCP                     #  开启了共享宿主机端口
  25.     Liveness:     tcp-socket :node-ex-http delay=5s timeout=1s period=10s #success=1 #failure=3        # 探针检测
  26.     Readiness:    http-get http://:node-ex-http/metrics delay=5s timeout=1s period=10s #success=1 #failure=3   # 探针检测
  27.     Environment:  <none>
  28.     Mounts:       <none>
  29.   Volumes:        <none>
  30. Events:     # 调度给两个节点
  31.   Type    Reason            Age    From                  Message
  32.   ----    ------            ----   ----                  -------
  33.   Normal  SuccessfulCreate  4m26s  daemonset-controller  Created pod: node-exporter-qljd6
  34.   Normal  SuccessfulCreate  4m26s  daemonset-controller  Created pod: node-exporter-l7lfh
复制代码
4.3 node_exporter默认监听在TCP的9100端口,可以向任意一节点发起请求也是没有问题;
  1. root@kubernetes-master01:~# curl -s xx.0.0.xx:9100/metrics | grep memory
  2. # HELP node_memory_Active_anon_bytes Memory information field Active_anon_bytes.
  3. # TYPE node_memory_Active_anon_bytes gauge
  4. node_memory_Active_anon_bytes 3.01551616e+08
  5. # HELP node_memory_Active_bytes Memory information field Active_bytes.
  6. # TYPE node_memory_Active_bytes gauge
  7. node_memory_Active_bytes 8.14239744e+08
  8. # HELP node_memory_Active_file_bytes Memory information field Active_file_bytes.
  9. # TYPE node_memory_Active_file_bytes gauge
  10. node_memory_Active_file_bytes 5.12688128e+08
  11. # HELP node_memory_AnonHugePages_bytes Memory information field AnonHugePages_bytes.
  12. # TYPE node_memory_AnonHugePages_bytes gauge
  13. node_memory_AnonHugePages_bytes 0
复制代码
5.DaemonSet更新方式

1.DaemonSet自1.16版本开始也支持滚动更新机制,相关配置定义在spec.update-Strategy嵌套字段中。目前它支持RollingUpdate(滚动更新)和OnDelete(删除式更新)两种更新策略。滚动更新为默认的更新策略。工作逻辑类似于Deployment控制,不过仅支持使用maxUnavailable属性定义最大不可用Pod资源的副本数(默认为1)而删除式更新的方式则是在删除相应节点的Pod资源后重建并更新为新版本;
5.1 RollingUpdate更新示例:
  1. # image: prom/node-exporter:v0.18.0修改为0.18.1
  2. root@kubernetes-master01:~# cat daemonset-node_exporter.yaml
  3. apiVersion: apps/v1
  4. kind: DaemonSet
  5. metadata:
  6.   name: node-exporter
  7.   namespace: default
  8. spec:
  9.   minReadySeconds: 3
  10.   revisionHistoryLimit: 20
  11.   updateStrategy:
  12.     type: RollingUpdate  # 更新策略
  13.     rollingUpdate:
  14.       maxUnavailable: 1
  15.   selector:
  16.     matchLabels:
  17.       app: node-exporter
  18.   template:
  19.     metadata:
  20.       labels:
  21.         app: node-exporter
  22.     spec:
  23.       hostNetwork: true                    # 共享主机网络
  24.       hostPID: true                        # 获取主机的PID
  25.       containers:
  26.       - name: prometheus-node-exporter
  27.         image: prom/node-exporter:v0.18.1
  28.         ports:
  29.         - name: node-ex-http
  30.           containerPort: 9100
  31.           hostPort: 9100                  # 监听在节点的9100端口上面,节点的9100,实际就在访问这个Pod
  32.         livenessProbe:
  33.           tcpSocket:
  34.             port: node-ex-http
  35.           initialDelaySeconds: 5
  36.         readinessProbe:
  37.           httpGet:
  38.             path: '/metrics'
  39.             port: node-ex-http
  40.           initialDelaySeconds: 5
复制代码
5.1.1执行滚动更新及状态;
  1. root@kubernetes-master01:~# kubectl apply -f daemonset-node_exporter.yaml  && kubectl rollout status daemonset node-exporter
  2. daemonset.apps/node-exporter configured
  3. Waiting for daemon set "node-exporter" rollout to finish: 0 out of 2 new pods have been updated...
  4. Waiting for daemon set "node-exporter" rollout to finish: 0 out of 2 new pods have been updated...
  5. Waiting for daemon set "node-exporter" rollout to finish: 0 out of 2 new pods have been updated...
  6. Waiting for daemon set "node-exporter" rollout to finish: 1 out of 2 new pods have been updated...
  7. Waiting for daemon set "node-exporter" rollout to finish: 1 out of 2 new pods have been updated...
  8. Waiting for daemon set "node-exporter" rollout to finish: 1 out of 2 new pods have been updated...
  9. Waiting for daemon set "node-exporter" rollout to finish: 1 out of 2 new pods have been updated...
  10. Waiting for daemon set "node-exporter" rollout to finish: 1 of 2 updated pods are available...
  11. Waiting for daemon set "node-exporter" rollout to finish: 1 of 2 updated pods are available...
  12. daemon set "node-exporter" successfully rolled out
复制代码
5.1.2默认的RollingUpdate策略将采用一次更新一个Pod对象,待新建的Pod对象就绪后,再更新下一个Pod对象,直到全部完成。可以看到镜像版本为v0.18.1
  1. root@kubernetes-master01:~# kubectl describe daemonsets.apps node-exporter
  2. Pod Template:
  3.   Labels:  app=node-exporter
  4.   Containers:
  5.    prometheus-node-exporter:
  6.     Image:        prom/node-exporter:v0.18.1  # 镜像版本已经为0.18.1
  7. Events:
  8.   Type    Reason            Age    From                  Message
  9.   ----    ------            ----   ----                  -------
  10.   Normal  SuccessfulCreate  46m    daemonset-controller  Created pod: node-exporter-qljd6
  11.   Normal  SuccessfulCreate  46m    daemonset-controller  Created pod: node-exporter-l7lfh
  12.   Normal  SuccessfulDelete  2m34s  daemonset-controller  Deleted pod: node-exporter-qljd6
  13.   Normal  SuccessfulCreate  2m32s  daemonset-controller  Created pod: node-exporter-q479h
  14.   Normal  SuccessfulDelete  2m21s  daemonset-controller  Deleted pod: node-exporter-l7lfh
  15.   Normal  SuccessfulCreate  2m11s  daemonset-controller  Created pod: node-exporter-8c2mr
复制代码
5.2 OnDelete更新示例:
  1. # 修改镜像版本为latest
  2. root@kubernetes-master01:~# cat daemonset-node_exporter.yaml
  3. apiVersion: apps/v1
  4. kind: DaemonSet
  5. metadata:
  6.   name: node-exporter
  7.   namespace: default
  8. spec:
  9.   minReadySeconds: 3
  10.   revisionHistoryLimit: 10
  11.   updateStrategy:      # 滚动更新策略
  12.     type: OnDelete     #  使用OnDelete
  13.     rollingUpdate:
  14.       maxUnavailable: 1
  15.   selector:
  16.     matchLabels:
  17.       app: node-exporter
  18.   template:
  19.     metadata:
  20.       labels:
  21.         app: node-exporter
  22.     spec:
  23.       hostNetwork: true                    # 共享主机网络
  24.       hostPID: true                        # 获取主机的PID
  25.       containers:
  26.       - name: prometheus-node-exporter
  27.         image: prom/node-exporter:latest  # 修改镜像版本为latest。
  28.         ports:
  29.         - name: node-ex-http
  30.           containerPort: 9100
  31.           hostPort: 9100                  # 监听在节点的9100端口上面,节点的9100,实际就在访问这个Pod
  32.         livenessProbe:
  33.           tcpSocket:
  34.             port: node-ex-http
  35.           initialDelaySeconds: 5
  36.         readinessProbe:
  37.           httpGet:
  38.             path: '/metrics'
  39.             port: node-ex-http
  40.           initialDelaySeconds: 5
复制代码
5.2.1 由于OnDelete并非自动完成升级,它需要管理员手动去删除Pod,然后重新拉起新的Pod,才能完成更新。(对于升级有着先后顺序的软件,这种方法非常有用;)
5.2.2删除Pod;
  1. root@kubernetes-master01:~# kubectl delete pods node-exporter-8c2mr
  2. pod "node-exporter-8c2mr" deleted
  3. root@kubernetes-master01:~# kubectl delete pods node-exporter-q479h
  4. pod "node-exporter-q479h" deleted
复制代码
5.2.3查看Pod已经被拉起;
  1. root@kubernetes-master01:~# kubectl get pods -l app=node-exporter
  2. NAME                  READY   STATUS    RESTARTS   AGE
  3. node-exporter-fbmkv   1/1     Running   0          99s
  4. node-exporter-hv69b   1/1     Running   0          85s
复制代码
5.2.4查看Events和版本,已经升级为latest;
  1. root@kubernetes-master01:~# kubectl describe ds node-exporter
  2. Name:           node-exporter
  3. Selector:       app=node-exporter
  4. Node-Selector:  <none>
  5. Labels:         <none>
  6. Annotations:    deprecated.daemonset.template.generation: 3
  7. Desired Number of Nodes Scheduled: 2
  8. Current Number of Nodes Scheduled: 2
  9. Number of Nodes Scheduled with Up-to-date Pods: 2
  10. Number of Nodes Scheduled with Available Pods: 2
  11. Number of Nodes Misscheduled: 0
  12. Pods Status:  2 Running / 0 Waiting / 0 Succeeded / 0 Failed
  13. Pod Template:
  14.   Labels:  app=node-exporter
  15.   Containers:
  16.    prometheus-node-exporter:
  17.     Image:        prom/node-exporter:latest
  18.     Port:         9100/TCP
  19.     Host Port:    9100/TCP
  20.     Liveness:     tcp-socket :node-ex-http delay=5s timeout=1s period=10s #success=1 #failure=3
  21.     Readiness:    http-get http://:node-ex-http/metrics delay=5s timeout=1s period=10s #success=1 #failure=3
  22.     Environment:  <none>
  23.     Mounts:       <none>
  24.   Volumes:        <none>
  25. Events:
  26.   Type    Reason            Age    From                  Message
  27.   ----    ------            ----   ----                  -------
  28.   Normal  SuccessfulCreate  3m31s  daemonset-controller  Created pod: node-exporter-fbmkv
  29.   Normal  SuccessfulCreate  3m17s  daemonset-controller  Created pod: node-exporter-hv69b
  30. root@kubernetes-master01:~# kubectl get pods node-exporter-fbmkv  -o yaml
  31. - containerID: docker://03e895265b19f82b3086c3bd7c013f7fa5edea96551a669aac164b92ea2e26b5
  32.     image: prom/node-exporter:latest
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

乌市泽哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表