下面介绍更新 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]

注意: 此方法不推荐用于生产环境,因为它可能导致服务中断。

最佳实践建议

  1. 始终使用唯一标签:最好的做法是为每个新版本的镜像使用唯一标签,如使用 Git commit SHA 或时间戳。
  2. 设置 Always 拉取策略:在 Deployment 中设置:

    spec:
      template:
        spec:
          containers:
          - name: your-container
            image: your-image:tag
            imagePullPolicy: Always
  3. 对于生产环境:推荐使用前两种方法(添加注释或使用 rollout restart),它们符合 Kubernetes 的声明式设计理念,并且会进行受控的滚动更新。

使用 kubectl rollout restart deployment/[deployment-name] 是最简单且符合 Kubernetes 最佳实践的方式。

最后修改:2025 年 04 月 10 日
如果觉得我的文章对你有用,请随意赞赏