kong在v1.3的版本原生支持了grpc协议, 这里说说使用kong来代理多个grpc请求.
需求是这样的,有个应用需要调用多个grpc服务, 内部测试环境都是直接通过kubernetes nodeport进行调用的,显然不是很优雅,
而kong做为我们的统一api网关,当然可以完美解决这个需求
整个链路如下:
从这个图可以看出,kong接入到grpc请求首先也是通过请求的path来转到配置的kong的service,这个service的host就可以是kubernetes对应中的service了
有两个方式实现,如下:
添加service/route
这里要注意的是,因为需要新建service/route等对象,因此需要kong-db模式
1 2 3 4 5
| curl -XPOST 127.0.0.1:8001/services --data name=service-a-grpc --data protocol=grpc --data host=service-A.default.svc.cluster.local --data port=8091 curl -XPOST 127.0.0.1:8001/services/service-a-grpc/routes --data protocols=grpc --data name=service-A-grpc-root --data paths=/service-a-grpc.WorkflowEngineService
|
这样,在客户端就可以通过kong暴露出来的统一端口进行访问了,而如果像本人使用的db-less的模式,有没有办法呢? 当然是有的
使用ingress
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| --- apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: grpc-service-ingress namespace: default annotations: kubernetes.io/ingress.class: kong-grpcproxy konghq.com/protocols: grpc spec: rules: - http: paths: - path: /service-a-grpc.WorkflowEngineService backend: serviceName: service-a servicePort: 8091 - path: /service-b-grpc.ResManServer backend: serviceName: service-b-grpc servicePort: 9011 - path: /service-c-grpc.SprCenterService backend: serviceName: service-b-grpc servicePort: 9112
|
同时,需要kuberntes中的service如service-a的annotation添加konghq.com/protocols: grpc
即可,如下
1 2
| annotations: konghq.com/protocols: grpc
|
这样达到的效果跟上面是一样的,优点是kong使用的是db-less模式
kong在api-gateway方面还是非常方便的
参考文章: