AKS集群静态IP、负载均衡器与Ingress控制器配置求助
AKS集群配置静态公网IP关联Ingress-Nginx失败问题
核心需求
为AKS上的应用配置带DNS的静态公网IP,采用官方推荐的Helm安装ingress-nginx控制器方案(弃用生产环境不建议的http_application_routing)。
当前配置状态
- 已通过Terraform在自定义资源组
fixit-resource-group创建AKS集群和静态公网IP,这部分操作正常。 - 尝试通过Terraform+Helm部署ingress-nginx控制器,配置中指定自定义资源组的静态IP,但部署失败。
关键Terraform配置片段
资源组与AKS集群
resource "azurerm_resource_group" "resource_group" { name = var.resource_group_name location = var.location tags = { Environment = "Test" Team = "DevOps" } } resource "azurerm_kubernetes_cluster" "server_cluster" { name = "server_cluster" location = azurerm_resource_group.resource_group.location resource_group_name = azurerm_resource_group.resource_group.name dns_prefix = "fixit" kubernetes_version = var.kubernetes_version default_node_pool { name = "default" node_count = 1 min_count = 1 max_count = 3 vm_size = "standard_b4ms" type = "VirtualMachineScaleSets" enable_auto_scaling = true enable_host_encryption = false } service_principal { client_id = var.sp_client_id client_secret = var.sp_client_secret } tags = { Environment = "Production" } linux_profile { admin_username = "azureuser" ssh_key { key_data = var.ssh_key } } network_profile { network_plugin = "kubenet" load_balancer_sku = "standard" } http_application_routing_enabled = false }
静态公网IP(自定义资源组)
resource "azurerm_public_ip" "public-ip" { name = "fixit-public-ip" location = var.location resource_group_name = var.resource_group_name allocation_method = "Static" domain_name_label = "fixit" sku = "Standard" }
Ingress-Nginx Helm配置
resource "helm_release" "nginx" { name = "ingress-nginx" repository = "https://kubernetes.github.io/ingress-nginx" chart = "ingress-nginx" namespace = "default" set { name = "rbac.create" value = "false" } set { name = "controller.service.externalTrafficPolicy" value = "Local" } set { name = "controller.service.loadBalancerIP" value = var.public_ip_address } set { name = "controller.service.annotations.service.beta.kubernetes.io/azure-load-balancer-internal" value = "true" } set { name = "controller.service.annotations.service\\.beta\\.kubernetes\\.io/azure-load-balancer-health-probe-request-path" value = "/healthz" } }
报错信息
Terraform部署Helm release时失败:
Warning: Helm release "ingress-nginx" was created but has a failed status. Use the `helm` command to investigate the error, correct it, then run Terraform again. │ │ with module.ingress_controller.helm_release.nginx, │ on modules/ingress_controller/controller.tf line 2, in resource "helm_release" "nginx": │ 2: resource "helm_release" "nginx" { │ ╵ ╷ │ Error: timed out waiting for the condition │ │ with module.ingress_controller.helm_release.nginx, │ on modules/ingress_controller/controller.tf line 2, in resource "helm_release" "nginx": │ 2: resource "helm_release" "nginx" {
通过kubectl查看发现:AKS自动创建的节点资源组MC_fixit-resource-group_server_cluster_westeurope无法找到自定义资源组内的静态IP;若改用节点资源组内的公网IP,Terraform仍报错,但kubectl显示IP已分配。
核心困惑
AKS存在两个资源组:自定义资源组(仅含AKS服务资源)、节点资源组(含集群基础设施资源),不清楚kubernetes_service、azurerm_public_ip这类资源应归属哪个资源组,以及如何正确将静态IP关联到Ingress控制器。
解决方案
1. 资源组分工明确
- 自定义资源组:存放你手动创建的可控资源,比如AKS集群本身、静态公网IP、数据库等由你直接管理的资源。
- 节点资源组(MC-前缀):AKS自动创建并维护的基础设施资源组,包含节点VM、默认负载均衡器、虚拟网络等,请勿手动修改该组内资源。
2. 赋予AKS访问自定义资源组的权限
AKS服务主体默认无权限访问自定义资源组内的资源,需为其添加**网络参与者(Network Contributor)**权限到自定义资源组,使其能找到并绑定静态IP。
在Terraform中添加权限配置:
resource "azurerm_role_assignment" "aks_sp_network_contributor" { scope = azurerm_resource_group.resource_group.id role_definition_name = "Network Contributor" principal_id = azurerm_kubernetes_cluster.server_cluster.kubelet_identity[0].object_id }
3. 修正Ingress-Nginx的Helm配置
- 移除
azure-load-balancer-internal: true注解(需要公网IP而非内部负载均衡)。 - 添加指定静态IP所在资源组的注解,明确控制器查找IP的位置。
- 开启RBAC(生产环境建议),直接引用IP资源属性避免传参错误。
修正后的Helm配置:
resource "helm_release" "nginx" { name = "ingress-nginx" repository = "https://kubernetes.github.io/ingress-nginx" chart = "ingress-nginx" namespace = "default" set { name = "rbac.create" value = "true" } set { name = "controller.service.externalTrafficPolicy" value = "Local" } set { name = "controller.service.loadBalancerIP" value = azurerm_public_ip.public-ip.ip_address } set { name = "controller.service.annotations.service\\.beta\\.kubernetes\\.io/azure-load-balancer-resource-group" value = azurerm_resource_group.resource_group.name } set { name = "controller.service.annotations.service\\.beta\\.kubernetes\\.io/azure-load-balancer-health-probe-request-path" value = "/healthz" } }
4. 清理无效资源
删除多余的kubernetes_service "cluster-ingress"资源,Ingress-Nginx控制器会自动创建对应的LoadBalancer服务,避免资源冲突。
5. 验证步骤
- 重新执行
terraform apply,确保所有资源创建完成。 - 执行
kubectl get svc -n default查看ingress-nginx服务,确认EXTERNAL-IP为指定静态IP且状态为LoadBalancer。 - 部署测试应用和Ingress规则,验证通过静态IP的访问连通性。
内容的提问来源于stack exchange,提问作者Vincenzo
相关产品推荐
相关产品推荐

