23、DaemonSet-控制器

发布时间 2023-03-22 21:14:24作者: 小粉优化大师

1、基础知识

1.1、简介

DaemonSet能够让所有(或者特定)的节点"精确的"运行同一个pod,它一般应用在集群环境中所有节点都必
须运行的守护进程的场景。
我们在部署k8s环境的时候,网络的部署样式就是基于这种DaemonSet的方式,因为对于网络来说,是所有节
点都必须具备的基本能力,而且不能随意中断,否则的话,节点上的容器通信就会出现问题。

1.2、常用的场景-flannel为例

master1 ~]# kubectl -n kube-system get ds
NAME              DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
kube-flannel-ds   5         5         5       5            5           <none>                   5d1h
kube-proxy        5         5         5       5            5           kubernetes.io/os=linux   5d1h

master1 ~]# cat flannel/kube-flannel.yml
apiVersion: apps/v1
kind: DaemonSet

1.3、daemonset常用的服务

当节点加入到K8S集群中,pod会被(DaemonSet)调度到该节点上运行,当节点从K8S集群中被移除,
被DaemonSet调度的pod会被移除,如果删除DaemonSet,所有跟这个DaemonSet相关的pods都会被删
除。
   在某种程度上,DaemonSet承担了RC的部分功能,它也能保证相关pods持续运行,如果一个
DaemonSet的Pod被杀死、停止、或者崩溃,那么DaemonSet将会重新创建一个新的副本在这台计算节点上。
    
常用于后台支撑服务
 集群存储守护进程,如:glusterd,ceph
 日志收集服务,如:fluentd,logstash
 监控服务,如:Prometheus,collectd

1.4、DaemonSet流程图

1.5、资源清单解析

apiVersion: apps/v1 # API群组及版本
kind: DaemonSet     # 资源类型特有标识
metadata:
  name <string>      # 资源名称,在作用域中要唯一
  namespace <string> # 名称空间;DaemonSet资源隶属名称空间级别
spec:
  minReadySeconds <integer>  # Pod就绪后多少秒内任一容器无crash方可视为“就绪”
  selector <object>  # 标签选择器,必须匹配template字段中Pod模板中的标签
  template <object>  # Pod模板对象;
  revisionHistoryLimit <integer> # 滚动更新历史记录数量,默认为10;
  updateStrategy <Object>        # 滚动更新策略
    type <string>                # 滚动更新类型,可用值有OnDelete和
RollingUpdate;
  rollingUpdate <Object>     # 滚动更新参数,专用于RollingUpdate类型
    maxUnavailable <string>  # 更新期间可比期望的Pod数量缺少的数量或比例

2、实践1-DaemonSet

2.1、需求

之前我们在Node上启动Pod需要在RC中指定replicas的副本数的值,有些情况下,我们需要在所有节点都运行一个Pod,
因为Node数量会变化,所以Pod的副本数使用RC来指定就不合适了,这个时候Daemon Sets就派上了用场。
简单来说,Daemon Sets就是让一个pod在所有的k8s集群节点上都运行一个。

2.2、定义资源清单

cat >daemonset-test.yml<<'EOF'
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-test
spec:
  selector:
    matchLabels:
      app: pod-test
  template:
    metadata:
      labels:
        app: pod-test
    spec:
      containers:
      - name: pod-test
        image: 192.168.10.33:80/k8s/pod_test:v0.2
EOF

2.2.1、应用资源清单

master1 ]# kubectl apply -f daemonset-test.yml 

master1 ]# kubectl get ds
NAME             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset-test   2         2         2       2            2           <none>          3s

master1 ]# kubectl get pods -o wide
NAME                   READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
daemonset-test-mhj5l   1/1     Running   0          15s   10.244.3.145   node1   <none>           <none>
daemonset-test-nzjbg   1/1     Running   0          15s   10.244.4.86    node2   <none>           <none>

2.3、DaemonSet对象也支持滚动更新

master1 ]# kubectl set image daemonsets daemonset-test pod-test='192.168.10.33:80/k8s/pod_test:v0.1' &&\
kubectl rollout status daemonset daemonset-test daemonset.apps/daemonset-test image updated Waiting for daemon set "daemonset-test" rollout to finish: 0 out of 2 new pods have been updated... Waiting for daemon set "daemonset-test" rollout to finish: 0 out of 2 new pods have been updated... Waiting for daemon set "daemonset-test" rollout to finish: 1 out of 2 new pods have been updated... Waiting for daemon set "daemonset-test" rollout to finish: 1 out of 2 new pods have been updated... Waiting for daemon set "daemonset-test" rollout to finish: 1 out of 2 new pods have been updated... Waiting for daemon set "daemonset-test" rollout to finish: 1 of 2 updated pods are available... daemon set "daemonset-test" successfully rolled out

3、实践2-node-exporter所有节点上都部署采集数据的功能

3.1、定义资源配置清单

cat > prometheus-node-exporter.yml<<'EOF'
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-demo
  namespace: default
  labels:
    app: prometheus
    component: node-exporter
spec:
  selector:
    matchLabels:
      app: prometheus
      component: node-exporter
  template:
    metadata:
      name: prometheus-node-exporter
      labels:
        app: prometheus
        component: node-exporter
    spec:
      containers:
      - image: 192.168.10.33:80/k8s/node-exporter:v1.2.2
        name: prometheus-node-exporter
        ports:
        - name: prom-node-exp
          containerPort: 9100
          hostPort: 9100
        livenessProbe:
          tcpSocket:
            port: prom-node-exp
          initialDelaySeconds: 3
        readinessProbe:
          httpGet:
            path: '/metrics'
            port: prom-node-exp
            scheme: HTTP
          initialDelaySeconds: 5
      hostNetwork: true
      hostPID: true
EOF

3.2、应用资源清单

master1 ]# kubectl apply -f prometheus-node-exporter.yml 
daemonset.apps/daemonset-demo created


master1 ]# kubectl get ds
NAME             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset-demo   2         2         0       2            0           <none>          3s


master1 ]# kubectl get pods -o wide
NAME                   READY   STATUS    RESTARTS   AGE   IP              NODE    NOMINATED NODE   READINESS GATES
daemonset-demo-c9ckn   1/1     Running   0          12s   192.168.10.30   node2   <none>           <none>
daemonset-demo-wcklf   1/1     Running   0          12s   192.168.10.29   node1   <none>           <none>


# 测试访问是否正常
master1 ]# curl -I  192.168.10.30:9100/metrics
HTTP/1.1 200 OK
Content-Type: text/plain; version=0.0.4; charset=utf-8
Date: Tue, 21 Mar 2023 14:51:51 GMT

master1 ]# curl -I  192.168.10.29:9100/metrics
HTTP/1.1 200 OK
Content-Type: text/plain; version=0.0.4; charset=utf-8
Date: Tue, 21 Mar 2023 14:51:58 GMT