Azure DevOps发布管道如何引用Docker Hub镜像制品执行K8s部署?
Azure DevOps 部署K8s时引用Docker Hub镜像制品的操作方法
可用内置变量规则
当你在发布管道中把构建管道推送的Docker Hub镜像配置为制品源后,Azure DevOps会自动注入镜像的完整信息变量,不需要手动拼接镜像路径和标签,直接引用即可:
- 把变量中的
<你的制品源别名>替换为你在管道中实际配置的制品源名称后,核心可用变量:$(Resources.ContainerImages.<你的制品源别名>.Repository):匹配Docker Hub上的完整镜像仓库路径,格式为Docker Hub用户名/镜像名称$(Resources.ContainerImages.<你的制品源别名>.Tag):匹配每次构建时推送镜像使用的动态标签,比如构建编号、Git Commit短哈希等自动生成的标识
两种常见kubectl引用实现方式
- 方式1:部署前动态替换YAML中的镜像占位符
提前在部署YAML的镜像字段预留通用占位符,执行kubectl apply前把占位符替换为当前管道关联的镜像完整引用,不需要手动维护多套版本YAML:
假设deployment.yaml内的镜像行预留占位符为image: <IMAGE_PLACEHOLDER>,执行部署的命令为:sed "s/<IMAGE_PLACEHOLDER>/$(Resources.ContainerImages.<你的制品源别名>.Repository):$(Resources.ContainerImages.<你的制品源别名>.Tag)/g" deployment.yaml | kubectl apply -f - - 方式2:在内联kubectl脚本中提取变量后执行滚动更新
适合需要分步执行部署、状态校验的场景,直接在脚本里把镜像引用拼接为完整变量后传给kubectl:TARGET_IMAGE=$(Resources.ContainerImages.<你的制品源别名>.Repository):$(Resources.ContainerImages.<你的制品源别名>.Tag) kubectl set image deployment/你的工作负载名称 业务容器=$TARGET_IMAGE kubectl rollout status deployment/你的工作负载名称 --timeout=300s
常见避坑提示
- 不要硬编码镜像标签:如果写死
latest或者固定版本号,很容易出现部署的镜像版本和当前发布管道关联的构建制品版本不匹配的问题 - 提前配置集群侧的镜像拉取权限:如果Docker Hub上的镜像为私有仓库,需要在K8s的对应命名空间下提前配置好关联Docker Hub账号的
imagePullSecret,否则即使制品引用路径完全正确,集群也会因为拉取权限不足出现ImagePullBackOff报错 - 核对制品源别名拼写:变量里使用的别名必须和你在发布管道制品配置页填写的名称完全一致,大小写、下划线不对都会导致变量取不到值,出现空镜像引用的执行报错
内容的提问来源于stack exchange,提问作者David Keaveny
相关产品推荐
相关产品推荐

