配置关联路由表的私有AKS集群部署失败问题排查
私有AKS集群Terraform部署依赖问题
我用Terraform基于现有子网部署私有AKS集群,目前给路由表加了depends_on = [azurerm_kubernetes_cluster.aks]能成功部署,但觉得这种方式不合理。移除这个依赖后,AKS创建失败,报错代理节点无法连接mcr.microsoft.com的443端口,出站连接建立失败。希望不用依赖也能成功创建集群。
Terraform配置代码
resource "azurerm_kubernetes_cluster" "aks" { automatic_channel_upgrade = "patch" azure_policy_enabled = true dns_prefix = "dns-aks" location = var.rg_location name = "aks" private_cluster_enabled = true resource_group_name = var.rg_name node_resource_group = var.aks_node_resource_group default_node_pool { enable_auto_scaling = true max_count = 5 min_count = 2 max_pods = 24 name = "systempool" vm_size = "Standard_B4ms" vnet_subnet_id = azurerm_subnet.snet.id } identity { type = "SystemAssigned" } network_profile { network_plugin = "azure" load_balancer_sku = "standard" docker_bridge_cidr = "172.17.0.1/16" dns_service_ip = "10.0.0.10" service_cidr = "10.0.0.0/16" } } resource "azurerm_virtual_network" "vnet" { for_each = local.vnet name = each.value.name resource_group_name = var.rg_name location = var.rg_location address_space = each.value.address_space dns_servers = each.value.dns_servers tags = each.value.tags } resource "azurerm_subnet" "snet" { for_each = local.snet name = each.value.name resource_group_name = var.rg_name address_prefixes = each.value.address_prefix virtual_network_name = each.value.vnet_name service_endpoints = each.value.service_endpoints } resource "azurerm_route_table" "rt" { name = var.rt_name location = var.rg_location resource_group_name = var.rg_name tags = var.rt_tags depends_on = [azurerm_kubernetes_cluster.aks] } resource "azurerm_route" "udr" { for_each = local.udr name = each.key resource_group_name = var.rg_name address_prefix = each.value next_hop_in_ip_address = "172.25.3.11" next_hop_type = "VirtualAppliance" route_table_name = azurerm_route_table.rt.name }
移除depends_on后的错误信息
│ Error: 等待托管集群创建完成(订阅: "xxxx-xxxx-xxxx-xxxx" │ 资源组名称: "rg-aks" │ 资源名称: "rg-aks"): Code="CreateVMSSAgentPoolFailed" Message="无法从代理节点建立出站连接,请查看相关文档获取更多信息。详细信息: Code=\"VMExtensionProvisioningError\" Message=\"VM处理扩展'vmssCSE'时报告失败。错误信息: \\\"启用失败: 执行命令失败: 命令以退出状态50终止\n[标准输出]\n{ \\\"ExitCode\\\": \\\"50\\\", \\\"Output\\\": \\\":01:34 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0\\r 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0* 连接204.79.197.219的443端口失败: 连接超时\\n* 无法连接mcr.microsoft.com的443端口: 连接超时\\n* 关闭连接0\\ncurl: (7) 无法连接mcr.microsoft.com的443端口: 连接超时\\n\\n实际耗时\\t2m9.208s\\n用户耗时\\t0m0.023s\\n系统耗时\\t0m0.026s\\n+ exit 50\\\"}, \\\"Error\\\": \\\"\\\", \\\"ExecDuration\\\": \\\"429\\\", \\\"KernelStartTime\\\": \\\"Tue 2023-02-14 13:46:44 UTC\\\", \\\"CloudInitLocalStartTime\\\": \\\"Tue 2023-02-14 13:46:51 UTC\\\", \\\"CloudInitStartTime\\\": \\\"Tue 2023-02-14 13:46:55 UTC\\\", \\\"CloudFinalStartTime\\\": \\\"Tue 2023-02-14 13:47:03 UTC\\\", \\\"NetworkdStartTime\\\": \\\"Tue 2023-02-14 13:46:53 UTC\\\", \\\"CSEStartTime\\\": \\\"Tue Feb 14 13:47:09 UTC 2023\\\", \\\"GuestAgentStartTime\\\": \\\"Tue 2023-02-14 13:47:01 UTC\\\", \\\"SystemdSummary\\\": \\\"启动完成耗时404ms(固件) + 1.769s(加载器) + 6.208s(内核) + 5min 13.339s(用户空间) = 5min 21.722s\\ngraphical.target在用户空间启动12.507s后到达\\\", \\\"BootDatapoints\\\": { \\\"KernelStartTime\\\": \\\"Tue 2023-02-14 13:46:44 UTC\\\", \\\"CSEStartTime\\\": \\\"Tue Feb 14 13:47:09 UTC 2023\\\", \\\"GuestAgentStartTime\\\": \\\"Tue 2023-02-14 13:47:01 UTC\\\", \\\"KubeletStartTime\\\": \\\"\\\" } }\n\n[标准错误]\n\\\"\r\n\r\n更多故障排除信息可查看相关文档" Target="0"
解决方案
问题根源是移除depends_on后,路由表和自定义路由会先于AKS创建完成,且关联到AKS节点所在子网(推测子网与路由表存在隐式关联逻辑),导致AKS节点启动时所有出站流量被路由到172.25.3.11虚拟设备,而该设备可能未就绪或未配置允许访问mcr.microsoft.com的规则,造成节点无法拉取镜像,AKS创建失败。
要去掉depends_on同时正常部署,可按以下方式调整:
- 添加必要的例外路由:在自定义路由中,为mcr.microsoft.com等AKS必需的公网地址添加直接互联网路由,确保节点启动时能正常访问这些地址:
resource "azurerm_route" "mcr_exception" { name = "mcr-route" resource_group_name = var.rg_name address_prefix = "204.79.197.219/32" # mcr.microsoft.com对应IP,可根据实际情况调整前缀 next_hop_type = "Internet" route_table_name = azurerm_route_table.rt.name }
- 控制路由表与子网的关联时机:如果子网和路由表是显式关联的,将关联操作放在AKS创建完成后执行,避免节点启动时被错误路由。
- 确保虚拟设备就绪:如果必须用虚拟设备作为出口,要保证设备在AKS节点启动前就已配置好允许AKS所需服务地址的访问规则。
内容的提问来源于stack exchange,提问作者Pornpat S.
相关产品推荐
相关产品推荐

