kubernetes DaemonSet的滚动更新

DaemonSet的滚动更新

DaemonSet 更新策略

DaemonSet 有两种更新策略 :

  • OnDelete: 默认的向后兼容更新策略. 只有当你手动删除老的DaemonSet pods时,新的DaemonSet pods 才会被自动创建。跟k8s 1.5版本及以前的行为类似。

  • RollingUpdate: 老的DaemonSet pods会被自动杀死,新的DaemonSet pods会自动创建。

限制

  • DaemonSet rollout历史目前还不支持.

  • DaemonSet 回滚 目前 kubectl还不支持. 你可以修改到DaemonSet 模板到以前版本来实现rollback.

警告: 更新Kubernetes1.5 及以前版本创建的DeamonSet

当你第一次设置RollingUpdate 滚动更新策略时,rollout 会被触发, 即使DaemonSet 模板没有修改. 所有的DaemonSet pods 会重启.

要避免重启, 首先获取DaemonSet .spec.templateGeneration:的当前值。

kubectl get ds/ -o go-template='{{.spec.templateGeneration}}{{"\n"}}'

输出应为数字N. 如果没有输出数字,则 N = 0.

然后在设置DaemonSet的滚动更新策略.spec.updateStrategyRollingUpdate

给DaemonSet pods 打上标签 pod-template-generation=
kubectl label pods -l = pod-template-generation=

这步主要是告诉DaemonSet刚刚打标签的 DaemonSet pods 是被当前模板创建的.

配置DaemonSet 滚动更新策略

开启滚动更新功能.spec.updateStrategy.type 设置为 RollingUpdate.

你同时也想设置 .spec.updateStrategy.rollingUpdate.maxUnavailable (默认为 1) 跟 .spec.minReadySeconds (默认为 0) 两个参数.

Step 1: 检查当前滚动更新策略

kubectl get ds/ -o go-template='{{.spec.updateStrategy.type}}{{"\n"}}'

如果你还没有创建DaemonSet, 使用以下命令:

kubectl create -f ds.yaml --dry-run -o go-template='{{.spec.updateStrategy.type}}{{"\n"}}'

输出应该是:

RollingUpdate

如果输出不是 RollingUpdate, 修改 DaemonSet 资源对象的相关字段。

Step 2: 使用滚动更新策略创建DaemonSet

如果你已经创建DaemonSet,跳到 step 3

kubectl create -f ds.yaml

如果使用kubectl apply部署 DaemonSet 使用以下命令

kubectl apply -f ds.yaml

Step 3: 更新 DaemonSet 模板

以下三个命令都可以修改DaemonSet 模板

kubectl apply -f ds-v2.yaml

kubectl edit ds/

kubectl patch ds/ -p=

如果只更新镜像,可以使用以下命令:

kubectl set image ds/ =

Step 4: 查看滚动更新状态

kubectl rollout status ds/
当滚地更新完成,输出如下:

daemon set "" successfully rolled out

Troubleshooting

DaemonSet 滚动更新卡住

可能有以下原因:

一些节点资源用尽

可以使用以下命令查看那个节点资源用尽:

kubectl get pods -l = -o wide

滚动中断

当容器镜像不存在时,就会发生滚动中断。

时钟误解

如果 .spec.minReadySeconds 指定, master 跟 nodes节点可能会发生时钟误解.

你可能感兴趣的:(kubernetes)