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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 04:35:08