Azure Pipeline使用latest标签部署Docker镜像到AKS报错咨询
问题根因
你当前遇到的ImagePullBackOff错误核心原因是:流水线构建推送镜像时仅打了$(Build.BuildId)标签,没有推送latest标签到ACR,导致K8s部署时拉取不存在的镜像报错,附带的401错误是私有ACR对不存在镜像的匿名请求拦截,不是权限配置问题。
两种解决方案
方案1:构建时同时推送latest标签(最简单快速)
直接修改Azure Pipeline中Docker@2任务的tags配置,新增latest标签即可,修改后的Docker任务代码如下:
- task: Docker@2 displayName: Build and push image inputs: command: buildAndPush repository: $(imageRepository) dockerfile: $(dockerfilePath) containerRegistry: $(dockerRegistryServiceConnection) buildContext: $(Build.Repository.LocalPath) tags: | $(tag) latest
注意:该方案每次构建都会覆盖ACR里的latest标签,无法追溯历史部署版本,适合测试环境使用,生产环境更推荐方案2。
方案2:参数化K8s部署文件(更稳妥,支持版本追溯)
不需要依赖latest标签,直接把每次构建的唯一标签传入K8s部署文件,避免版本混乱,操作步骤如下:
- 修改
deploy_watchdog_kube.yaml的镜像配置,把固定的latest改成占位符:
# 修改前 image: acrfollis.azurecr.io/watchdogapp:latest # 修改后 image: acrfollis.azurecr.io/watchdogapp:__IMAGE_TAG__
- 在流水线的Docker任务之后、K8s部署任务之前,新增sed命令替换占位符:
# 新增替换标签步骤 - bash: | sed -i "s/__IMAGE_TAG__/$(tag)/g" $(Build.SourcesDirectory)/Follis.WatchDog/deploy_watchdog_kube.yaml displayName: Replace image tag in k8s manifest
- 原有Kubernetes@1任务无需额外修改,apply时会自动使用本次构建的唯一标签触发滚动更新。
可选优化
如果使用方案2,可以把K8s任务的forceUpdate改为true,确保每次部署都会触发Pod重建,避免配置未变更时不更新的问题。
内容的提问来源于stack exchange,提问作者Vibin Kesavan
相关产品推荐
相关产品推荐

