使用Terraform将Kubernetes服务接入Azure Traffic Manager报错咨询
根因说明
- 端点类型配置错误:
nestedEndpoints类型仅用于嵌套挂载其他Traffic Manager实例,不能用于挂载AKS服务的公网IP - 目标资源ID不合法:你当前传入的是AKS集群本身的资源ID,Traffic Manager要求
AzureEndpoints类型必须传入对应服务的公网IP资源ID,而非集群ID - 跨订阅权限缺失:AKS默认将LoadBalancer类型服务的公网IP创建在自动生成的
MC_开头的节点资源组(部分场景会归属到独立的网络订阅),部署账号需要对该IP所在的订阅/资源组有读取权限
修复步骤
1. 读取AKS服务公网IP的资源ID
先通过azurerm_public_ip数据源获取你K8s服务对应公网IP的资源ID,若IP在其他订阅需明确指定订阅ID:
data "azurerm_public_ip" "aks_service_ip" { name = "你的公网IP资源名称" resource_group_name = "AKS对应MC_开头的节点资源组名称" # 若IP在其他订阅,取消注释下方配置填写对应订阅ID # subscription_id = "公网IP所在订阅的ID" }
2. 修正Traffic Manager端点配置
将端点类型改为azureEndpoints,替换目标资源ID为公网IP的ID,补充区域配置:
resource "azurerm_traffic_manager_endpoint" "tmep" { name = lower("${var.customer4letter}-${var.env3letter}-${var.locationid3letter}-${var.servicetype}-tmep") resource_group_name = azurerm_resource_group.rg.name profile_name = azurerm_traffic_manager_profile.tmp.name # 修正端点类型为Azure端点 type = "azureEndpoints" weight = 1000 # 替换为公网IP的资源ID target_resource_id = data.azurerm_public_ip.aks_service_ip.id # 补充端点所在区域,与公网IP区域一致 endpoint_location = var.location }
3. 配置跨订阅权限
确保执行Terraform部署的服务主体/用户账号,满足以下权限要求:
- 对公网IP所在的订阅/资源组有至少读取权限
- 对Traffic Manager所在的资源组有写入权限
- 若使用多订阅部署,可在azurerm provider配置中添加
additional_subscription_ids参数纳入IP所在订阅
注意事项
- 若需要避免公网IP被创建到默认的MC资源组,可提前在指定资源组创建公网IP,给AKS服务主体分配该资源组的网络权限,部署LoadBalancer服务时添加
service.beta.kubernetes.io/azure-load-balancer-resource-group注解指定IP所在资源组即可 - Traffic Manager的监控探测路径需和K8s服务的实际健康检查路径匹配,确保探测返回200状态码
- 多集群部署场景下每个集群的服务公网IP需要对应创建独立的Traffic Manager端点
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

