DS的更新策略

DaemonSet(DS)的更新策略如何自定义它


1. DaemonSet 的默认更新策略

DaemonSet 的默认更新行为与 Deployment 不同,主要区别如下:

特性 DaemonSet Deployment
默认更新策略 RollingUpdate(但行为不同) RollingUpdate(可配置 maxSurgemaxUnavailable
更新触发方式 修改 template 后,逐个节点替换 Pod 修改 template 后,按策略创建新 Pod,再删除旧 Pod
并行控制 maxSurge(不能超额创建 Pod),但可设 maxUnavailable(默认 1) 可配置 maxSurge(允许超额创建 Pod)和 maxUnavailable(允许不可用 Pod 数量)
回滚机制 支持 kubectl rollout undo(回滚到上一版本) 支持 kubectl rollout undo
更新顺序 默认按节点名称排序(可自定义) 无固定顺序

DaemonSet 的默认更新流程

  1. 选择一个节点(默认按字母顺序)。
  2. 在该节点上删除旧 Pod(如果 maxUnavailable 允许)。
  3. 等待新 Pod 变成 Ready
  4. 继续下一个节点,直到所有节点更新完成。

2. 如何自定义 DaemonSet 的更新策略?

DaemonSet 的更新策略可以通过 spec.updateStrategy 调整,主要包含两种方式:

(1) RollingUpdate(默认)

可以配置:

  • maxUnavailable(允许同时不可用的 Pod 数量,默认 1
  • minReadySeconds(新 Pod 就绪后等待多久才继续更新下一个)

示例:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: coredns
  namespace: kube-system
spec:
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 2  # 允许同时更新 2 个节点
      minReadySeconds: 10  # 新 Pod 就绪后等待 10 秒再继续

(2) OnDelete(手动控制更新)

  • 不会自动更新 Pod,必须手动删除旧 Pod 才会触发新 Pod 创建。
  • 适用于需要严格控制更新的场景(如关键基础设施)。

示例:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: coredns
  namespace: kube-system
spec:
  updateStrategy:
    type: OnDelete  # 必须手动删除 Pod 才会更新

3. DaemonSet 和 Deployment 更新策略对比

功能 DaemonSet Deployment
默认策略 RollingUpdate RollingUpdate
能否配置 maxSurge ❌ 不能(DaemonSet 不能超额创建 Pod) ✅ 能(如 maxSurge: 25%
能否配置 maxUnavailable ✅ 能(如 maxUnavailable: 2 ✅ 能(如 maxUnavailable: 1
更新顺序 按节点名称排序(可自定义) 无固定顺序
适用场景 每个节点必须运行 1 个 Pod(如 CNI、监控) 无节点绑定的无状态应用(如 Web 服务)

4. 如何查看和回滚 DaemonSet 的更新?

(1) 查看更新状态

kubectl rollout status daemonset/coredns -n kube-system

(2) 回滚到上一版本

kubectl rollout undo daemonset/coredns -n kube-system

(3) 查看历史修订版本

kubectl rollout history daemonset/coredns -n kube-system

5. 建议:CoreDNS 使用 DaemonSet + RollingUpdate

对于 CoreDNS,推荐以下配置:

spec:
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1  # 保守更新,避免 DNS 服务中断
      minReadySeconds: 10  # 确保新 Pod 完全就绪

总结

  1. DaemonSet 默认是 RollingUpdate,但不能像 Deployment 一样设置 maxSurge(因为不能超额创建 Pod)。
  2. 可以调整 maxUnavailable 控制并行更新数量(如 maxUnavailable: 2 可加快更新速度)。
  3. 如果希望完全手动控制更新,可以用 OnDelete
  4. CoreDNS 推荐用 DaemonSet + RollingUpdate,确保 DNS 高可用。

如果你的集群规模较大(如 50+ 节点),可以适当调大 maxUnavailable 以加快更新速度,但要权衡可用性影响。

posted on 2025-06-12 08:57  Leo-Yide  阅读(63)  评论(0)    收藏  举报