DS的更新策略
DaemonSet(DS)的更新策略 和 如何自定义它。
1. DaemonSet 的默认更新策略
DaemonSet 的默认更新行为与 Deployment 不同,主要区别如下:
| 特性 | DaemonSet | Deployment |
|---|---|---|
| 默认更新策略 | RollingUpdate(但行为不同) |
RollingUpdate(可配置 maxSurge 和 maxUnavailable) |
| 更新触发方式 | 修改 template 后,逐个节点替换 Pod |
修改 template 后,按策略创建新 Pod,再删除旧 Pod |
| 并行控制 | 无 maxSurge(不能超额创建 Pod),但可设 maxUnavailable(默认 1) |
可配置 maxSurge(允许超额创建 Pod)和 maxUnavailable(允许不可用 Pod 数量) |
| 回滚机制 | 支持 kubectl rollout undo(回滚到上一版本) |
支持 kubectl rollout undo |
| 更新顺序 | 默认按节点名称排序(可自定义) | 无固定顺序 |
DaemonSet 的默认更新流程
- 选择一个节点(默认按字母顺序)。
- 在该节点上删除旧 Pod(如果
maxUnavailable允许)。 - 等待新 Pod 变成
Ready。 - 继续下一个节点,直到所有节点更新完成。
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 完全就绪
总结
- DaemonSet 默认是
RollingUpdate,但不能像 Deployment 一样设置maxSurge(因为不能超额创建 Pod)。 - 可以调整
maxUnavailable控制并行更新数量(如maxUnavailable: 2可加快更新速度)。 - 如果希望完全手动控制更新,可以用
OnDelete。 - CoreDNS 推荐用 DaemonSet +
RollingUpdate,确保 DNS 高可用。
如果你的集群规模较大(如 50+ 节点),可以适当调大 maxUnavailable 以加快更新速度,但要权衡可用性影响。
浙公网安备 33010602011771号