Azure DevOps与Kubernetes自托管代理的架构解析

Azure DevOps允许在Kubernetes集群上部署自托管代理,以扩展CI/CD管道的执行能力。以下是关键架构组件和工作原理的解析。

Kubernetes自托管代理的核心组件

代理Pod模板
代理以Pod形式运行在Kubernetes集群中,通过docker run命令或Helm Chart部署。Pod模板需包含:

  • Azure DevOps代理镜像(如mcr.microsoft.com/azure-pipelines/vsts-agent:ubuntu-20.04
  • 环境变量(如AZP_URLAZP_TOKENAZP_POOL
  • 资源限制(CPU/内存请求与限制)

服务账户与RBAC
代理Pod需要配置具有适当权限的Kubernetes ServiceAccount,通常需授予以下权限:

  • Pod创建/删除(用于动态生成构建Pod)
  • 持久卷声明(如需构建缓存)
  • 网络策略(允许与Azure DevOps服务通信)

工作流程与交互机制

代理注册与任务分配

  1. 代理Pod启动后,通过环境变量中的AZP_URLAZP_TOKEN向Azure DevOps注册。
  2. Azure DevOps将任务分配到代理所属的代理池,触发Pod内任务执行器启动。

动态构建环境
任务运行时可能生成临时Pod(如kaniko构建镜像),这些Pod由代理Pod通过Kubernetes API动态创建。构建完成后,临时Pod自动销毁。

网络与安全配置

出站连接要求
代理Pod需允许访问以下Azure DevOps端点:

  • dev.azure.com(HTTPS 443)
  • vstsagentpackage.azureedge.net(代理二进制下载)

入站安全策略
建议通过NetworkPolicy限制代理Pod的入站流量,仅允许来自Azure DevOps控制平面的连接。

扩展性与弹性设计

水平自动扩展(HPA)
通过Kubernetes HorizontalPodAutoscaler实现代理自动扩缩容,指标通常包括:

  • 待处理任务队列长度
  • Pod CPU/内存使用率

故障恢复机制

  • 代理Pod崩溃后由Kubernetes自动重启
  • Azure DevOps自动重新分配失败任务到其他可用代理

典型部署模式示例

Helm Chart配置片段

agent:
  count: 3
  image: mcr.microsoft.com/azure-pipelines/vsts-agent:ubuntu-20.04
  envVars:
    AZP_URL: https://dev.azure.com/your-org
    AZP_TOKEN: "your-pat-token"
    AZP_POOL: k8s-pool
resources:
  requests:
    cpu: "1"
    memory: "2Gi"

此架构通过Kubernetes的声明式管理能力,实现了代理的高效调度和资源隔离,适合大规模CI/CD工作负载场景。

更多推荐