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

切换Ingress使用host路径替代defaultBackend后网站无法访问求助

问题描述

在Kubernetes集群中配置Ingress时,使用defaultBackend能正常工作,但添加host规则后Ingress失效。访问www.example.com或www.example.com/时网站无法打开,不过直接访问localhost:30001可以正常显示网站。

已完成的配置检查:

  • hosts文件已将www.example.com指向127.0.0.1
  • 使用Docker Desktop自带的Kubernetes v1.27.2
  • 通过Helm安装了NGINX Ingress Controller
  • 后端服务example-gui的NGINX服务器监听8080端口,且nginx.conf中http.server.server_name设为www.example.com
  • 执行kubectl get ing/kubectl get po/kubectl get svc能看到所有相关资源状态正常
  • 未使用代理或VPN

提供的配置清单如下:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: example-gui
    example: example-gui
    version: "0.1.0"
  name: example-gui
  namespace: exampleplus
spec:
  replicas: 1
  selector:
    matchLabels:
      app: example-gui
  template:
    metadata:
      labels:
        app: example-gui
        example: example-gui
        version: "2.0.4"
    spec:
      containers:
        - image: example-gui:0.1.0
          name: example-gui
          env:
            - name: DNS_SERVER
              value: kube-dns.kube-system.svc.cluster.local
          ports:
            - containerPort: 8080
          imagePullPolicy: IfNotPresent
      restartPolicy: Always      
---
apiVersion: v1
kind: Service
metadata:
  labels:
    example: example-gui
  name: example-gui
  namespace: exampleplus
spec:
  type: NodePort
  ports:
    - name: "example-gui-tcp"
      port: 8080
      targetPort: 8080
      nodePort: 30001
      protocol: TCP
  selector:
    example: example-gui
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-example-gui
  namespace: exampleplus
spec:
  ingressClassName: nginx
  rules:
    - host: "www.example.com" # port 80 is assumed
      http:
        paths:
          - pathType: Prefix
            path: /
            backend:
              service:
                name: example-gui
                port:
                  number: 8080    
排查与解决方案

1. 确认Ingress Controller端口映射状态

Docker Desktop的Kubernetes中,NGINX Ingress Controller默认会绑定宿主机80/443端口,但需确认映射是否正常。执行命令查看控制器服务:

kubectl get svc -n ingress-nginx

若ingress-nginx-controller的EXTERNAL-IP显示为Pending,手动转发端口后再测试:

kubectl port-forward svc/ingress-nginx-controller -n ingress-nginx 80:80

2. 验证Ingress规则是否加载

查看Ingress Controller日志,确认www.example.com的规则被正确加载:

kubectl logs -n ingress-nginx deployment/ingress-nginx-controller

若未找到对应host的配置,检查IngressClass是否匹配:

kubectl get ingressclass

确保nginx类存在,且控制器使用的是该类。

3. 测试后端服务的Host头兼容性

在后端Pod内直接测试,确认服务接受带www.example.com的Host头请求:

kubectl exec -it <example-gui-pod-name> -n exampleplus -- curl http://localhost:8080 -H "Host: www.example.com"

若返回404,需调整后端NGINX配置,确保server_name包含www.example.com或配置默认server块。

4. 检查请求头传递是否正常

用curl模拟浏览器请求,确认Host头正确发送:

curl http://www.example.com -v

查看输出中是否包含Host: www.example.com,以及响应状态码,结合Ingress日志定位问题。

5. 修正Service的Selector匹配

Deployment的Pod标签包含app: example-gui和example: example-gui,而Service的Selector仅为example: example-gui,虽然当前NodePort访问正常,但建议统一Selector规则(比如将Service的Selector改为app: example-gui),避免潜在匹配问题。

6. 确认Ingress Controller命名空间

若Helm安装时使用了自定义命名空间,需确认Ingress的ingressClassName对应的控制器在正确命名空间内。默认Helm安装的控制器在ingress-nginx命名空间,确保Ingress配置的ingressClassName与控制器的类一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:02:39