【问题标题】:How to update deployment image on Azure Kubernetes Service with same image tag via an Azure pipeline?如何通过 Azure 管道更新具有相同映像标记的 Azure Kubernetes 服务上的部署映像?
【发布时间】:2020-02-27 11:48:32
【问题描述】:

每次将某些代码提交到 github 时,我都会尝试使用 Azure Kubernetes 服务上的最新图像内容更新我的部署。我已经在我的构建管道中建立了一个阶段,以在 docker hub 上构建和推送图像,它工作得非常好。但是在我的发布管道中,该映像被用作工件并被部署到 Azure Kubernetes Service,但问题是 AKS 上的映像没有根据使用最新代码推送到 Docker Hub 上的映像进行更新。

现在每次发生某些提交时,我都必须通过命令手动更新 AKS 上的图像

kubectl 设置镜像部署/demo-microservice demo-microservice=customerandcontact:contact

我的 Yaml 文件

谁能告诉我的 yaml 文件中的错误/更改以自动更新 AKS 上的图像。

【问题讨论】:

  • 您是否更新每个版本的容器存储库标签?你的标签似乎是:contact 所以它不会改变 kubernetes 不会做任何事情
  • 对于每个版本,你应该创建一个新的版本标签
  • 是的,我尝试使用 build id 作为 customerandcontact:contact-#{Build.BuildId}# @Thomas 创建一个新标签,但它仍然没有更新
  • 那么您是在更新新映像后重新部署清单吗?
  • 你需要做一个 kubectl apply 或 heml install 取决于你使用什么工具

标签: azure docker kubernetes continuous-deployment azure-aks


【解决方案1】:

当您使用特定的图像标签指定您的图像时,Kubernetes 会将容器的imagePullPolicy 默认为IfNotPresent,这意味着不会再次拉取该图像,而是部署之前拉取的图像。

仅当标签不存在时,Kubernetes 才会将策略更改为 Always(这实际上与 latest 相同,或者标签明确设置为 latest

检查特定容器的部署模板上的实际 imagePull 策略是什么。

kubectl get pod demo-microservice -o yaml | grep imagePullPolicy -A 1

尝试修补部署

kubectl patch deployment demo-microservice -p 
 '{"spec": { "template" : 
  { "spec" : { "containers" : 
    [{"name" : "demo-microservice", 
    "image" : "repo/image:tag", 
    "imagePullPolicy": "Always" }]}}}}'

确保相关容器的imagePullPolicy 设置为Always

【讨论】:

  • 错误消息:来自服务器的错误(BadRequest):json:无法通过运行 kubectl patch 命令将字符串解组为 map[string]interface {} 类型的 Go 值。
  • 我刚试过,它对我有用,请再次检查
  • 谢谢你,节省了我的时间。
【解决方案2】:

当您将新镜像发布到同一标签下的容器注册表时,它对 Kubernetes 没有任何意义。如果你运行kubectl apply -f ... 并且图像名称和标签保持不变,它仍然不会做任何事情,因为没有配置更改。有两种选择:

  1. 在每次构建时添加一个新标签,并将 :contact 更改为 yaml 中的新标签并运行 kubectl apply

  2. 仅适用于开发环境(不要在 Stage 或 Prod 中执行此操作)保留相同的标记(通常使用标记 :latest)并在将新映像部署到注册表后运行 kubectl delete pod demo-microservice。由于您已将镜像拉取策略设置为 Always,这将导致 Kubernetes 从注册表中拉取新镜像并重新部署 pod。

第二种方法是一种仅用于测试的解决方法。

【讨论】:

  • 如果我在每次构建时都添加新标签,那么我的 docker hub 将拥有 100 张图像,但在一些之后会略有不同,那么您对此有何建议?
  • 我们使用删除旧标签的 ACR 脚本。标记为 reaee 的标记可以进入生产注册表,也可以按照某种模式获取另一个标记。否则,你怎么知道哪个确切的图像通过了 qa 和 ymuat 测试并符合发布条件?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 2020-11-14
  • 2021-04-21
相关资源
最近更新 更多