Kubernetes Ingress配置问题:同主机多端口路由失效排查
我来帮你搞定这个Ingress路由的问题,仔细看了你的配置文件后,发现几个核心错误导致访问失败,下面一步步给你解释和修复方案:
1. Ingress规则配置的致命错误
你的ingress_nginx_res.yaml里的host字段完全写错了,而且缺少正确的路径配置,这是最主要的问题:
- host字段错误:
host: http:是非法值,host应该是合法的域名(比如eureka.example.com)、IP地址,或者留空表示匹配所有主机请求。 - 路径配置缺失:两个规则都没有设置
path,会导致路由规则冲突,Ingress不知道该把请求转发到哪个服务。
修复后的Ingress配置(按路径路由)
如果你的需求是通过同一IP的不同路径来访问两个服务(比如http://172.16.100.83/eureka访问Eureka,http://172.16.100.83/config访问Config Server),可以用下面的配置:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: my-ingress spec: rules: - http: paths: - path: /eureka backend: serviceName: gearbox-rack-eureka-server servicePort: 8761 - path: /config backend: serviceName: gearbox-rack-config-server servicePort: 8888
注意这里把原来错误的host: http:改成了http:块,用来定义HTTP路由规则,每个路径对应一个服务。
如果你确实需要按端口区分(非常规用法)
如果一定要用同一IP的不同端口(比如8761和8888)来路由,你需要修改Nginx Ingress Controller的部署,让它监听这两个额外端口,然后在Ingress里配置对应的port字段,但这种用法不推荐,因为Ingress的设计初衷是基于域名/路径的路由。
2. 错误的访问方式
你现在直接访问172.16.100.83:8761是不对的!Ingress的请求是先发到Nginx Ingress Controller的服务端口(通常是80或443),然后由Controller根据Ingress规则转发到对应的后端服务。
正确的访问方式应该是:
- 如果用上面修复的路径路由配置,访问
http://172.16.100.83/eureka(假设Ingress Controller监听80端口) - 先确认Ingress Controller的NodePort或LoadBalancer端口:执行
kubectl get svc -n kube-system找到类似nginx-ingress-controller的服务,看它的NodePort是多少,比如如果是30080,就访问http://172.16.100.83:30080/eureka
3. Nginx默认后端镜像错误
你的nginx_default-backend.yaml里的镜像chenl是无效的,会导致默认后端Pod启动失败,这也会影响Ingress的正常工作。
修复默认后端的镜像配置,换成官方的默认后端镜像:
kind: Service apiVersion: v1 metadata: name: nginx-default-backend namespace: kube-system spec: ports: - port: 80 targetPort: http selector: app: nginx-default-backend --- kind: Deployment apiVersion: extensions/v1beta1 metadata: name: nginx-default-backend namespace: kube-system spec: replicas: 1 template: metadata: labels: app: nginx-default-backend spec: terminationGracePeriodSeconds: 60 containers: - name: default-http-backend # 替换成官方默认后端镜像 image: k8s.gcr.io/defaultbackend-amd64:1.5 livenessProbe: httpGet: path: /healthz port: 8080 scheme: HTTP initialDelaySeconds: 30 timeoutSeconds: 5 ports: - name: http containerPort: 8080 protocol: TCP resources: limits: cpu: 10m memory: 20Mi requests: cpu: 10m memory: 20Mi
4. 额外检查点
- 确认Ingress Controller已经正常运行:执行
kubectl get pods -n kube-system,查看nginx-ingress-controller和nginx-default-backend的Pod状态是否为Running - 检查Ingress的状态:执行
kubectl describe ingress my-ingress,看Events里有没有报错信息 - 测试后端服务是否正常:先通过NodePort访问确认服务本身没问题,比如访问
http://172.16.100.83:31501看Eureka是否能打开,如果这个也打不开,那可能是Pod本身的问题(比如镜像拉取失败、容器启动错误),先排查Pod状态:kubectl describe pod gearbox-rack-eureka-server
按照上面的步骤修复后,应该就能正常通过Ingress访问你的服务了。
内容的提问来源于stack exchange,提问作者user84592

