切换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

