Z.S.K.'s Records

Kong学习(代理多grpc后端)

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
# service-a
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
# 其中,127.0.0.1:8001为kong的管理端口,paths对应的具体的grpc后端
# 其它的grpc后端按上新建即可

这样,在客户端就可以通过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方面还是非常方便的

参考文章:

转载请注明原作者: 周淑科(https://izsk.me)

 wechat
Scan Me To Read on Phone
I know you won't do this,but what if you did?