下面介绍更新 Deployment 以重新拉取相同标签镜像的方法,不要只会杀 pod 触发了,个人最喜欢方法二。
当镜像名称和标签都没有变化,但需要重新拉取镜像时(比如镜像内容已更新但标签保持不变),可以采用以下方法:
方法一:修改 Pod 模板以触发重新部署
为 Deployment 的 Pod 模板添加或更新一个注释(annotation)来触发滚动更新:
kubectl patch deployment [deployment-name] -p \
"{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"kubectl.kubernetes.io/restartedAt\":\"$(date +%s)\"}}}}}"
这会添加或更新一个时间戳注释,使 Kubernetes 认为 Pod 模板已更改,从而触发重新部署。
方法二:强制重启 Deployment
kubectl rollout restart deployment/[deployment-name]
这是 Kubernetes 1.15 及更高版本提供的便捷命令,效果与方法一类似。
方法三:修改 imagePullPolicy
确保容器的 imagePullPolicy
设置为 Always
,这样每次 Pod 重启都会重新拉取镜像:
kubectl patch deployment [deployment-name] -p '{"spec":{"template":{"spec":{"containers":[{"name":"[container-name]","imagePullPolicy":"Always"}]}}}}'
设置后,可以使用方法一或方法二触发重新部署。
方法四:删除 Pod(不推荐)
手动删除 Pod,让 Deployment 控制器创建新的 Pod:
kubectl delete pod -l app=[your-app-label]
注意: 此方法不推荐用于生产环境,因为它可能导致服务中断。
最佳实践建议
- 始终使用唯一标签:最好的做法是为每个新版本的镜像使用唯一标签,如使用 Git commit SHA 或时间戳。
设置 Always 拉取策略:在 Deployment 中设置:
spec: template: spec: containers: - name: your-container image: your-image:tag imagePullPolicy: Always
- 对于生产环境:推荐使用前两种方法(添加注释或使用 rollout restart),它们符合 Kubernetes 的声明式设计理念,并且会进行受控的滚动更新。
使用 kubectl rollout restart deployment/[deployment-name]
是最简单且符合 Kubernetes 最佳实践的方式。