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

AKS集群静态IP、负载均衡器与Ingress控制器配置求助

AKS集群配置静态公网IP关联Ingress-Nginx失败问题

核心需求

为AKS上的应用配置带DNS的静态公网IP,采用官方推荐的Helm安装ingress-nginx控制器方案(弃用生产环境不建议的http_application_routing)。

当前配置状态

  1. 已通过Terraform在自定义资源组fixit-resource-group创建AKS集群和静态公网IP,这部分操作正常。
  2. 尝试通过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. 验证步骤

  1. 重新执行terraform apply,确保所有资源创建完成。
  2. 执行kubectl get svc -n default查看ingress-nginx服务,确认EXTERNAL-IP为指定静态IP且状态为LoadBalancer。
  3. 部署测试应用和Ingress规则,验证通过静态IP的访问连通性。

内容的提问来源于stack exchange,提问作者Vincenzo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:30:42