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

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服务的工具,比自己写客户端代码方便太多了:

  1. 先安装它——macOS可以用brew install grpcurl,Linux/Windows直接从GitHub下载二进制包就行
  2. 先测试服务是否能被发现,列出所有可用的gRPC服务:
# 因为默认用443端口,所以不用指定,直接写域名
grpcurl grpc.yourdomain.com list
  1. 调用具体的方法,比如你的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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:33:33