Ingress-Nginx访问LoadBalancer外部IP出现404 Not Found求助
问题原因及解决办法
核心原因:直接访问LB IP无匹配的Ingress规则
你的Ingress配置里只定义了factory.**.com和api.factory.**.com这两个域名的路由规则,Nginx Ingress Controller是根据请求的Host头来匹配后端服务的。当你直接访问LoadBalancer的外部IP时,请求的Host头就是这个IP地址,没有任何规则能匹配它,所以控制器返回404错误。
另外从Ingress描述里能看到Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>),这意味着当没有规则匹配请求时,控制器找不到默认的兜底后端,也会加重404的出现,但这不是你当前问题的核心。
解决办法
1. 用配置的域名访问(推荐生产环境)
- 把
factory.**.com和api.factory.**.com解析到Ingress Controller的外部IPaa************.us-east-1.elb.amazonaws.com - 访问时使用对应域名:
- 访问
http://factory.**.com→ 转发到factory服务的80端口 - 访问
http://api.factory.**.com→ 转发到factory服务的8082端口
- 访问
2. 本地hosts映射临时测试
如果只是临时验证服务,不想改域名解析,可以修改本地hosts文件:
- Linux/macOS:编辑
/etc/hosts,Windows:编辑C:\Windows\System32\drivers\etc\hosts - 添加以下内容:
aa************.us-east-1.elb.amazonaws.com factory.**.com aa************.us-east-1.elb.amazonaws.com api.factory.**.com
保存后用域名访问即可。
3. 添加IP匹配的Ingress规则(不推荐生产)
如果一定要通过IP访问,可以新增一条不带Host的Ingress规则:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: factory-ip-access namespace: kerberos-factory annotations: kubernetes.io/ingress.class: nginx spec: rules: - http: paths: - path: / pathType: Prefix backend: service: name: factory port: number: 80
应用后直接访问IP会转发到factory服务的80端口,但生产环境不建议这么做,因为LB IP可能会变动。
可选:修复默认后端
如果想消除Ingress描述里的默认后端错误提示,可以安装官方默认后端服务:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/docs/examples/http-svc.yaml
内容的提问来源于stack exchange,提问作者Kennedy Daniel
相关产品推荐
相关产品推荐

