kubectl rollout restart能否作用于DaemonSet并实现容器镜像更新?
结论
- 执行
kubectl rollout restart操作可以达成重启时自动拉取最新版本镜像的目标,该操作在你的场景下是否为最优方案取决于你使用的镜像Tag规则。
原理说明
kubectl rollout restart daemonset <DaemonSet名称>的本质是触发DaemonSet的滚动更新流程:
- 命令会自动给DaemonSet的Pod模板新增一个
kubectl.kubernetes.io/restartedAtannotation,触发Pod模板版本变更 - DaemonSet控制器会按照配置的滚动更新策略,逐节点销毁旧Pod,使用新的Pod模板重建Pod
- 由于你已经将容器的
imagePullPolicy设置为Always,Kubelet在创建新Pod时会主动向镜像仓库校验当前镜像Tag对应的最新digest,拉取最新版本的镜像启动容器
方案适用性说明
适用场景
如果你的镜像使用可变Tag(比如latest、dev这类每次构建都会覆盖更新的Tag),kubectl rollout restart是该场景下的常用正确方案,操作简单无需修改镜像配置。
更优替代场景
如果你的镜像使用不可变Tag(比如每次构建生成唯一的版本Tag,如v1.2.3、build-20240520-a1b2c3),更规范的方案是直接修改DaemonSet的容器镜像配置,命令参考:
kubectl set image daemonset <DaemonSet名称> <容器名称>=<新镜像地址:新Tag>
该方式可以明确控制镜像版本,避免镜像仓库Tag意外更新导致的非预期版本拉取,版本可追溯性更强。
验证建议
重启完成后可以通过以下方式确认镜像已更新为最新版本:
- 查看Pod事件确认拉取行为:
kubectl describe pod <Pod名称> | grep -A5 Events - 对比实际运行镜像的digest和镜像仓库最新版本的digest:
kubectl get pod <Pod名称> -o jsonpath='{.spec.containers[*].imageID}'
内容的提问来源于stack exchange,提问作者Azad Md Abul Kalam
相关产品推荐
相关产品推荐

