【发布时间】:2020-08-27 22:58:14
【问题描述】:
如果 docker 镜像有更新,滚动更新策略会一个一个地更新 daemonset 中的所有 pod,同样,是否可以在不更改 daemonset 配置的情况下优雅地重新启动 pod,或者是否可以显式触发?
目前,我是手动完成的
kubectl delete pod <pod-name>
一个接一个,直到每个 pod 进入运行状态。
【问题讨论】:
标签: kubernetes
如果 docker 镜像有更新,滚动更新策略会一个一个地更新 daemonset 中的所有 pod,同样,是否可以在不更改 daemonset 配置的情况下优雅地重新启动 pod,或者是否可以显式触发?
目前,我是手动完成的
kubectl delete pod <pod-name>
一个接一个,直到每个 pod 进入运行状态。
【问题讨论】:
标签: kubernetes
你可以尝试使用Node maintenance operations:
使用 kubectl drain 来优雅地终止节点上的所有 pod,同时将节点标记为不可调度(使用
--ignore-daemonsets,来自 Konstantin Vustin 的 comment):
kubectl drain $NODENAME --ignore-daemonsets
这可以防止新的 pod 在您尝试将其移除时降落在节点上。
然后:
使节点再次可调度:
kubectl uncordon $NODENAME
【讨论】:
DaemonSet 控制器会忽略不可调度的标记,因此属于 DaemonSet 的 pod 将立即被替换。如果节点上存在属于DaemonSet 的pod,则仅当--ignore-daemonsets 标志设置为true 时才会执行drain 命令,但即使是这种情况,它也不会因为@987654332 而删除该pod @控制器。
--ignore-daemonsets,因为每个节点上都会有kube-system命名空间DaemonSets,例如flannel 或其他。所以你不需要删除用户定义的 DaemonSets,因为kubectl drain 在没有这个标志的情况下无论如何都不会继续。您唯一能做的就是修改 DaemonSet 中的 NodeSelector 过滤器,将其从应该被排空的 Node 中排除
触发重新启动命名空间 [namespace_name] 中由 deamonset 管理的所有 pod:
kubectl rollout restart de -n [namespace_name]
【讨论】: