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

配置关联路由表的私有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同时正常部署,可按以下方式调整:

  1. 添加必要的例外路由:在自定义路由中,为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
}
  1. 控制路由表与子网的关联时机:如果子网和路由表是显式关联的,将关联操作放在AKS创建完成后执行,避免节点启动时被错误路由。
  2. 确保虚拟设备就绪:如果必须用虚拟设备作为出口,要保证设备在AKS节点启动前就已配置好允许AKS所需服务地址的访问规则。

内容的提问来源于stack exchange,提问作者Pornpat S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 19:27:02