对 DaemonSet 执行滚动更新
- Kubernetes 1.6 或者更高版本中才支持 DaemonSet 滚动更新功能。
DaemonSet 有两种更新策略:
- OnDelete: 使用 更新策略时,在更新 DaemonSet 模板后,只有当您手动删除老的 DaemonSet pods 之后,新的 DaemonSet pods *才会*被自动创建。跟 Kubernetes 1.6 以前的版本类似。
- RollingUpdate: 这是默认的更新策略。使用
RollingUpdate
更新策略时,在更新 DaemonSet 模板后,老的 DaemonSet pods 将被终止,并且将以受控方式自动创建新的 DaemonSet pods。
要启用 DaemonSet 的滚动更新功能,必须设置 .spec.updateStrategy.type
为 RollingUpdate
。
您可能想设置.spec.updateStrategy.rollingUpdate.maxUnavailable
(默认为 1) 和 (默认为 0)。
首先,检查 DaemonSet 的更新策略,确保已经将其设置为 RollingUpdate
:
如果还没在系统中创建 DaemonSet,请使用以下命令检查 DaemonSet 的清单:
两个命令的输出都应该为:
RollingUpdate
如果输出不是 ,请返回并相应地修改 DaemonSet 对象或者清单。
验证 DaemonSet 清单的更新策略后,创建 DaemonSet:
kubectl create -f ds.yaml
或者,您打算使用 kubectl apply
更新 DaemonSet,请使用 kubectl apply
创建相同的 DaemonSet。
对 RollingUpdate
DaemonSet .spec.template
的任何更新都将触发滚动更新。这可以通过几个不同的 kubectl
命令来完成。
声明式命令
如果您使用来更新 DaemonSets,请使用 kubectl apply
:
kubectl apply -f ds-v2.yaml
命令式命令
如果您使用来更新 DaemonSets,请使用 或者 kubectl patch
:
kubectl edit ds/<daemonset-name>
kubectl patch ds/<daemonset-name> -p=<strategic-merge-patch>
只更新容器镜像
如果您只需要更新 DaemonSet 模板里的容器镜像,比如,.spec.template.spec.containers[*].image
, 请使用 kubectl set image
:
最后,观察 DaemonSet 最新滚动更新的进度:
kubectl rollout status ds/<daemonset-name>
daemonset "<daemonset-name>" successfully rolled out
有时,DaemonSet 滚动更新可能会卡住。可能原因如下:
一些节点资源用尽
由于新 DaemonSet pods 无法调度到至少一个节点时,滚动更新就会卡住。这可能是由于节点已经资源用尽。
发生这种情况时,通过对 kubectl get nodes
和下面命令行的输出作比较,找出没有调度部署 DaemonSet pods 的节点:
一旦找到这些节点,从节点上删除一些非 DaemonSet pods,为新的 DaemonSet pods 腾出空间。
滚动更新中断
如果最近的 DaemonSet 模板更新被破坏了,比如,容器处于崩溃循环状态或者容器镜像不存在(通常由于拼写错误),就会发生 DaemonSet 滚动更新中断。
要解决此问题,只需再次更新 DaemonSet 模板即可。以前不健康的滚动更新不会阻止新的滚动更新。
时钟偏差
- 查看