You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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自托管代理镜像

官方代理镜像可能缺少私有网络访问所需的证书或构建工具,需要自定义:

  1. 创建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
  1. 构建并推送到私有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环境部署到虚拟网络内,禁止公共访问:

  1. 创建私有Container Apps环境:
az containerapp env create \
  --name <环境名称> \
  --resource-group <资源组名称> \
  --location <区域> \
  --vnet <虚拟网络名称> \
  --subnet <子网名称> \
  --internal-only true

说明:--internal-only true会让环境仅在虚拟网络内可访问,不暴露公共IP

  1. 打通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触发器,根据代理池的队列长度自动缩放代理数量:

  1. 准备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需要至少拥有读取代理池队列的权限

  1. 部署Container Apps:
az containerapp create \
  --name <Container App名称> \
  --resource-group <资源组名称> \
  --yaml containerapp.yaml

五、验证部署

  1. 查看代理启动日志,确认注册成功:
az containerapp logs show --name <Container App名称> --resource-group <资源组名称> --follow

如果日志中出现Successfully registered agent,说明代理已成功连接到ADO Server

  1. 测试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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 17:50:43