MSE云原生网关以托管的方式来作为流量入口,提供了丰富的流量治理能力,支持多种服务发现方式,例如容器服务、MSE Nacos、MSE ZooKeeper、ECS和域名。同时,MSE云原生网关支持gRPC、HTTP和WebSocket等多种协议。本文介绍基于容器服务K8s和云原生网关实现gRPC应用的转发路由。
前提条件
已开通MSE云原生网关。具体操作,请参见创建MSE云原生网关。
步骤一:使用容器服务部署gRPC应用
前提条件
已创建Kubernetes集群。具体操作,请参见创建Kubernetes托管版集群。
具体步骤
应用部署的具体操作,请参见创建无状态工作负载Deployment。
在本示例中,使用容器服务K8s原生的服务发现方式,即通过声明式Service API资源将后端服务注册到CoreDNS。本示例中使用
grpcbin应用作为后端服务示例,该应用提供了多个gRPC服务的实现。在容器服务ACK中应用如下资源。
说明 gRPC服务在Kubernetes service中
port
字段下的
name
必须包含grpc。
apiVersion: apps/v1
kind: Deployment
metadata:
name: grpcbin
spec:
replicas: 1
selector:
matchLabels:
app: grpcbin
template:
metadata:
labels:
app: grpcbin
spec:
serviceAccountName: grpcbin
containers:
- image: docker.io/moul/grpcbin
imagePullPolicy: IfNotPresent
name: grpcbin
ports:
- containerPort: 9000
- containerPort: 9001
resources:
requests:
cpu: '1'
memory: 2Gi
limit:
cpu: '1'
memory: 2Gi
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: grpcbin
---
apiVersion: v1
kind: Service
metadata:
name: grpcbin-grpc
labels:
app: grpcbin
spec:
ports:
- name: grpc
port: 9000
targetPort: 9000
selector:
app: grpcbin
以下代码展示该gRPC服务的proto定义。
syntax = "proto3";
package grpcbin;
service GRPCBin {
rpc Index(EmptyMessage) returns (IndexReply) {}
// 无参数调用的方法,调用后回返回一个空响应
rpc Empty(EmptyMessage) returns (EmptyMessage) {}
// 响应会返回请求的参数
rpc DummyUnary(DummyMessage) returns (DummyMessage) {}
// 响应为流式的调用,会分10次响应消息
rpc DummyServerStream(DummyMessage) returns (stream DummyMessage) {}
// 请求为流式的调用,会接受10次请求并返回最后一次的body
rpc DummyClientStream(stream DummyMessage) returns (DummyMessage) {}
// 请求响应都为流式的方法
rpc DummyBidirectionalStreamStream(stream DummyMessage) returns (stream DummyMessage) {}
// 该方法会返回指定的grpc错误
rpc SpecificError(SpecificErrorRequest) returns (EmptyMessage) {}
// 该方法调用会随机返回一个错误
rpc RandomError(EmptyMessage) returns (EmptyMessage) {}
// 该方法调用会返回header
rpc HeadersUnary(EmptyMessage) returns (HeadersMessage) {}
// 该方法调用不会返回响应
rpc NoResponseUnary(EmptyMessage) returns (EmptyMessage) {}
}
message HeadersMessage {
message Values {
repeated string values = 1;
}
map<string, Values> Metadata = 1;
}
message SpecificErrorRequest {
uint32 code = 1;
string reason = 2;
}
message EmptyMessage {}
message DummyMessage {
message Sub {
string f_string = 1;
}
enum Enum {
ENUM_0 = 0;
ENUM_1 = 1;
ENUM_2 = 2;
}
string f_string = 1;
repeated string f_strings = 2;
int32 f_int32 = 3;
repeated int32 f_int32s = 4;
Enum f_enum = 5;
repeated Enum f_enums = 6;
Sub f_sub = 7;
repeated Sub f_subs = 8;
bool f_bool = 9;
repeated bool f_bools = 10;
int64 f_int64 = 11;
repeated int64 f_int64s= 12;
bytes f_bytes = 13;
repeated bytes f_bytess = 14;
float f_float = 15;
repeated float f_floats = 16;
}
message IndexReply {
message Endpoint {
string path = 1;
string description = 2;
}
string description = 1;
repeated Endpoint endpoints = 2;
}
gRPC服务底层基于http2
协议,其路径格式为{包名}.{服务名}/{方法名},基于此,MSE云原生网关可以在Path字段中实现对gRPC协议的路由。例如,如果使用gRPC访问grpcbin的Index方法,在HTTP2
协议中,该Path字段值为grpcbin.GRPCBin/Index。
步骤二:使用云原生网关作为gRPC的路由分发
添加ACK集群作为网关的服务来源并添加grpcbin服务。
添加服务来源
- 登录MSE管理控制台,并在顶部菜单栏选择地域。
- 在左侧导航栏,选择 ,单击目标网关名称。
- 在左侧导航栏,选择 。
- 在来源管理页面左上角,单击创建来源并配置相关参数,配置完成后单击确定。
表 1. 关联ACK容器服务来源参数说明 配置项 描述 服务来源 选择容器服务服务来源。 ACK/ASK集群 选择后端服务所在的集群。 是否监听K8s Ingress 开启监听Ingress配置后,云原生网关会自动监听Ingress资源的变化,并生效Ingress资源中域名、路由的相关配置。 关闭监听Ingress配置后,云原生网关会放弃监听Ingress资源,同时,之前已监听的Ingress资源中域名、路由相关配置会失效。
说明 通过管控手动配置的域名、路由的相关配置的优先级高于Ingress资源。
添加服务
- 登录MSE管理控制台,并在顶部菜单栏选择地域。
- 在左侧导航栏,选择 ,单击目标网关名称。
- 在左侧导航栏,选择 。
- 在服务列表页面左上角,单击创建服务并配置面板中的相关参数,然后单击确定。
表 2. 添加ACK容器服务参数说明 配置项 说明 服务来源 选择容器服务。 命名空间 选择目标集群的命名空间。 服务列表 在服务列表中选择服务。
添加网关到grpcbin服务的路由
- 登录MSE管理控制台,并在顶部菜单栏选择地域。
- 在左侧导航栏,选择 ,单击目标网关名称。
- 在左侧导航栏,单击路由配置,并在路由配置页面左上角,单击创建路由。
- 在创建路由面板,配置路由相关参数,然后单击确定。
步骤三:验证gRPC服务的可用性
使用bloomrpc测试gRPC服务可用性,若服务端正常返回响应,则表示grpc服务可用。
同时您也可以使用其他gRPC客户端进行测试。
