![当有新版本的容器镜像时,自动初始化 kubernetes 部署的滚动更新](https://linux22.com/image/741453/%E5%BD%93%E6%9C%89%E6%96%B0%E7%89%88%E6%9C%AC%E7%9A%84%E5%AE%B9%E5%99%A8%E9%95%9C%E5%83%8F%E6%97%B6%EF%BC%8C%E8%87%AA%E5%8A%A8%E5%88%9D%E5%A7%8B%E5%8C%96%20kubernetes%20%E9%83%A8%E7%BD%B2%E7%9A%84%E6%BB%9A%E5%8A%A8%E6%9B%B4%E6%96%B0.png)
我有一个如下所示的 kubernetes 部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: datacollector
spec:
replicas: 1
selector:
matchLabels:
pod-type: datacollector
template:
metadata:
labels:
pod-type: datacollector
spec:
imagePullSecrets:
- name: secret
containers:
- name: datacollector
image: "build.dorangg.dev/doranggdatacollector:latest"
imagePullPolicy: Always
目前,每当我想要更新部署以使用来自 docker 注册表(build.dorangg.dev)的最新版本的映像时,我都会运行以下命令:
kubectl rollout restart deployment/datacollector
每当镜像的新版本出现在docker注册表中时,我想自动启动部署的滚动更新(上述命令的作用)。
可以使用 kubernetes 配置来实现吗?如果不行,是否可以使用脚本实现此自动化?
答案1
可以使用 kubernetes 配置来实现吗?
我不知道。
如果没有,是否可以使用脚本实现这种自动化?
是的。你对图像执行操作docker pull
。如果 docker 拉取新图像,则删除 POD,kubectl
然后重新部署。
答案2
说实话,我认为它无法在 Kubernetes 内部配置。它需要额外的脚本/触发器。
我想到了一些选项,但是您需要使用脚本“捕获”新图像(例如成功推送到存储库后的新图像的名称)。
- 补丁部署
$ kubectl patch deployment [your-deployment] -p \
'{"spec":{"template":{"spec":{"image":"[new-image-name:tag]"}}}}'
如果 Kubernetes 发现一些变化,它应该重新部署整个部署。
- 创建脚本并设置新图像
$ kubectl set image deployment/[deployment-name] [image-name]=[new-image-name:tag]
经过此更改后,kubernetes 也应该重新部署所有 pod。
- 使用 HELM
作为使用图表和模板的 helm,您可以创建脚本来更改图像名称values.yaml
并重新部署它。
- 补丁宽限期
如果你想一直保持相同的镜像名称,你可以尝试 patch GracePeriod
。它被描述为这里。
希望它会有所帮助。
答案3
更好的方法是使用kubectl set image
来告诉部署有新镜像,但如果您使用,它将不起作用,:latest
因为如果标签没有更改,部署将不会触发。:latest
无论如何,使用 不是一个好主意,因此您必须转向对容器的标签进行半版本控制。