Rancher部署Kubernetes集群后Ingress访问IP问题咨询
解决Rancher集群中Ingress访问IP的问题
首先咱们拆解下你遇到的核心矛盾:为什么Ingress显示两个对应VM的IP,但访问VM#1跳Rancher UI,VM#2却连接超时?
问题根源分析
- 端口冲突:你在VM#1上同时部署了Rancher服务器(Docker容器)和K8s的control-plane/worker节点。Rancher默认会抢占节点的80/443端口,而NGINX Ingress Controller同样需要监听这两个端口处理外部请求——这就导致Ingress的端口被Rancher占用,所以你访问VM#1的IP时,打开的是Rancher UI而非Ingress路由的服务。
- VM#2端口未开放:VM#2作为纯worker节点,Ingress Controller的Pod应该已经部署在上面,但你的防火墙/安全组大概率没开放80/443端口,或者节点网络策略限制了外部访问,才会出现连接超时。
分步解决方案
1. 先确认Ingress Controller的运行位置
执行命令查看Ingress Controller Pod所在的节点,这些节点的IP才是访问Ingress服务的目标IP:
kubectl get pods -n ingress-nginx -o wide
(如果你的Ingress Controller部署在其他命名空间,替换ingress-nginx即可)
2. 解决VM#1的端口冲突问题
既然VM#1同时承担Rancher服务器和K8s节点,咱们调整Rancher的端口,把80/443留给Ingress Controller:
- 先停止并删除现有Rancher容器:
docker stop <rancher-container-id> docker rm <rancher-container-id>
- 重新启动Rancher,指定非冲突的端口(比如8080/8443):
docker run -d --restart=unless-stopped -p 8080:80 -p 8443:443 rancher/rancher:latest
之后你可以通过http://<VM#1-IP>:8080或https://<VM#1-IP>:8443访问Rancher UI,VM#1的80/443端口就可以用来访问Ingress路由的服务了。
3. 开放VM#2的端口
如果Ingress Controller Pod跑在VM#2上,需要开放VM#2的80和443端口:
- 以Linux为例,用iptables开放端口:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
- 如果是云服务商的VM,还要在安全组里添加允许外部访问80/443的规则。
4. 升级Ingress配置(可选但推荐)
你当前用的extensions/v1beta1 API版本已被Kubernetes废弃,建议升级到networking.k8s.io/v1避免后续兼容性问题:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress annotations: kubernetes.io/ingress.class: nginx spec: rules: - http: paths: - path: / pathType: Prefix backend: service: name: front-end port: number: 3000 - path: /supermarket/ pathType: Prefix backend: service: name: backend port: number: 8081
注意新增的pathType字段是networking.k8s.io/v1版本的必填项。
最终访问方式
调整完成后:
- 如果Ingress Controller在VM#1上:访问
http://<VM#1-IP>/supermarket/就能获取后端服务响应 - 如果Ingress Controller在VM#2上:访问
http://<VM#2-IP>/supermarket/即可
内容的提问来源于stack exchange,提问作者Borislav T




