全部產品
Search
文件中心

Microservices Engine:雲端式原生網關實現gRPC服務的路由轉寄

更新時間:Dec 27, 2024

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服務。

添加服務來源

  1. 登入MSE網關管理主控台,並在頂部功能表列選擇地區。

  2. 在左側導覽列,選擇云原生网关 > 网关列表,單擊目標網關名稱。

  3. 在左側導覽列,選擇路由管理,然後選擇來源頁簽。

  4. 單擊创建来源。在创建来源面板,服務來源選擇容器服务,配置相關參數,然後單擊确定

    配置項

    說明

    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及以上才能修改此行為。

    安全性群組授權

    容器叢集的節點池上配置有安全性群組。通常情況下,叢集外的組件要想訪問到叢集內的服務,就必須在安全性群組上開放服務所需的全部連接埠。

    您可以對安全性群組進行修改。具體操作,請參見設定安全性群組規則

添加服務

  1. 登入MSE管理主控台,並在頂部功能表列選擇地區。

  2. 在左側導覽列,選擇云原生网关 > 网关列表,單擊目標網關名稱。

  3. 在左側導覽列,選擇路由管理,然後選擇服務頁簽。

  4. 單擊建立服務並配置面板中的相關參數,然後單擊確定

    配置項

    說明

    服務來源

    選擇Container Service

    命名空間

    選擇目的地組群的命名空間。

    服務列表

    在服務列表中選擇服務。

添加網關到grpcbin服務的路由

  1. 登入MSE管理主控台,並在頂部功能表列選擇地區。

  2. 在左側導覽列,選擇云原生网关 > 网关列表,單擊目標網關名稱。

  3. 在左側導覽列,單擊路由管理,然後選擇路由頁簽。

  4. 單擊建立路由。在建立路由頁面,配置路由相關參數,然後單擊儲存並發布。具體操作,請參見建立路由

    配置項

    說明

    路由名稱

    設定為grpc。

    網域名稱

    選擇預設網域名稱*。

    路徑

    選擇匹配條件為首碼是,Path以/grpcbin.GRPCBin開頭。

    說明

    gRPC服務的路徑名格式為{包名}.{服務名}/{方法名},因此可以配置對應的首碼路由。

    使用情境

    選擇該路由的使用情境為單服務

    後端服務

    選擇目標服務以及服務連接埠。

結果驗證

使用bloomrpc測試gRPC服務的可用性,若服務端正常返迴響應,則表示gRPC服務可用。

同時您也可以使用其他gRPC用戶端進行測試。測試gRPC服務可用性