K8S系列:DaemonSet的更新策略

本文介绍了Kubernetes DaemonSet的两种更新策略:OnDelete和RollingUpdate。OnDelete是默认策略,需手动删除旧Pod以触发新Pod创建;而RollingUpdate自1.6版本起引入,会自动替换旧Pod。尽管更新过程类似Deployment,但DaemonSet不支持更新历史管理和kubectl rollback命令进行回滚。

目录

OnDelete

RollingUpdate

不同于普通Pod的滚动升级


目前DaemonSet的升级策略(updateStrategy)包括两种:OnDelete和RollingUpdate。

OnDelete

OnDelete:DaemonSet的默认升级策略,与1.5及之前版本的Kubernetes保持一致。当使用OnDelete作为升级策略时,在创建好新的DaemonSet配置之后,新的Pod并不会被自动创建,直到用户手动删除旧版本的Pod,才触发新建操作,即只有手工删除了DaemonSet创建的Pod副本,新的Pod副本才会被创建出来。如果不设置updateStrategy的值,则在Kubernetes 1.6之后的版本中会被作为updateStrategy的默认设置。

RollingUpdate

RollingUpdate:从Kubernetes 1.6版本开始引入。当使用RollingUpdate作为升级策略对DaemonSet进行更新时,旧版本的Pod将被自动“杀掉”,然后自动创建新版本的DaemonSet Pod。

### 3.1 使用节点选择器(Node Selector)限制 DaemonSet 调度范围 Kubernetes 提供了 **节点选择器**(Node Selector)机制,允许通过标签选择器将 Pod 调度到具有特定标签的节点上。DaemonSet 控制器支持在 Pod 模板中定义 `nodeSelector` 字段,以控制 Pod 的调度目标节点。 例如,若希望 DaemonSet 仅在带有 `role=monitoring` 标签的节点上运行,可以在 Pod 模板中添加如下字段: ```yaml spec: template: spec: nodeSelector: role: monitoring ``` 这种方式适用于简单的标签匹配场景,但其灵活性有限,无法表达多个条件组合或优先级策略。 --- ### 3.2 利用节点亲和性(Node Affinity)实现精细的调度控制 为了实现复杂的调度逻辑,可以使用 **节点亲和性**(Node Affinity)。它允许定义硬性要求(`requiredDuringSchedulingIgnoredDuringExecution`)和软性偏好(`preferredDuringSchedulingIgnoredDuringExecution`),从而控制 DaemonSet Pod 的调度位置。 以下是一个示例配置,表示 DaemonSet Pod 必须调度到标签为 `kubernetes.io/e2e-az-name=e2e-az1` 或 `e2e-az2` 的节点,并优先选择带有 `another-node-label-key=another-node-label-value` 的节点: ```yaml spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/e2e-az-name operator: In values: - e2e-az1 - e2e-az2 preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: another-node-label-key operator: In values: - another-node-label-value ``` 此方式提供了比 `nodeSelector` 强的表达能力,适用于需要多条件筛选的场景[^4]。 --- ### 3.3 处理节点污点(Taint)与容忍度(Toleration) 某些节点可能设置了污点(Taint),以防止不符合条件的 Pod 被调度到该节点。例如,默认情况下,Kubernetes 的 master 节点通常包含 `node-role.kubernetes.io/master:NoSchedule` 污点,阻止普通 Pod 被调度[^3]。 如果希望 DaemonSet Pod 能够调度到这些节点,必须在 DaemonSet 的 Pod 模板中添加相应的容忍度(Toleration)。例如,要允许调度到 master 节点,可添加如下字段: ```yaml spec: tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule operator: Exists ``` 这样配置后,即使节点设置了相关污点,DaemonSet 控制器也能成功将 Pod 调度到目标节点上。 --- ### 3.4 综合配置示例 结合上述机制,一个完整的 DaemonSet 配置示例如下,表示仅调度到具备特定标签且可容忍 master 污点的节点上: ```yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: example-daemonset spec: selector: matchLabels: name: example template: metadata: labels: name: example spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/e2e-az-name operator: In values: - e2e-az1 - e2e-az2 tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule operator: Exists containers: - name: example-container image: nginx ``` 该配置确保 DaemonSet 只会在满足指定亲和性规则并能容忍相应污点的节点上运行。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NIO4444

如果对您有帮助,欢迎打赏支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值