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 } } } } } } } }
问题原因分析
- 后端Service配置错误:两个Host规则均指向同一个
front_endService,不符合“不同子域名对应不同Service”的需求,同时可能导致规则匹配逻辑混乱。 - 缺少默认后端:当Ingress未配置
defaultBackend且请求不匹配任何Host规则时,NGINX Ingress会返回404,导致无Host规则时无法访问。 - Ingress规则匹配逻辑误解:当仅保留一个Host规则且注释掉该规则的Host字段时,该规则会匹配所有Host的请求,因此两个域名都能访问;同时设置两个Host规则时,若后端Service异常或规则未被正确加载,会导致请求无法匹配到有效后端。
- 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
相关产品推荐
相关产品推荐

