Kubernetes——DaemonSet 控制器
DaemonSet 控制器
DaemonSet 是 Pod 控制器的又一种实现,用于在集群中的全部节点上同时运行一份指定的 Pod 资源副本,后续新加入集群的工作节点也会自动创建一个相关的 Pod 对象,当从集群移除节点时,此类 Pod 对象也将被自动回收而无须重建。管理员也可以使用节点选择器及节点标签指定仅在部分具有特定特征的节点上运行指定的 Pod 对象。
DaemonSet 是一种特殊的控制器,它有特定的应用场景,通常运行那些执行系统级操作任务的应用,其应用场景具体如下:
-
- 运行集群存储的守护进程,如在各个节点上运行 glusterd 或 ceph。
- 在各个节点上运行日志收集守护进程,如 fluentd 或 logstash。
- 在各个节点上运行监控系统的代理守护进程,如 Prometheus Node Exporter、collectd、Datadog agent、New Relic agent 或 Ganglia gmond 等。
一、创建 DaemonSet 资源对象
DaemonSet 控制器的 spec 字段中嵌套使用的字段同样主要包了前面讲到的 Pod 控制器资源支持的 selector、template 和 minReadySeconds,并且功能和用法基本相同,但它不支持使用 replicas,毕竟 DaemonSet 并不是基于期望的副本数来控制 Pod 资源数量,而是基于节点数量,但 template 是必选字段。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | kind: DaemonSet apiVersion: apps /v1 metadata: name: fluent-bit namespace: kubesphere-logging-system labels: app.kubernetes.io /name : fluent-bit annotations: deprecated.daemonset.template.generation: '1' spec: selector: matchLabels: app.kubernetes.io /name : fluent-bit template: metadata: name: fluent-bit namespace: kubesphere-logging-system creationTimestamp: null labels: app.kubernetes.io /name : fluent-bit spec: volumes: - name: varlibcontainers hostPath: path: /var/lib/docker/containers type : '' - name: config secret: secretName: fluent-bit-config defaultMode: 420 - name: varlogs hostPath: path: /var/log type : '' - name: systemd hostPath: path: /var/log/journal type : '' - name: positions emptyDir: {} containers: - name: fluent-bit image: 'registry.cn-beijing.aliyuncs.com/kubesphereio/fluent-bit:v1.6.9' ports: - name: metrics containerPort: 2020 protocol: TCP env : - name: NODE_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: spec.nodeName resources: {} volumeMounts: - name: varlibcontainers readOnly: true mountPath: /var/lib/docker/containers - name: config readOnly: true mountPath: /fluent-bit/config - name: varlogs readOnly: true mountPath: /var/log/ - name: systemd readOnly: true mountPath: /var/log/journal - name: positions mountPath: /fluent-bit/tail terminationMessagePath: /dev/termination-log terminationMessagePolicy: File imagePullPolicy: IfNotPresent restartPolicy: Always terminationGracePeriodSeconds: 30 dnsPolicy: ClusterFirst serviceAccountName: fluent-bit serviceAccount: fluent-bit securityContext: {} affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-role.kubernetes.io /edge operator: DoesNotExist schedulerName: default-scheduler tolerations: - operator: Exists updateStrategy: type : RollingUpdate rollingUpdate: maxUnavailable: 1 revisionHistoryLimit: 10 |
与其他资源对象相同,用户也可以使用 "kubectl describe" 命令查看 DaemonSet 对象的详细信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | [root@mh-k8s-master-prd-243-24 ~] # kubectl get ds -n kubesphere-logging-system NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE fluent-bit 16 16 16 16 16 <none> 69d [root@mh-k8s-master-prd-243-24 ~] # kubectl describe daemonsets fluent-bit -n kubesphere-logging-system Name: fluent-bit Selector: app.kubernetes.io /name =fluent-bit Node-Selector: <none> Labels: app.kubernetes.io /name =fluent-bit Annotations: deprecated.daemonset.template.generation: 1 Desired Number of Nodes Scheduled: 16 Current Number of Nodes Scheduled: 16 Number of Nodes Scheduled with Up-to- date Pods: 16 Number of Nodes Scheduled with Available Pods: 16 Number of Nodes Misscheduled: 0 Pods Status: 16 Running / 0 Waiting / 0 Succeeded / 0 Failed Pod Template: Labels: app.kubernetes.io /name =fluent-bit Service Account: fluent-bit Containers: fluent-bit: Image: registry.cn-beijing.aliyuncs.com /kubesphereio/fluent-bit :v1.6.9 Port: 2020 /TCP Host Port: 0 /TCP Environment: NODE_NAME: (v1:spec.nodeName) Mounts: /fluent-bit/config from config (ro) /fluent-bit/tail from positions (rw) /var/lib/docker/containers from varlibcontainers (ro) /var/log/ from varlogs (ro) /var/log/journal from systemd (ro) Volumes: varlibcontainers: Type: HostPath (bare host directory volume) Path: /var/lib/docker/containers HostPathType: config: Type: Secret (a volume populated by a Secret) SecretName: fluent-bit-config Optional: false varlogs: Type: HostPath (bare host directory volume) Path: /var/log HostPathType: systemd: Type: HostPath (bare host directory volume) Path: /var/log/journal HostPathType: positions: Type: EmptyDir (a temporary directory that shares a pod's lifetime) Medium: SizeLimit: < unset > Events: <none> [root@mh-k8s-master-prd-243-24 ~] # |
二、更新 DaemonSet 对象
DaemonSet 自 Kubernetes 1.6 版本起也开始支持更新机制,相关配置定义如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | [root@mh-k8s-master-prd-243-24 ~] # kubectl explain daemonset KIND: DaemonSet VERSION: apps /v1 DESCRIPTION: DaemonSet represents the configuration of a daemon set . FIELDS: apiVersion <string> APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https: //git .k8s.io /community/contributors/devel/sig-architecture/api-conventions .md #resources kind <string> Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https: //git .k8s.io /community/contributors/devel/sig-architecture/api-conventions .md #types-kinds metadata <Object> Standard object's metadata. More info: https: //git .k8s.io /community/contributors/devel/sig-architecture/api-conventions .md #metadata spec <Object> The desired behavior of this daemon set . More info: https: //git .k8s.io /community/contributors/devel/sig-architecture/api-conventions .md #spec-and-status status <Object> The current status of this daemon set . This data may be out of date by some window of time . Populated by the system. Read-only. More info: https: //git .k8s.io /community/contributors/devel/sig-architecture/api-conventions .md #spec-and-status [root@mh-k8s-master-prd-243-24 ~] # |
更新策略在 daemonset.spec.update-Strategy 嵌套字段中。目前,它支持 RollingUpdate(滚动更新)和 OnDelete(删除时更新)两种更新策略。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | [root@mh-k8s-master-prd-243-24 ~] # kubectl explain daemonset.spec.updateStrategy KIND: DaemonSet VERSION: apps /v1 RESOURCE: updateStrategy <Object> DESCRIPTION: An update strategy to replace existing DaemonSet pods with new pods. DaemonSetUpdateStrategy is a struct used to control the update strategy for a DaemonSet. FIELDS: rollingUpdate <Object> Rolling update config params. Present only if type = "RollingUpdate" . type <string> Type of daemon set update. Can be "RollingUpdate" or "OnDelete" . Default is RollingUpdate. [root@mh-k8s-master-prd-243-24 ~] # |
DaemonSet 控制器的滚动更新机制也可以借助于 minReadySeconds 字段控制滚动节奏,必要时可以执行暂停和继续操作,因此它也能够设计为金丝雀发布机制。另外,故障的更新操作也可以进行回滚,包括回滚至 version 历史记录中的任何一个指定的版本。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)