gRPC无端口路由配置与测试:客户端如何通过Ingress访问K8s服务
解决gRPC服务通过Kubernetes Ingress外部访问的路由测试问题
嘿,作为gRPC新手碰到这种K8s路由配置问题太正常了,我来一步步帮你捋清楚怎么搞定它~
首先得明确两个关键知识点:gRPC是基于HTTP/2运行的,所以你的Ingress必须支持HTTP/2转发;另外你之前写的客户端地址10.0.1.6:80/hw是不对的——gRPC客户端只需要host:port来建立连接,服务的路径是由你的Protobuf定义自动处理的(比如/helloworld.Greeter/SayHello这种格式),不是直接加在地址里的。
一、先配置支持gRPC的Kubernetes Ingress
你需要先创建一个Ingress资源,确保它能正确把外部gRPC请求转发到Pod里的服务。这里给你一个NGINX Ingress的示例配置(大部分K8s集群用的都是NGINX Ingress):
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: grpc-hw-ingress annotations: # 核心注解:告诉NGINX这是gRPC服务,要走HTTP/2转发 nginx.ingress.kubernetes.io/backend-protocol: "GRPC" # 推荐开启HTTPS,gRPC在加密通道下更稳定,这里配置自动跳转到HTTPS nginx.ingress.kubernetes.io/ssl-redirect: "true" spec: # 配置TLS证书,替换成你自己的域名和证书Secret tls: - hosts: - grpc.yourdomain.com secretName: your-tls-cert-secret rules: - host: grpc.yourdomain.com http: paths: - path: /helloworld.Greeter/* # 替换成你的gRPC服务路径前缀,比如你的proto是helloworld包下的Greeter服务 pathType: Prefix backend: service: name: grpc-hw-service # 替换成你的K8s Service名称,这个Service要指向你的Pod port: number: 80 # 对应Pod里gRPC服务监听的80端口
别忘了先创建对应的K8s Service,把Pod的80端口暴露出来,这样Ingress才能找到后端服务。
二、修正你的gRPC客户端代码
把客户端里的地址改成Ingress的外部域名,不用加端口(默认HTTPS走443,HTTP走80),代码调整如下:
const ( // 替换成你的Ingress外部域名,默认443端口可以省略不写 address = "grpc.yourdomain.com" defaultName = "World" ) var ( conn *grpc.ClientConn c pb.GreeterClient ) func setupRPC() { var err error // 测试环境可以用insecure跳过证书验证,生产环境一定要用正规的TLS证书 conn, err = grpc.Dial(address, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Fatalf("连接失败: %v", err) } c = pb.NewGreeterClient(conn) }
三、不指定端口测试路由的方法
不指定端口的话,系统默认会用80(HTTP)或443(HTTPS),推荐用HTTPS(443),这也是大部分生产环境的配置。
方法1:用grpcurl工具测试(强烈推荐)
grpcurl是专门用来测试gRPC服务的工具,比自己写客户端代码方便太多了:
- 先安装它——macOS可以用
brew install grpcurl,Linux/Windows直接从GitHub下载二进制包就行 - 先测试服务是否能被发现,列出所有可用的gRPC服务:
# 因为默认用443端口,所以不用指定,直接写域名 grpcurl grpc.yourdomain.com list
- 调用具体的方法,比如你的
SayHello:
grpcurl -d '{"name": "测试"}' grpc.yourdomain.com helloworld.Greeter.SayHello
如果是用HTTP(非HTTPS)测试,要加
-plaintext参数:grpcurl -plaintext grpc.yourdomain.com list
方法2:用修正后的客户端代码测试
直接运行调整后的客户端代码,如果能正常拿到服务返回的结果,就说明路由配置没问题啦。
常见坑点排查
如果测试失败,可以从这几个地方查:
- 先确认Ingress有没有分配外部IP,域名有没有正确解析到这个IP
- 查看NGINX Ingress的日志,看看请求是不是被正确转发到后端了
- 检查K8s Service是不是真的关联到你的Pod,端口映射有没有错
- 一定要确认Ingress的
backend-protocol注解是GRPC,不然会用HTTP/1.1转发,gRPC肯定会失败
内容的提问来源于stack exchange,提问作者Chris G.
相关产品推荐
相关产品推荐

