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

Azure Container App关联VNET后无法访问本地基础设施求助

Azure Container Apps 托管 Azure DevOps 代理无法访问 VNET 对等本地基础设施的排查方案

问题概述

已遵循微软官方指南完成 Azure Container Apps(作为 Azure DevOps 自托管代理)及配套 Container Registry 的构建与部署,但代理容器无法访问通过 VNET 对等连接的本地基础设施。部署脚本如下:

核心部署脚本

# Install extension
az extension add --name containerapp --upgrade

#Register namespaces
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights

# Environment Variables
$RESOURCE_GROUP = "[resourceGroup]"
$LANDING_RESOURCE_GROUP = "[resourceGroup]"
$LOCATION = "UKSOUTH"
$ENVIRONMENT = "[environment]"
$JOB_NAME = "azure-pipelines-agent-job"
$PLACEHOLDER_JOB_NAME = "placeholder-agent-job"
$VNET_NAME = "[vnet_name]"
$SUBNET = "[subnet]"
$SUBNET_NAME = "container-integration"

# Create resource group
az group create `
    --name "$RESOURCE_GROUP" `
    --location "$LOCATION"

## Get subnet ID
$INFRASTRUCTURE_SUBNET = az network vnet subnet show --resource-group $LANDING_RESOURCE_GROUP --vnet-name $VNET_NAME --name $SUBNET_NAME --query "id" -o tsv 
# Create the environment
az containerapp env create `
    --name "$ENVIRONMENT" `
    --resource-group "$RESOURCE_GROUP" `
    --location "$LOCATION" `
    --infrastructure-subnet-resource-id $INFRASTRUCTURE_SUBNET 

# Define container name and version
$CONTAINER_IMAGE_NAME = "azure-pipelines-agent:1.0.1"
$CONTAINER_REGISTRY_NAME = "[containerregname]"

# Variables for container jobs
$AZP_TOKEN = "[token]"
$ORGANIZATION_URL = "https://dev.azure.com/[org]"
$AZP_POOL = "container-apps"

# Create Container Registry
az acr create `
    --name $CONTAINER_REGISTRY_NAME `
    --resource-group $RESOURCE_GROUP `
    --location $LOCATION `
    --sku Basic `
    --admin-enabled true

# Docker file
az acr build `
    --registry "$CONTAINER_REGISTRY_NAME" `
    --image "$CONTAINER_IMAGE_NAME" `
    --file "dockerfile" `
    "./" 
  
# Create self-hosted agent
az containerapp job create -n $JOB_NAME -g $RESOURCE_GROUP --environment $ENVIRONMENT `
    --trigger-type Event `
    --replica-timeout 1800 `
    --replica-retry-limit 1 `
    --replica-completion-count 1 `
    --parallelism 1 `
    --image "$CONTAINER_REGISTRY_NAME.azurecr.io/$CONTAINER_IMAGE_NAME" `
    --min-executions 0 `
    --max-executions 10 `
    --polling-interval 30 `
    --scale-rule-name "azure-pipelines" `
    --scale-rule-type "azure-pipelines" `
    --scale-rule-metadata "poolName=container-apps" "targetPipelinesQueueLength=1" `
    --scale-rule-auth "personalAccessToken=personal-access-token" "organizationURL=organization-url" `
    --cpu "2.0" `
    --memory "4Gi" `
    --secrets "personal-access-token=$AZP_TOKEN" "organization-url=$ORGANIZATION_URL" `
    --env-vars "AZP_TOKEN=secretref:personal-access-token" "AZP_URL=secretref:organization-url" "AZP_POOL=$AZP_POOL" `
    --registry-server "$CONTAINER_REGISTRY_NAME.azurecr.io"

后续尝试的 Private DNS 配置脚本

# Get static IP
$ENVIRONMENT_STATIC_IP = az containerapp env show --name $ENVIRONMENT --resource-group $RESOURCE_GROUP --query properties.staticIp --out json 
# create Private DNS
$ENVIRONMENT_DEFAULT_DOMAIN = az containerapp env show --name $ENVIRONMENT --resource-group $RESOURCE_GROUP --query properties.defaultDomain --out json
# VNET ID
$VNET_ID = az network vnet show --resource-group $LANDING_RESOURCE_GROUP --name $VNET_NAME --query id --out json 
    
# Link Private DNS
az network private-dns zone create `
    --resource-group $RESOURCE_GROUP `
    --name $ENVIRONMENT_DEFAULT_DOMAIN
    
# Create Link to Private DNS Zone
az network private-dns link vnet create `
    --resource-group $RESOURCE_GROUP `
    --name $VNET_NAME `
    --virtual-network $VNET_ID `
    --zone-name $ENVIRONMENT_DEFAULT_DOMAIN -e true
    
# Create A Record
az network private-dns record-set a add-record `
    --resource-group $RESOURCE_GROUP `
    --record-set-name "*" `
    --ipv4-address $ENVIRONMENT_STATIC_IP `
    --zone-name $ENVIRONMENT_DEFAULT_DOMAIN

所用 Dockerfile 为通用 Azure DevOps 代理安装文件,无自定义网络配置。


排查与解决思路

1. 验证 VNET 对等连接有效性

  • 确认本地 VNET 与 Container Apps 环境所在 VNET 的对等连接状态为已连接,检查双方是否均正确配置了目标 VNET ID 及必要权限
  • 核对对等连接的路由表:确保本地基础设施子网的路由包含 Container Apps 子网的地址范围,反之亦然,无路由缺失或冲突
  • 检查对等连接的网关传输设置:若无跨网关访问需求,确保未启用该选项,避免路由异常

2. 检查 Container Apps 子网的网络限制

  • 验证--infrastructure-subnet-resource-id指定的子网属于与本地对等的 VNET,且子网关联的**网络安全组(NSG)**允许:
    • 代理容器出站访问本地基础设施的端口/协议
    • 必要的入站流量(若有双向访问需求)
  • 检查子网的服务端点与专用链接配置:若本地基础设施通过专用链接暴露,需确保 Container Apps 子网已启用对应服务的服务端点,或已配置专用链接连接

3. 修正 Private DNS 配置错误

  • 原脚本中获取静态 IP 和默认域名时使用--out json会返回带引号的字符串,导致后续 DNS 操作失败,需改为-o tsv去除引号:
    # 修正后的静态IP获取命令
    $ENVIRONMENT_STATIC_IP = az containerapp env show --name $ENVIRONMENT --resource-group $RESOURCE_GROUP --query properties.staticIp -o tsv
    # 修正后的默认域名获取命令
    $ENVIRONMENT_DEFAULT_DOMAIN = az containerapp env show --name $ENVIRONMENT --resource-group $RESOURCE_GROUP --query properties.defaultDomain -o tsv
    
  • 确认 Private DNS 区域已正确链接到对等 VNET,且-e true(自动注册)已启用,确保本地网络能解析 Container Apps 实例的 DNS 记录
  • 若本地基础设施使用自定义域名,需在 Azure Private DNS 中添加对应的 A/CNAME 记录,或确保本地 DNS 服务器能解析代理容器的地址

4. 直接测试代理容器的网络连通性

  • 在 Dockerfile 中添加网络测试工具(仅用于排查),例如:
    RUN apt-get update && apt-get install -y iputils-ping telnet netcat-traditional
    
  • 通过 Azure 门户进入运行中的代理容器控制台,执行ping <本地IP>、telnet <本地IP> <端口>等命令,定位问题是 DNS 解析失败、路由不可达还是防火墙拦截

5. 确认 Container Registry 的访问权限

  • 若代理需要从本地拉取资源,确保 Container Registry 允许 Container Apps 子网及本地网络访问;若使用专用链接,需验证专用链接配置正确
  • 检查部署脚本中--registry-server参数配置正确,且 Container Apps 已通过 secrets 或托管身份获得 ACR 的访问权限

内容的提问来源于stack exchange,提问作者joko_88

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 09:59:55