全部產品
Search
文件中心

Container Service for Kubernetes:在Knative中部署gRPC服務

更新時間:Jun 19, 2024

Knative支援HTTP、HTTP2(包括gRPC)訪問協議。本文介紹如何在Knative中部署gRPC服務。

前提條件

步驟一:部署gRPC服務

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇應用 > Knative

  3. Knative頁面的服務管理頁簽下,選擇命名空間default,然後單擊使用模板建立,單擊樣本模板右側的下拉式清單,選擇自訂,將以下範例程式碼粘貼至模板,最後單擊建立,建立一個名為helloworld-grpc的Knative服務。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: helloworld-grpc
    spec:
      template:
        metadata:
          annotations:
            autoscaling.knative.dev/class: mpa.autoscaling.knative.dev
        spec:
          containers:
          - image: docker.io/moul/grpcbin # 該鏡像是一個用於測試gRPC的工具,它通過提供gRPC服務來響應請求。
            env:
            - name: TARGET
              value: "Knative"
            ports:
            - containerPort: 9000
              name: h2c # gRPC服務在Knative服務中port欄位下的name設定為h2c。
              protocol: TCP
  4. 在Hosts檔案中添加綁定資訊。將服務管理頁面的預設網域名稱訪問網關進行Host綁定。

    找到電腦中Hosts檔案所在位置,然後在Hosts檔案中添加綁定資訊,具體格式為訪問網關+空格+預設網域名稱,然後通過網域名稱直接存取服務。

    綁定範例如下:

    121.xx.xxx.xx helloworld-grpc.default.example.com

步驟二:驗證gRPC服務的可用性

  1. 訪問grpcbin,安裝適用於您作業系統的BloomRPC。

  2. 將以下代碼粘貼至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協議,其路徑格式為{包名}.{服務名}/{方法名},基於此,Knative網關可以在Path欄位中實現對gRPC協議的路由。例如,如果使用gRPC訪問grpcbin的Index方法,在HTTP2協議中,該Path欄位值為grpcbin.GRPCBin/Index

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

    1. gRPC.proto檔案匯入BloomRPC。

    2. 在左側導覽列,單擊DummyUnary調用方法,並在頁面頂部設定調用網域名稱:連接埠。例如helloworld-grpc.default.example.com:80

    3. 單擊綠色執行按鈕,查看服務端返回的響應是否正常。