如何在 AKS 中使用来自 ACR 的更新 docker 图像
How to use updated docker image from ACR in AKS
我有一个本地 docker 图像被推送到私有 Azure 容器注册表。然后在 Azure Kubernetes 服务中,我有一个集群,我正在其中使用此图像 - 来自 ACR。
现在我想更新图像(意识到我需要安装 zip 和解压缩)。我启动了一个本地容器,进行了更改、提交并将新映像推送到 ACR。不幸的是,这还不够。我的 pods 仍在使用以前版本的图像,没有压缩。
更多细节和我的尝试:
在 helm chart 里面我使用了 "latest" 标签;
比较了我本地 "latest" 图像的摘要 sha 和我在 ACR 中的图像 - 它们是相同的;
在本地启动 "latest" 容器 (docker run -it --rm -p 8080:80 My-REPO.azurecr.io/MY-IMAGE:latest
) - 它安装了 zip
删除了 kubernetes 中现有的 pods;新创建的仍然缺少 zip
删除版本并重新创建它 - 仍然没有。
我正在使用 docker push MY-REPO.azurecr.io/MY-IMAGE:latest
推送到 ACR
所以我的问题是 - 我错过了什么?如何正确更新此设置?
您应该寻找这样的设置:
您的 Docker 图片有一些独特的标签,而不是 latest
;日期戳通常可以正常工作。
您的 Helm 图表应将标签作为 values.yaml
文件中的参数。
您应该使用 Kubernetes Deployment(而不是裸 Pod);在其 pod spec 部分将图像指定为 image: MY-REPO.azurecr.io/MY-IMAGE:{{ .Values.tag }}
.
当你有一个新版本时,你可以helm update --set tag=20190214
;这会将更新的部署规范推送到 Kubernetes;这将导致它用新图像创建新的Pods,然后用旧图像破坏旧的Pods。
您 运行 遇到的根本问题是 YAML 文件中的一些文本差异对于让 Kubernetes 采取一些行动很重要。如果它已经有 MY-IMAGE:latest
,并且您尝试 kubectl apply
或等效的具有完全相同图像字符串的相同 pod 或部署规范,它将确定没有任何改变并且不需要做任何事情.类似地,当您删除并重新创建 pod 时,节点决定它已经有一个 MY-IMAGE:latest
图像并且不需要关闭并拉取任何东西;它只是重复使用它已有的相同(过时)图像。
与您描述的工作流程相关的一些最佳实践:
不要使用 ...:latest
图片标签(或任何其他固定字符串);相反,使用一些唯一值,例如时间戳、源代码控制提交 ID 或发布版本,每次进行部署时,您都会有不同的标签。
不要裸用pods;使用更高级别的控制器,通常是 Deployment。
永远不要使用 docker commit
。 (如果你的图像在生产中崩溃了,你会如何解释 "oh, I changed some stuff by hand, overwrote the image production is using, and forcibly restarted everything, but I have no record of what I actually did"?)设置一个 Docker 文件,将其签入源代码管理,然后使用 docker build
制作图像。 (更好的是,设置一个 CI 系统,以便在您签到时为您构建它们。)
我有一个本地 docker 图像被推送到私有 Azure 容器注册表。然后在 Azure Kubernetes 服务中,我有一个集群,我正在其中使用此图像 - 来自 ACR。
现在我想更新图像(意识到我需要安装 zip 和解压缩)。我启动了一个本地容器,进行了更改、提交并将新映像推送到 ACR。不幸的是,这还不够。我的 pods 仍在使用以前版本的图像,没有压缩。
更多细节和我的尝试:
在 helm chart 里面我使用了 "latest" 标签;
比较了我本地 "latest" 图像的摘要 sha 和我在 ACR 中的图像 - 它们是相同的;
在本地启动 "latest" 容器 (
docker run -it --rm -p 8080:80 My-REPO.azurecr.io/MY-IMAGE:latest
) - 它安装了 zip删除了 kubernetes 中现有的 pods;新创建的仍然缺少 zip
删除版本并重新创建它 - 仍然没有。
我正在使用
docker push MY-REPO.azurecr.io/MY-IMAGE:latest
推送到 ACR
所以我的问题是 - 我错过了什么?如何正确更新此设置?
您应该寻找这样的设置:
您的 Docker 图片有一些独特的标签,而不是
latest
;日期戳通常可以正常工作。您的 Helm 图表应将标签作为
values.yaml
文件中的参数。您应该使用 Kubernetes Deployment(而不是裸 Pod);在其 pod spec 部分将图像指定为
image: MY-REPO.azurecr.io/MY-IMAGE:{{ .Values.tag }}
.当你有一个新版本时,你可以
helm update --set tag=20190214
;这会将更新的部署规范推送到 Kubernetes;这将导致它用新图像创建新的Pods,然后用旧图像破坏旧的Pods。
您 运行 遇到的根本问题是 YAML 文件中的一些文本差异对于让 Kubernetes 采取一些行动很重要。如果它已经有 MY-IMAGE:latest
,并且您尝试 kubectl apply
或等效的具有完全相同图像字符串的相同 pod 或部署规范,它将确定没有任何改变并且不需要做任何事情.类似地,当您删除并重新创建 pod 时,节点决定它已经有一个 MY-IMAGE:latest
图像并且不需要关闭并拉取任何东西;它只是重复使用它已有的相同(过时)图像。
与您描述的工作流程相关的一些最佳实践:
不要使用
...:latest
图片标签(或任何其他固定字符串);相反,使用一些唯一值,例如时间戳、源代码控制提交 ID 或发布版本,每次进行部署时,您都会有不同的标签。不要裸用pods;使用更高级别的控制器,通常是 Deployment。
永远不要使用
docker commit
。 (如果你的图像在生产中崩溃了,你会如何解释 "oh, I changed some stuff by hand, overwrote the image production is using, and forcibly restarted everything, but I have no record of what I actually did"?)设置一个 Docker 文件,将其签入源代码管理,然后使用docker build
制作图像。 (更好的是,设置一个 CI 系统,以便在您签到时为您构建它们。)