如何在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
相关产品推荐
相关产品推荐

