如何在AKS中使用ACR中更新的docker映像

时间:2019-02-14 22:26:23

标签: docker kubernetes-helm azure-aks azure-acr

我有一个本地docker映像,该映像已推送到私有Azure容器注册表。然后在Azure Kubernetes Service中,我有一个群集,我正在使用该映像-来自ACR。

现在,我想更新映像(意识到我需要安装zip和unzip)。我启动了一个本地容器,进行了更改,然后进行了提交并将新映像推送到ACR。不幸的是,这还不够。我的广告连播仍在使用该图片的先前版本,没有zip。

更多细节和我尝试过的事情

  • 在头盔图表中,我使用的是“最新”标签;

  • 比较了本地“最新”图像的摘要阴影和ACR中的图像-它们是相同的;

  • 在本地启动“最新”容器(docker run -it --rm -p 8080:80 My-REPO.azurecr.io/MY-IMAGE:latest)-已安装zip

  • 删除kubernetes中的现有吊舱;新创建的仍缺少zip

  • 删除发行版并重新创建它-仍然没有。

  • 我正在使用docker push MY-REPO.azurecr.io/MY-IMAGE:latest

  • 推送到ACR

所以我的问题是-我想念什么?如何正确更新此设置?

1 个答案:

答案 0 :(得分:3)

您应该在寻找这样的设置:

  1. 您的Docker映像具有一些唯一标记,而不是latest;日期戳通常可以正常工作。

  2. 您的Helm图表应将标记作为values.yaml文件中的参数。

  3. 您应该使用Kubernetes部署(而不是裸Pod);在其pod规格部分中,将图片指定为类似image: MY-REPO.azurecr.io/MY-IMAGE:{{ .Values.tag }}的图片。

  4. 拥有新版本时,可以helm update --set tag=20190214;这会将更新的部署规范推送到Kubernetes;这将导致它使用新图像创建新Pod,然后使用旧图像销毁旧Pod。

您遇到的一个基本问题是,YAML文件中的某些文本差异对于使Kubernetes采取某些措施很重要。如果它已经有MY-IMAGE:latest,并且您尝试kubectl apply或使用完全相同的图像字符串等效于相同的pod或部署规范,它将决定什么都没有改变,并且不需要执行任何操作。同样,当您删除并重新创建Pod时,该节点会确定该Pod已经具有MY-IMAGE:latest映像,并且无需关闭并拉出任何东西。它只是重复使用已经拥有的相同(过时)图像。

与您描述的工作流程相关的一些最佳做法:

  • 不要使用...:latest图片标签(或任何其他固定的字符串);相反,请使用一些唯一的值,例如时间戳,源代码控制提交ID或发行版,每次执行部署时,您将使用不同的标签。

  • 不要使用裸豆荚;而是使用更高级别的控制器,通常是部署。

  • 永远不要使用docker commit。 (如果您的图像在生产中崩溃了,您将如何解释“哦,我手动更改了一些内容,重写了图像生产中正在使用的图像,并强行重新启动了所有内容,但是我没有记录我的实际工作”)) Dockerfile,将其检入源代码管理,然后使用docker build制作映像。 (更好的是,设置一个CI系统,以便在您每次签入时为您构建它们。)