Ingress Nginx遇Bad Gateway错误,/api/command无法访问,求路由与排障
问题排查与解决方案
一、先解决Bad Gateway错误
你的Ingress配置里有个致命拼写错误,这大概率是引发Bad Gateway的核心原因:nginx.ingress.kubernetes.io/reqrite-target: / 要改成 nginx.ingress.kubernetes.io/rewrite-target: /(少了字母w)。这个注解负责将Ingress收到的请求路径重写后转发给后端服务,拼写错误会导致Nginx无法正确处理路径转发,直接触发502错误。
除此之外,按以下步骤逐一排查:
- 检查Pod运行状态:执行
kubectl get pods,确认command-depl的Pod处于Running状态,没有重启、崩溃或镜像拉取失败的情况。如果Pod状态异常,先解决容器启动问题。 - 验证端口匹配:确认
commandservice容器内部确实在80端口提供服务。如果容器服务实际监听的是其他端口(比如3000),需要把Service的targetPort改成对应端口:ports: - port: 80 protocol: TCP targetPort: 3000 # 替换为容器实际监听的端口 - 测试集群内服务连通性:临时启动一个测试Pod,执行集群内访问测试:
如果这里无法获取响应,说明服务本身存在问题,和Ingress无关。kubectl run -it --rm busybox --image=busybox:1.36 wget -qO- command-clusterip-srv/api/command
修正后的Ingress配置(适配路径后缀转发场景):
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-srv annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/use-regex: 'true' nginx.ingress.kubernetes.io/rewrite-target: /$1 spec: rules: - host: acme.com http: paths: - path: /api/platform(/|$)(.*) pathType: Prefix backend: service: name: platform-clusterip-srv port: number: 80 - path: /api/command(/|$)(.*) pathType: Prefix backend: service: name: command-clusterip-srv port: number: 80
注:如果后端服务需要接收完整的/api/command路径,保持rewrite-target: /即可;如果需要转发路径后缀(比如/api/command/create),用/$1配合正则路径会更灵活。
二、配置/api/myservice路由不同服务
如果要通过/api/myservice下的子路径路由到不同服务(比如/api/myservice/command对应command-service,/api/myservice/platform对应platform-service),可以这样配置Ingress:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-srv annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/use-regex: 'true' nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - host: acme.com http: paths: - path: /api/myservice/platform(/|$)(.*) pathType: Prefix backend: service: name: platform-clusterip-srv port: number: 80 - path: /api/myservice/command(/|$)(.*) pathType: Prefix backend: service: name: command-clusterip-srv port: number: 80
解释:
- 路径规则
/api/myservice/platform(/|$)(.*)会匹配所有以/api/myservice/platform开头的请求,包括/api/myservice/platform和/api/myservice/platform/list rewrite-target: /$2会将请求路径重写为第二个捕获组的内容,比如/api/myservice/platform/list会转发给后端服务的/list
如果后端服务需要接收完整的/api/myservice/xxx路径,直接去掉rewrite-target注解,保留pathType: Prefix即可。
内容的提问来源于stack exchange,提问作者Boris Ningthoujam
相关产品推荐
相关产品推荐

