千家信息网

Kubernetes 资源对象之DaemonSet

发表于:2024-11-20 作者:千家信息网编辑
千家信息网最后更新 2024年11月20日,DaemonSet是在Kubernetes1.2 版本新增的一种资源对象DaemonSet能够让所有(或者一些特定)的Node节点仅运行一份Pod。当节点加入到kubernetes集群中,Pod会被(
千家信息网最后更新 2024年11月20日Kubernetes 资源对象之DaemonSet

DaemonSet是在Kubernetes1.2 版本新增的一种资源对象

DaemonSet能够让所有(或者一些特定)的Node节点仅运行一份Pod。当节点加入到kubernetes集群中,Pod会被(DaemonSet)调度到该节点上运行,当节点从kubernetes集群中被移除,被(DaemonSet)调度的Pod会被移除,如果删除DaemonSet,所有跟这个DaemonSet相关的pods都会被删除。

在使用kubernetes来运行应用时,很多时候我们需要在一个区域(zone)或者所有Node上运行同一个守护进程(pod),例如如下场景:

  • 每个Node上运行一个分布式存储的守护进程,例如glusterd,ceph
  • 运行日志采集器在每个Node上,例如fluentd,logstash
  • 运行监控的采集端在每个Node,例如prometheus node exporter,collectd等

DaemonSet的Pod调度策略与RC很类似,除了使用系统内置的调度算法在每个Node上进行调度,也可以在Pod定义中使用NodeSelector或NodeAffinity来指定满足条件的Node范围进行调度

DaemonSet 资源文件格式

apiVersion: extensions/v1beta1kind: DaemonSet  metadata:

1.下面例子定义为在每个Node上都启动一个filebeat容器,其中挂载了宿主机目录"/var/log/messages"

$ vi k8s-log-filebeat.yamlapiVersion: v1kind: ConfigMap # 定义一个config文件内容metadata:  name: k8s-logs-filebeat-config  namespace: kube-systemdata:  # 填写filebeat读取日志相关信息  filebeat.yml: |-    filebeat.prospectors:      - type: log        paths:          - /messages        fields:          app: k8s          type: module        fields_under_root: true    output.logstash:      # specified logstash port (by default 5044)      hosts: ['10.0.0.100:5044']---apiVersion: apps/v1kind: DaemonSet  # DaemonSet 对象,保证在每个node节点运行一个副本metadata:  name: k8s-logs  namespace: kube-systemspec:  selector:    matchLabels:      project: k8s      app: filebeat  template:    metadata:      labels:        project: k8s        app: filebeat    spec:      containers:      - name: filebeat        image: docker.elastic.co/beats/filebeat:6.8.1        args: [          "-c", "/etc/filebeat.yml",          "-e",        ]        resources:          requests:            cpu: 100m            memory: 100Mi          limits:            cpu: 500m            memory: 500Mi        securityContext:          runAsUser: 0        # 进行实际挂载操作        volumeMounts:        # 将configmap里的配置挂载到 /etc/filebeat.yml 文件中        - name: filebeat-config          mountPath: /etc/filebeat.yml          subPath: filebeat.yml        # 将宿主机  /var/log/messages 路径挂载到 /messages中        - name: k8s-logs          mountPath: /messages      # 定义卷      volumes:      - name: k8s-logs        hostPath:          path: /var/log/messages          type: File      - name: filebeat-config        configMap:          name: k8s-logs-filebeat-config

2.使用kubectl create 命令创建该DeamonSet

$ kubectl create -f  k8s-log-filebeat.yamlconfigmap/k8s-logs-filebeat-config createddaemonset.apps/k8s-logs created

3.查看创建好的DeamonSet和Pod,可以看到在每个Node上都创建了一个Pod

$ kubectl get ds -n kube-system | grep "k8s-logs"NAME            DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                 AGEk8s-logs                  2         2         0       2            0                                   2m15s$ kubectl get pods -n kube-system -o wide | grep "k8s-logs"  k8s-logs-gw4bs                         0/1     Running   0          87s             k8s-node01                k8s-logs-p6r6t                         0/1     Running   0          87s             k8s-node02                

在kubernetes 1.6以后的版本中,DaemonSet也能执行滚动升级了,即在更新一个DaemonSet模板的时候,旧的Pod副本会被自动删除,同时新的Pod副本会被自动创建,此时DaemonSet的更新策略(updateStrategy)为RollingUpdate,如下:

apiVersion: apps/v1kind: DaemonSet metadata:  name: k8s-logs  namespace: kube-systemspec:  updateStrategy:    type: RollingUpdate

updateStrategy 的另外一个值是OnDelete,即只有当手工删除了DaemonSet创建的Pod副本,新的Pod副本才会被创建出来,如果不设置updateStrategy的值,则在kubernetes 1.6之后的版本中会被默认设置为RollingUpdate(滚动升级)。

0