使用 TCM 对外暴露 gRPC 服务
背景
gRPC 是长连接服务,而长连接服务负载不均是通病,因为使用四层负载均衡的话,只能在连接调度层面负载均衡,但不能在请求级别负载均衡。不同连接上的请求数量、网络流量、请求耗时、存活时长等可能都不一样,就容易造成不同 Pod 的负载不一样。而 istio 天然支持 gRPC 负载均衡,即在七层进行负载均衡,可以将不同请求转发到不同后端,从而避免负载不均问题,腾讯云容器服务也对 istio 进行了产品化托管,产品叫 TCM,本文介绍如何使用 TCM 来暴露 gRPC 服务。
创建网格
进入 TCM控制台,新建一个网格,每个网格可以管理多个 TKE/EKS 集群,创建网格的时候就可 以关联集群(创建完之后关联也可以):
边缘代理网关通常会启用 Ingress Gateway,即将内部服务通过 CLB 暴露出来:
启用 sidecar 自动注入
网格创建好后,点进去,在 【服务】-【sidecar自动注入】中勾选要启用自动注入的 namespace:
gRPC 服务端部署在哪个 namespace 就勾选哪个。
部署 gRPC 服务端
将 gRPC 服务部署到网格中的一个集群,确保部署的 namespace 开启了sidecar自动注入:
apiVersion: apps/v1
kind: Deployment
metadata:
name: server
namespace: test
spec:
replicas: 1
selector:
matchLabels:
app: server
template:
metadata:
labels:
app: server
spec:
containers:
- name: server
image: docker.io/imroc/grpc_server:latest
imagePullPolicy: Always
如果服务端在开启自动注入之前已经部署了,可以重建下服务端 Pod,重建后会触发自动注入。
创建 Service
给工作负载关联一个 Service,使用 yaml 创建:
apiVersion: v1
kind: Service
metadata:
name: server
namespace: test
labels:
app: server
spec:
type: ClusterIP
ports:
- port: 8000
protocol: TCP
targetPort: 50051
name: grpc
selector:
app: server
注意:
- 重点是端口的 name 要以 grpc 开头,也可以直接写 grpc,istio 通过 port name 识别协议类型。
- 不通过控制台创建的原因主要是因为控制台创建 Service 不支持为端口指定 name。