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

如何在Nginx Ingress Controller上实现gRPC通信?

问题分析与解决方案

核心问题出在你的业务Service配置成了LoadBalancer类型——这会让AWS直接给这个Service单独创建一个NLB,而Nginx Ingress Controller本身就有自己的LoadBalancer,自然会出现两个不同的LB地址。要通过Ingress访问gRPC服务,业务Service应该用ClusterIP类型,让Ingress统一处理流量转发。

修正后的Service配置

apiVersion: v1
kind: Service
metadata:
  name: test-grpc-service
  labels:
    test: grpc
spec:
  type: ClusterIP  # 改为ClusterIP,无需独立对外LB
  selector:
    test: grpc
  ports:
  - port: 8888
    targetPort: 8888
    name: grpc

修正后的Ingress配置(修复冗余注解)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-grpc-ingress
  labels:
    test: grpc
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/backend-protocol: GRPC  # 关键:指定后端用gRPC协议

spec:
  tls:
    - hosts:
      - test.test.com
      secretName: test-secret
  rules:
    - host: test.test.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: test-grpc-service
                port: 
                   number: 8888

关键说明

  • 业务Service改为ClusterIP后,仅集群内部可访问,所有外部流量通过Nginx Ingress Controller的LB进入,这样就只会有一个对外的LB地址。
  • nginx.ingress.kubernetes.io/backend-protocol: GRPC是必须的,它告诉Nginx Ingress用gRPC协议和后端Service通信,这是实现gRPC转发的核心配置。
  • 确保test-secret已包含test.test.com对应的SSL证书和密钥,否则Ingress的TLS配置会失效。
  • 之前Service中的AWS LB相关注解全部可以移除,因为业务Service不再需要独立的负载均衡器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 22:48:35