能否通过Terraform配置AKS路由表指向对等VNet的Hub NAT GW?
问题解答
核心结论
完全可以让Spoke VNet中的AKS将0.0.0.0/0流量路由到Hub VNet的NAT网关,问题出在不能仅依赖AKS的network_profile直接指定跨VNet的NAT网关,需要结合自定义路由表和AKS的路由覆盖配置来实现。
具体实现步骤
1. 确认Hub-Spoke对等连接的路由传递配置
- 确保Hub VNet到Spoke VNet的对等连接开启允许网关传输(Allow gateway transit)
- 确保Spoke VNet到Hub VNet的对等连接开启使用远程网关(Use remote gateways)
- 验证Hub VNet的NAT网关所在子网的路由表配置正确,且Spoke VNet可通过对等连接访问该NAT网关
2. 为AKS子网配置自定义路由表
创建自定义路由表并添加以下规则:
- 地址前缀:
0.0.0.0/0 - 下一跳类型:
虚拟网络对等连接 - 下一跳目标:Hub VNet的对等连接对象
- 将该路由表关联到AKS的节点子网,若使用Azure CNI模式,需同时关联Pod子网
3. 调整AKS的网络配置,禁用自带出站NAT
在Terraform的AKS配置中,指定使用用户自定义路由,禁用AKS自动创建的NAT网关:
resource "azurerm_kubernetes_cluster" "aks" { # 其他基础配置... network_profile { network_plugin = "azure" # 或"kubenet",根据实际网络模式调整 outbound_type = "userDefinedRouting" # 关键:指定使用自定义路由 load_balancer_sku = "standard" # 若之前配置过nat_gateway_profile,需移除或设置enabled = false # nat_gateway_profile { # enabled = false # } } }
注意:如果使用Kubenet模式,需删除AKS自动关联的默认路由表,避免其优先级高于自定义路由。
4. 验证路由生效
部署完成后,登录AKS节点或Pod执行以下命令验证:
# 查看节点路由表 ip route show # 测试出站流量源IP是否为Hub NAT网关的公网IP curl ifconfig.me
常见坑点排查
- 路由优先级:若AKS自动创建的路由优先级更高,需删除AKS自动关联的路由表,确保自定义路由表生效
- CNI模式Pod路由:Azure CNI模式下Pod路由继承节点子网配置,需确保Pod子网也关联了自定义路由表
- 对等连接流量权限:确认Hub与Spoke的对等连接未限制双向流量,允许出站/入站通行
内容的提问来源于stack exchange,提问作者Sven
相关产品推荐
相关产品推荐

