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
相关产品推荐
相关产品推荐

