AWS上1主3节点K8s集群Ingress IP不可达及同IP区分服务问题
一、先解决外部无法访问Ingress公网IP的问题
从你的kubectl get ing输出和描述来看,Ingress已经绑定了节点公网IP,但外部访问不通,你可以按以下步骤逐一排查:
检查节点安全组/防火墙规则:
因为Ingress用的是集群节点的公网IP,这个节点的安全组必须允许**80端口(如果用HTTPS还要加443)**的入站请求,来源可以设为0.0.0.0/0或者你需要的外部IP范围。如果节点本身有防火墙(比如iptables、ufw),也要确保对应端口对外开放。确认Ingress Controller的运行状态:
先找到Ingress Controller所在的命名空间(通常是ingress-nginx,不同控制器可能有差异),执行命令查看pod状态:kubectl get pods -n ingress-nginx确保所有pod都是
Running状态,没有重启或CrashLoopBackOff的情况。如果有异常,查看pod日志定位问题:kubectl logs <ingress-controller-pod-name> -n ingress-nginx验证Ingress Controller的Service配置:
Ingress Controller的Service一般是NodePort类型(或者用hostNetwork模式直接绑定节点端口),执行命令查看详情:kubectl get svc -n ingress-nginx如果是NodePort,确认80端口映射的NodePort(比如30080)是否在节点安全组/防火墙中开放;如果是hostNetwork模式,直接检查节点的80端口是否能被外部访问。
测试集群内部的Ingress规则是否生效:
在集群内启动一个临时pod,用curl测试域名是否能访问到后端服务:kubectl run -it --rm curl-test --image=curlimages/curl -- curl http://2048.exam.com如果能正常返回服务内容,说明Ingress规则配置没问题,问题出在外部到节点的网络链路;如果返回错误,检查Ingress的后端服务是否正常运行(
kubectl get pods -n 2048-game),以及Service是否能正常访问。
二、同一个IP区分不同服务的方法
这正是Ingress的核心能力——通过HTTP请求的Host头部来区分不同服务,你的Ingress配置已经正确设置了HOSTS字段,具体使用方式如下:
本地测试(无需域名解析):
修改本地的hosts文件,将两个域名指向Ingress的公网IP:- Linux/macOS:编辑
/etc/hosts,添加两行:1.2.3.4 2048.exam.com 1.2.3.4 bar.baz.com - Windows:编辑
C:\Windows\System32\drivers\etc\hosts(需要管理员权限),添加同样的内容。
之后直接在浏览器访问http://2048.exam.com或http://bar.baz.com,就能分别访问到对应的2048游戏和echomap服务了。
- Linux/macOS:编辑
用curl命令指定Host头测试:
不想修改hosts的话,可以用curl的-H参数指定Host头部:# 访问2048-game服务 curl -H "Host: 2048.exam.com" http://1.2.3.4 # 访问echomap服务 curl -H "Host: bar.baz.com" http://1.2.3.4生产环境配置:
如果要对外提供服务,只需要在你的域名服务商处,将2048.exam.com和bar.baz.com这两个域名的A记录解析到1.2.3.4这个公网IP即可,用户直接访问域名就能自动匹配到对应的服务。
内容的提问来源于stack exchange,提问作者Ravichandra

