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

Terraform配置Kubernetes NGINX Ingress多Host规则访问异常排查

Azure AKS中Terraform配置NGINX Ingress多子域名异常排查与解决

问题现象

在Azure AKS环境通过Terraform配置NGINX Ingress,期望不同子域名对应不同Kubernetes Service,但出现以下异常:

  • 仅保留一个Host规则时,两个子域名均可访问
  • 不设置任何Host规则时,所有域名无法访问
  • 同时设置两个Host规则时,所有域名均无法访问

已确认各子域名的DNS A记录已正确指向负载均衡器/Ingress的IP地址。

现有配置代码

resource "helm_release" "nginx_ingress" {
  name             = "nginx-ingress"
  repository       = "https://kubernetes.github.io/ingress-nginx"
  chart            = "ingress-nginx"
  namespace        = "ingress-nginx"
  create_namespace = true
  set {
    name  = "controller.service.type"
    value = "LoadBalancer"
  }
}

resource "kubernetes_ingress_v1" "nginx_ingress" {
  metadata {
    name = "nginx-ingress"
  }

  spec {
    ingress_class_name = "nginx"

    rule {
      host = "front-end.mydomain.com" # disable to access both hosts
      http {
        path {
          path      = "/"
          path_type = "Prefix"
          backend {
            service {
              name = kubernetes_service_v1.front_end.metadata[0].name
              port {
                number = 80
              }
            }
          }
        }
      }
    }

    rule {
      host = "docs.mydomain.com"
      http {
        path {
          path      = "/"
          path_type = "Prefix"
          backend {
            service {
              name = kubernetes_service_v1.front_end.metadata[0].name
              port {
                number = 80
              }
            }
          }
        }
      }
    }
  }
}

问题原因分析

  1. 后端Service配置错误:两个Host规则均指向同一个front_end Service,不符合“不同子域名对应不同Service”的需求,同时可能导致规则匹配逻辑混乱。
  2. 缺少默认后端:当Ingress未配置defaultBackend且请求不匹配任何Host规则时,NGINX Ingress会返回404,导致无Host规则时无法访问。
  3. Ingress规则匹配逻辑误解:当仅保留一个Host规则且注释掉该规则的Host字段时,该规则会匹配所有Host的请求,因此两个域名都能访问;同时设置两个Host规则时,若后端Service异常或规则未被正确加载,会导致请求无法匹配到有效后端。
  4. IngressClass关联问题:若Helm安装的NGINX Ingress Controller未正确关联nginx类,Ingress资源无法被Controller识别处理。

解决方法

1. 修正后端Service配置

将第二个Host规则的后端Service改为对应docs服务的名称,确保不同子域名指向各自的Service:

rule {
  host = "docs.mydomain.com"
  http {
    path {
      path      = "/"
      path_type = "Prefix"
      backend {
        service {
          name = kubernetes_service_v1.docs.metadata[0].name # 替换为docs服务的资源引用
          port {
            number = 80
          }
        }
      }
    }
  }
}

2. 添加默认后端(可选)

若需要处理未匹配任何Host规则的请求,在Ingress的spec中添加default_backend:

spec {
  ingress_class_name = "nginx"
  
  # 添加默认后端
  default_backend {
    service {
      name = "default-service" # 替换为你的默认服务名称
      port {
        number = 80
      }
    }
  }

  # 后续的rule规则...
}

3. 确认IngressClass关联正确性

确保Helm安装的NGINX Ingress Controller已创建并关联nginx类,可在Helm配置中显式指定:

resource "helm_release" "nginx_ingress" {
  # 原有配置...
  set {
    name  = "controller.ingressClass.enabled"
    value = true
  }
  set {
    name  = "controller.ingressClass.name"
    value = "nginx"
  }
}

执行kubectl get ingressclasses验证nginx类是否存在。

4. 验证Ingress与后端服务状态

  • 应用配置后,执行kubectl describe ingress nginx-ingress查看Ingress事件,确认无错误、已被Controller加载。
  • 检查后端Service状态:kubectl get svc,确保front_end和docs服务均处于正常运行状态,端口配置正确。

5. 测试请求

使用curl手动指定Host头测试,验证规则匹配是否正常:

curl -H "Host: front-end.mydomain.com" http://<负载均衡器IP>
curl -H "Host: docs.mydomain.com" http://<负载均衡器IP>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 02:49:59