【Kubernetes】Daemon 使用

104 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情

一、 DaemonSet 简介

DaemonSet 资源对象可以保证 Kubernetes 集群中所有或部分 Node 都只能够运行一份 Pod 副本实例。当有新的 Node 加入集群时,kubernetes 将会在新 Node 上创建新的 Pod 副本;如果有 Node 被集群移除,节点上对应的 Pod 也会被清除。

  • DaemonSet的作用:在每个 Node 上都调度一个 Pod

  • DaemonSet解决了:如何同时在集群中的所有节点上提供基础服务和守护进程

DaemonSet 会管理所有 Node 上的 Pod 副本,保持集群中的 PodNode 为一一对应的关系,同时也负责对它们进行更新和删除。

DaemonSet 类似于计算机中的守护进程,运行集群中必备的基础服务,常见的用法如下:

  • 集群存储:比如 GlusterFS 存储、Ceph 存储等
  • 日志收集:比如 FluentdLogstash
  • 性能监控:用于采集 Node 的运行数据,比如 Prometheus Node ExportercollectdNew Relic agentGanglia gmond
  • 系统程序:比如 kube-proxykube-dnsglusterdceph

(1)举个栗子

需求: 在每个 Node 节点都运行一个 fluentd 容器,并且每个容器都需要挂载物理机的两个目录 /var/log/var/lib/docker/containers

  1. 创建文件 fluentd-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-cloud-logging
  namespace: kube-system
spec:
  selector:
    matchLabels:
      k8s-app: fluentd-cloud-logging
  template:
    metadata:
      namespace: kube-system
      labels:
        k8s-app: fluentd-cloud-logging
    spec:
      containers:
        - name: fluentd-cloud-logging
          image: registry-vpc.cn-hangzhou.aliyuncs.com/chenshi-kubernetes/fluentd-elasticsearch:1.17
          resources:
            limits:
              cpu: 100m
              memory: 200Mi
          env:
            - name: FLUENTD_ARGS
              value: -q
          volumeMounts:
            - name: varlog
              mountPath: /var/log
              readOnly: false
            - name: containers
              mountPath: /var/lib/docker/containers
              readOnly: false
      volumes:
        - name: varlog
          hostPath:
            path: /var/log
        - name: containers
          hostPath:
            path: /var/lib/docker/containers
  1. 执行创建
$ kubectl create -f fluentd-ds.yaml
daemonset.apps/fluentd-cloud-logging created
  1. 查看创建好的 DaemonSetPod
$ kubectl get daemonset -n kube-system
NAME                    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                 AGE
fluentd-cloud-logging   2         2         2       2            2           <none>                        63s
  1. 创建 fluentd-cloud
# 分别在 kube-node-1 和 kube-node-2 两个节点上创建了一个 fluentd-cloud Pod
$ kubectl get pods -n kube-system -o wide|grep fluentd-cloud-logging
  1. 执行删除
$ kubectl delete daemonsets.app fluentd-cloud-logging -n kube-system
daemonset.apps "fluentd-cloud-logging" deleted

# 也可以通过 YAML 文件删除
$ kubectl delete -f fluentd-ds.yaml
daemonset.apps/fluentd-cloud-logging deleted



二、滚动更新

DaemonSet 可以使用字段 spec.updateStrategy.type 设置更新策略,目前支持两种策略:

  • RolingUpdate:更新 DaemonSet 模板后,自动删除旧的 Pod 并创建新的 Pod
  • OnDelete:默认策略,更新 DaemonSet 模板后,只有手动删除了旧的 Pod 才会创建新的 Pod

在使用 RolingUpdate 策略时,还可以设置字段:

  • spec.updateStrategy.rollingUpdate.maxUnavailable,默认值为 1
  • spec.minReadySeconds,默认值为 0

具体的设置信息可以如下所示:

---
spec:
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 2
  minReadySeconds: 30