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

如何通过K8s Ingress访问GRPC服务?配置异常求助

GRPC服务通过Nginx Ingress访问失败,直接NodePort正常的问题排查

核心问题与修复方案:

1. GRPC客户端URL格式错误

GRPC客户端的目标地址必须遵循 host:port 格式,不能包含路径(如/st)。你当前使用的192.168.70.1/st不符合GRPC的地址规范,这是导致DNS解析失败的直接原因。

正确的客户端URL应为192.168.70.1:80(Ingress默认监听80端口),GRPC的服务路径是在方法定义中声明的,无需附加在URL上。

2. Ingress配置语法错误

你的Ingress YAML中rules下的-http:缺少空格,正确写法是- http:,这个语法错误会导致Ingress控制器无法解析配置,直接失效。

3. 移除不必要的rewrite-target注解

nginx.ingress.kubernetes.io/rewrite-target是为HTTP/1.1请求设计的路径重写注解,而GRPC基于HTTP/2协议,请求结构完全不同,该注解会破坏GRPC的路由逻辑,必须移除。

4. 优化Ingress路径配置

对于GRPC服务,路径配置可以简化,无需复杂正则。如果需要通过/st前缀路由,可调整为/st/*,同时确保Nginx Ingress正确处理HTTP/2请求。

修正后的Ingress配置示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: k8s-rpc-ingress
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
    # 若使用HTTP而非HTTPS,添加以下注解确保HTTP/2正常工作
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/http2-push-preload: "on"
spec:
  ingressClassName: nginx
  rules:
    - http:
        paths:
        - path: /st/*
          pathType: Prefix
          backend:
            service:
              name: staging-service
              port:
                number: 5900

额外优化建议:

Service中两个端口的名称重复(均为staging),建议修改为不同名称以避免混淆:

ports:
  - name: staging-http
    protocol: TCP
    port: 5274
    targetPort: 5274
    nodePort: 30277
  - name : staging-grpc
    protocol: TCP
    port: 5900
    targetPort: 5900
    nodePort: 30278

内容的提问来源于stack exchange,提问作者Erika

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:32:47