gRPC使用HTTP/2協議,支援雙向流、頭部壓縮和多工等特性,從而提高了網路傳輸的效率。本文介紹如何在Container Service for Kubernetes叢集部署gRPC應用,並使用雲原生網關實現gRPC服務的路由轉寄。
前提條件
步驟一:使用Container Service部署gRPC應用
應用部署的具體操作,請參見建立無狀態工作負載Deployment。
在本樣本中,使用Container ServiceK8s原生的服務發現方式,即通過聲明式Service API資源將後端服務註冊到CoreDNS。本樣本中使用grpcbin應用作為後端服務樣本,該應用提供了多個gRPC服務的實現。在Container ServiceACK中應用如下資源。
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服務底層基於HTTP/2協議,其路徑格式為{包名}.{服務名}/{方法名}。基於此,MSE雲原生網關可以在Path欄位中實現對gRPC協議的路由。例如,如果使用gRPC訪問grpcbin的Index方法,在協議中,該Path欄位值為grpcbin.GRPCBin/Index。
步驟二:使用雲原生網關作為gRPC的路由分發
添加ACK叢集作為網關的服務來源並添加grpcbin服務。
添加服務來源
登入MSE網關管理主控台,並在頂部功能表列選擇地區。
在左側導覽列,選擇云原生网关 > 网关列表,單擊目標網關名稱。
在左側導覽列,選擇路由管理,然後選擇來源頁簽。
單擊创建来源。在创建来源面板,服務來源選擇容器服务,配置相關參數,然後單擊确定。
配置項
說明
ACK/ACK Serverless 集群
選擇後端服務所在的叢集。
說明您在建立網關時需要選擇和後端叢集相同的VPC,那麼服務來源添加時會自動擷取該VPC下的叢集。
監聽K8s Ingress
開啟監聽Ingress配置後,雲原生網關會自動監聽Ingress資源的變化,並使Ingress資源中網域名稱、路由的相關配置生效。
關閉監聽Ingress配置後,雲原生網關會放棄監聽Ingress資源,並失效之前已監聽的Ingress資源中的網域名稱、路由相關配置,請您謹慎操作。
重要通過管控手動設定的網域名稱、路由的相關配置,其優先順序高於Ingress資源。
IngressClass
監聽關聯指定IngressClass的Ingress資源。
當配置成空值時,監聽叢集中所有的Ingress資源。
當配置成具體值時(僅支援單個值,暫不支援大量設定),監聽叢集中帶有
class註解或者Spec.IngressClassName的值與配置值一致的Ingress資源。例如,當配置成nginx時,監聽的Ingress資源套件括:IngressClass為nginx或者未關聯任何IngressClass的Ingress資源。
命名空间
監聽指定命名空間的Ingress資源。
當配置成空值時,監聽叢集中所有命名空間中的Ingress資源。
當配置成具體值時(僅支援單個值,暫不支援大量設定),監聽叢集中指定命名空間中的Ingress資源。
更新IngressStatus
開啟更新IngressStatus後,被監聽的Ingress的Status中IP地址會被修改為雲原生網關關聯的SLB IP地址。
說明網關版本為1.2.9及以上才能修改此行為。
安全性群組授權
容器叢集的節點池上配置有安全性群組。通常情況下,叢集外的組件要想訪問到叢集內的服務,就必須在安全性群組上開放服務所需的全部連接埠。
您可以對安全性群組進行修改。具體操作,請參見設定安全性群組規則。
添加服務
登入MSE管理主控台,並在頂部功能表列選擇地區。
在左側導覽列,選擇云原生网关 > 网关列表,單擊目標網關名稱。
在左側導覽列,選擇路由管理,然後選擇服務頁簽。
單擊建立服務並配置面板中的相關參數,然後單擊確定。
配置項
說明
服務來源
選擇Container Service。
命名空間
選擇目的地組群的命名空間。
服務列表
在服務列表中選擇服務。
添加網關到grpcbin服務的路由
結果驗證
使用bloomrpc測試gRPC服務的可用性,若服務端正常返迴響應,則表示gRPC服務可用。
同時您也可以使用其他gRPC用戶端進行測試。