如何在Azure Container App Service中部署带私有访问的AzureDevOps自托管代理?
在Azure Container Apps中部署带私有访问的Azure DevOps Server自托管代理(支持KEDA)
我在环境中实现过这个方案,以下是完整的部署步骤,涵盖私有访问配置和KEDA自动缩放:
一、前置准备
- 拥有Azure订阅,权限足够创建Container Apps环境、Container Apps、KEDA相关资源
- 可访问的Azure DevOps Server实例(需在私有网络内可达),提前获取代理池的注册令牌和服务器URL
- 本地或云端的Docker环境,用于构建自定义代理镜像
- 私有Azure Container Registry(ACR),用来存储自定义镜像(适配私有访问场景)
二、构建自定义ADO自托管代理镜像
官方代理镜像可能缺少私有网络访问所需的证书或构建工具,需要自定义:
- 创建
Dockerfile,基于官方镜像扩展:
FROM mcr.microsoft.com/azure-pipelines/vsts-agent:ubuntu-22.04 # (可选)添加私有CA证书,如果你的ADO Server使用自签名证书 COPY ./your-root-ca.crt /usr/local/share/ca-certificates/ RUN update-ca-certificates # (可选)安装构建所需工具,比如Azure CLI RUN apt-get update && apt-get install -y curl && \ curl -sL https://aka.ms/InstallAzureCLIDeb | bash WORKDIR /azp
- 构建并推送到私有ACR:
# 登录你的ACR az acr login --name <你的ACR名称> # 构建镜像 docker build -t <你的ACR名称>.azurecr.io/ado-agent:latest . # 推送到ACR docker push <你的ACR名称>.azurecr.io/ado-agent:latest
三、创建带私有访问的Container Apps环境
要实现私有访问,需要将Container Apps环境部署到虚拟网络内,禁止公共访问:
- 创建私有Container Apps环境:
az containerapp env create \ --name <环境名称> \ --resource-group <资源组名称> \ --location <区域> \ --vnet <虚拟网络名称> \ --subnet <子网名称> \ --internal-only true
说明:
--internal-only true会让环境仅在虚拟网络内可访问,不暴露公共IP
- 打通ACR与Container Apps环境的网络连接:
通过为ACR创建私有端点,确保Container Apps能在私有网络内拉取镜像:
az network private-endpoint create \ --name acr-private-endpoint \ --resource-group <资源组名称> \ --vnet-name <虚拟网络名称> \ --subnet <子网名称> \ --private-connection-resource-id "/subscriptions/<订阅ID>/resourceGroups/<资源组名称>/providers/Microsoft.ContainerRegistry/registries/<你的ACR名称>" \ --group-id registry
四、部署带KEDA自动缩放的自托管代理
利用KEDA的Azure Pipelines触发器,根据代理池的队列长度自动缩放代理数量:
- 准备Container Apps配置文件
containerapp.yaml:
properties: managedEnvironmentId: "/subscriptions/<订阅ID>/resourceGroups/<资源组名称>/providers/Microsoft.App/managedEnvironments/<环境名称>" configuration: secrets: - name: ado-reg-token value: "<你的ADO代理池注册令牌>" - name: acr-password value: "<你的ACR密码>" registries: - server: "<你的ACR名称>.azurecr.io" username: "<你的ACR用户名>" passwordSecretRef: "acr-password" template: containers: - name: ado-agent image: "<你的ACR名称>.azurecr.io/ado-agent:latest" command: ["/azp/start.sh"] env: - name: AZP_URL value: "<你的ADO Server URL>" - name: AZP_TOKEN secretRef: "ado-reg-token" - name: AZP_POOL value: "<你的代理池名称>" - name: AZP_AGENT_NAME value: "containerapp-agent-$(CONTAINER_APP_REPLICA_NAME)" scale: minReplicas: 0 # 空闲时缩放到0个副本 maxReplicas: 10 # 最大副本数根据需求调整 rules: - name: keda-ado-queue type: azure-pipelines metadata: poolID: "<你的代理池ID>" organizationURL: "<你的ADO Server URL>" personalAccessToken: "<你的ADO PAT(需有代理池管理权限)>" targetPipelinesQueueLength: "1" # 队列长度超过1时触发扩容
注意:
AZP_AGENT_NAME使用环境变量确保每个代理副本名称唯一;KEDA触发器的PAT需要至少拥有读取代理池队列的权限
- 部署Container Apps:
az containerapp create \ --name <Container App名称> \ --resource-group <资源组名称> \ --yaml containerapp.yaml
五、验证部署
- 查看代理启动日志,确认注册成功:
az containerapp logs show --name <Container App名称> --resource-group <资源组名称> --follow
如果日志中出现Successfully registered agent,说明代理已成功连接到ADO Server
- 测试KEDA自动缩放:
触发一个或多个ADO构建任务,然后查看副本数变化:
az containerapp show --name <Container App名称> --resource-group <资源组名称> --query properties.template.scale.currentReplicas
同时在Azure DevOps Server的代理池中可以看到在线代理数量随队列长度变化
六、关键注意事项
- 确保ADO Server的URL在Container Apps所在的虚拟网络内可达,如果是私有ADO Server,需要打通虚拟网络连接
- KEDA触发器使用的PAT需要定期轮换,避免过期导致缩放失效
- 自定义镜像中按需添加构建工具(如.NET、Node.js、Docker等),满足你的流水线需求
- 私有访问的Container Apps无法从公网直接访问,所有代理的通信都在私有网络内完成
内容的提问来源于stack exchange,提问作者Vowneee
相关产品推荐
相关产品推荐

