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

Kubernetes Ingress配置问题:同主机多端口路由失效排查

排查并修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:48:15