如何通过单条K8s命令实现配置更新、拉取镜像与滚动重启Deployment?
解决方案
方案1:用kubectl apply结合动态注解触发单次滚动更新
直接把应用配置和触发镜像拉取的操作合并成一条命令,通过给Deployment添加唯一时间戳注解的方式,确保仅触发一次滚动更新:
kubectl apply -Rf ./your-config-dir && kubectl patch deployment <你的Deployment名称> -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"kubectl.kubernetes.io/restartedAt\":\"$(date +%Y-%m-%dT%H:%M:%S%z)\"}}}}"
这个命令的逻辑是:
- 先批量应用目录下的configmap和deployment配置变更
- 立即给Deployment模板打一个基于当前时间的唯一注解,触发滚动更新
- 因为已配置
imagePullPolicy: Always,滚动更新时kubelet会自动拉取最新的latest镜像 - 无论是否有配置变更,整个流程只会触发一次滚动更新,避免了两次重启的问题
方案2:替换latest标签为唯一标识(长期最优方案)
尽量不要用latest标签,改用镜像的SHA摘要或者版本号作为标签,在CI/CD流程中自动注入到deployment.yaml里:
# 修改后的deployment.yaml示例 spec: template: spec: containers: - name: your-container image: your-image:{{镜像SHA值}} # 由CI/CD工具动态注入 imagePullPolicy: Always
这种方式下,每次镜像更新时,kubectl apply会识别到镜像标签变化,自动触发滚动更新;同时配置变更也会在apply时生效,全程只触发一次重启,还能避免latest标签带来的镜像缓存不确定性。
方案3:不推荐的替代方式
如果不想用注解,也可以用kubectl replace -f deployment.yaml替代apply,但需要先单独应用configmap,再替换Deployment,且还是需要额外操作触发镜像拉取,流程比方案1繁琐,不建议使用。
内容的提问来源于stack exchange,提问作者kontojulii
相关产品推荐
相关产品推荐

