Kubernetes中Ingress域名映射异常排查与最佳实践咨询
Kubernetes Ingress域名映射异常排查与解决方案
问题根因
核心矛盾点在于请求的路由路径差异:
- 服务器本地访问时,hosts指向的是MetalLB分配给Ingress控制器的外部IP,请求直接命中Ingress控制器的80端口,匹配Ingress规则后正常转发到后端服务;
- 本地电脑hosts指向服务器本身IP时,访问域名的80端口会触发服务器本地的默认服务(比如自带的Nginx进程),而非Ingress控制器,因此返回404;
- 加NodePort访问时,直接绕过服务器本地的80端口,命中Ingress控制器的NodePort端口,所以能正常连接服务。
解决步骤
1. 确认Ingress控制器的外部IP与端口配置
先查看Ingress控制器的Service状态,确认MetalLB已分配有效外部IP:
kubectl get svc -n ingress-nginx
确保输出中EXTERNAL-IP字段有值,且端口映射包含80:xxxx/TCP、443:yyyy/TCP(xxxx/yyyy对应NodePort或ClusterPort)。
2. 修正本地hosts配置
将本地电脑的hosts文件,把域名指向MetalLB分配给Ingress控制器的外部IP,而非服务器本身的IP:
# 示例:替换为你的MetalLB外部IP 192.168.1.100 localhost.com
3. 开放服务器防火墙端口
确保服务器的80/443端口对外开放,允许外部请求进入:
# UFW防火墙 sudo ufw allow 80/tcp sudo ufw allow 443/tcp # 若用iptables sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
4. 备选:端口转发方案(若无法访问MetalLB外部IP)
如果本地网络无法直接访问MetalLB的外部IP,可在服务器上配置端口转发,将服务器的80/443端口转发到Ingress控制器的NodePort:
# 转发80端口到Ingress的HTTP NodePort(示例为33721) sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 33721 # 转发443端口到Ingress的HTTPS NodePort(替换为实际端口) sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 33722
也可用Nginx反向代理(服务器需安装Nginx),创建配置文件/etc/nginx/sites-available/ingress-proxy:
server { listen 80; server_name localhost.com; location / { proxy_pass http://localhost:33721; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
启用配置并重启Nginx:
sudo ln -s /etc/nginx/sites-available/ingress-proxy /etc/nginx/sites-enabled/ sudo nginx -s reload
最佳实践
- 优先使用MetalLB LoadBalancer模式:给Ingress控制器分配固定外部IP,让集群内外请求直接命中Ingress控制器,避免额外的端口转发配置。
- 规范Ingress资源配置:确保Ingress规则的
host字段与域名完全一致,路径匹配规则符合业务需求,示例:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: rules: - host: localhost.com http: paths: - path: / pathType: Prefix backend: service: name: your-service-name port: number: 80
- 生产环境用DNS解析替代hosts:将域名解析到Ingress控制器的外部IP,实现自动路由分发,避免手动维护hosts文件。
- 开启Ingress日志排查问题:遇到异常时,实时查看Ingress控制器日志定位问题:
kubectl logs -n ingress-nginx deployment/ingress-nginx-controller -f
内容的提问来源于stack exchange,提问作者hosein zare
相关产品推荐
相关产品推荐

