全部產品
Search
文件中心

Container Service for Kubernetes:通過ASM入口網關訪問網格內gRPC服務

更新時間:Feb 28, 2024

您可以通過ASM入口網關安全地訪問網格內的gRPC服務,實現對gRPC服務的精確存取控制,提升服務治理能力,保障服務間通訊的安全性。本文介紹如何通過入口網關訪問網格內gRPC服務,並在gRPC的兩個版本之間進行流量切換。

前提條件

步驟一:部署樣本應用

部署名為istio-grpc-server-v1和istio-grpc-server-v2的樣本應用。

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

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇工作負載 > 無狀態

  3. 無狀態頁面上方,選擇目標命名空間,然後在右上方單擊使用YAML建立資源

    說明

    當前選中的命名空間應當已標註自動注入Sidecar,即包含istio-injection=enabled標籤。具體操作,請參見啟用自動注入

  4. 建立頁面,選擇自訂樣本模板,配置以下YAML,然後單擊建立

    展開查看YAML

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: grpc-helloworld-py-v1
      labels:
        app: grpc-helloworld-py
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: grpc-helloworld-py
          version: v1
      template:
        metadata:
          labels:
            app: grpc-helloworld-py
            version: v1
        spec:
          containers:
            - name: grpc-helloworld-py
              image: registry.cn-hangzhou.aliyuncs.com/aliacs-app-catalog/istio-grpc-server:grpc-helloworld-py-v1.0
              imagePullPolicy: Always
              env:
                - name: podname
                  valueFrom:
                    fieldRef:
                      apiVersion: v1
                      fieldPath: metadata.name
              ports:
                - containerPort: 50051
                  name: grpc-port
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: grpc-helloworld-py-v2
      labels:
        app: grpc-helloworld-py
        version: v2
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: grpc-helloworld-py
          version: v2
      template:
        metadata:
          labels:
            app: grpc-helloworld-py
            version: v2
        spec:
          containers:
            - name: grpc-helloworld-py
              image: registry.cn-hangzhou.aliyuncs.com/aliacs-app-catalog/istio-grpc-server:grpc-helloworld-py-v1.0
              imagePullPolicy: Always
              env:
                - name: podname
                  valueFrom:
                    fieldRef:
                      apiVersion: v1
                      fieldPath: metadata.name
              ports:
                - containerPort: 50051
                  name: grpc-port
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: grpc-helloworld-py
      labels:
        app: grpc-helloworld-py
    spec:
      ports:
        - port: 50051
          name: grpc-port
      selector:
        app: grpc-helloworld-py

步驟二:設定Service MeshASM的路由規則

設定Service Mesh的服務網關、虛擬服務和目標規則,將流量全部指向istio-grpc-server-v1。

  1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

  2. 網格管理頁面,找到待配置的執行個體,單擊執行個體的名稱或在操作列中單擊管理

  3. 建立網關規則

    1. 在網格詳情頁面左側導覽列,選擇ASM網關 > 網關規則,然後在右側頁面,單擊使用YAML建立

    2. 建立頁面,設定命名空間default,選擇任意情境模版,配置以下YAML,然後單擊建立

      apiVersion: networking.istio.io/v1beta1
      kind: Gateway
      metadata:
        name: grpc-gateway
      spec:
        selector:
          istio: ingressgateway
        servers:
        - port:
            number: 8080
            name: grpc
            protocol: GRPC
          hosts:
          - "*"
  4. 建立目標規則

    1. 在網格詳情頁面左側導覽列,選擇流量管理中心 > 目標規則,然後在右側頁面,單擊使用YAML建立

    2. 建立頁面,設定命名空間default,選擇任意情境模版,配置以下YAML,然後單擊建立

      apiVersion: networking.istio.io/v1beta1
      kind: DestinationRule
      metadata:
        name: dr-istio-grpc-server
      spec:
        host: grpc-helloworld-py
        trafficPolicy:
          loadBalancer:
            simple: ROUND_ROBIN
        subsets:
          - name: v1
            labels:
              version: "v1"
          - name: v2
            labels:
              version: "v2"    
  5. 建立虛擬服務

    1. 在網格詳情頁面左側導覽列,選擇流量管理中心 > 虛擬服務,然後在右側頁面,單擊使用YAML建立

    2. 建立頁面,設定命名空間default,選擇任意情境模版,配置以下YAML,然後單擊建立

      展開查看YAML

      apiVersion: networking.istio.io/v1alpha3
      kind: VirtualService
      metadata:
        name: grpc-vs
      spec:
        hosts:
        - "*"
        gateways:
        - grpc-gateway
        http:
          - match:
              - port: 8080
            route:
              - destination:
                  host: grpc-helloworld-py
                  port:
                    number: 50051
                  subset: v1
                weight: 100
              - destination:
                  host: grpc-helloworld-py
                  port:
                    number: 50051
                  subset: v2
                weight: 0        

步驟三:部署新入口網關或複用已有入口網關

在入口網關中,如果不存在8080連接埠,需要添加8080連接埠。

建立入口網關

  1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

  2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇ASM網關 > 入口網關

  3. 入口網關頁面,單擊建立,配置相關資訊,然後單擊建立

    部分配置項說明如下。關於配置項的更多資訊,請參見入口網關配置項說明

    配置項

    說明

    部署叢集

    選擇要部署入口網關的叢集。

    負載平衡CLB類型

    此處指定負載平衡的類型為公網訪問

    負載平衡

    選擇負載平衡。

    • 使用已有負載平衡:從已有負載平衡列表中選擇。

    • 建立負載平衡CLB:單擊建立負載平衡CLB,從下拉式清單中選擇所需的負載平衡規格。

    說明

    建議您為每個Kubernetes服務分配一個CLB。如果多個Kubernetes服務複用同一個CLB,存在以下風險和限制:

    • 使用已有的CLB會強制覆蓋已有監聽,可能會導致您的應用不可訪問。

    • Kubernetes通過Service建立的CLB不能複用,只能複用您手動在控制台(或調用OpenAPI)建立的CLB。

    • 複用同一個CLB的多個Service不能有相同的前端監聽連接埠,否則會造成連接埠衝突。

    • 複用CLB時,監聽的名字以及虛擬伺服器組的名字被Kubernetes作為唯一識別碼。請勿修改監聽和虛擬伺服器組的名字。

    • 不支援跨叢集複用CLB。

    連接埠映射

    設定協議TCP服務連接埠8080

在已有入口網關添加8080連接埠

  1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

  2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇ASM網關 > 入口網關

  3. 入口網關頁面,單擊目標網關名稱,在網關詳情頁面的基本選項地區,單擊連接埠配置右側的Dingtalk_20230104170049.jpg表徵圖,在連接埠映射對話方塊,單擊添加連接埠,設定協議TCP服務連接埠8080,然後單擊確認

步驟四:運行gRPC用戶端

  1. grpcurl是一個命令列工具,用於與gRPC服務進行互動。它提供了一種簡單的方式來測試和調試gRPC服務,以及查看服務的定義和中繼資料。具體如何下載安裝可以參考https://github.com/fullstorydev/grpcurl。運行如下命令:

    grpcurl -d '{"name": "Jack"}' -plaintext {入口網關IP地址}:8080 helloworld.Greeter/SayHello
  2. 返回以下結果,可以看到所有的請求都指向了v1。

     "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"
     "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"
     "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"
     "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"
     "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"     

步驟五:按比例將流量路由到v2

將40%的流量指向v2,其餘60%的流量仍然指向v1。

  1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

  2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇流量管理中心 > 虛擬服務

  3. 頁面,在grpc-vs虛擬服務右側的操作列下,單擊查看YAML

  4. 編輯對話方塊,更新以下YAML內容,單擊確定

    ....
          route:
            - destination:
                host: grpc-helloworld-py
                port:
                  number: 50051
                subset: v1
              weight: 60
            - destination:
                host: grpc-helloworld-py
                port:
                  number: 50051
                subset: v2
              weight: 40
  5. 繼續使用grpcurl執行以下命令,訪問網格內的gRPC服務。

    grpcurl -d '{"name": "Jack"}' -plaintext {入口網關IP地址}:8080 helloworld.Greeter/SayHello

    返回以下結果,可以看到40%的流量指向了v2。

    說明

    您的測試結果不一定總是100次中有40次指向v2,但從總體比例來看,將接近40%。

    "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"
    "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"
    "message": "Hello, Jack! I'm from grpc-helloworld-py-v2-7f56b49b7f-9vvr7!"
    "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"
    "message": "Hello, Jack! I'm from grpc-helloworld-py-v2-7f56b49b7f-9vvr7!"
    "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"
    "message": "Hello, Jack! I'm from grpc-helloworld-py-v2-7f56b49b7f-9vvr7!"
    "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"
    "message": "Hello, Jack! I'm from grpc-helloworld-py-v2-7f56b49b7f-9vvr7!"
    "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"