全部產品
Search
文件中心

Container Service for Kubernetes:實現多叢集gRPC服務的路由轉寄

更新時間:Mar 24, 2026

ACK One ALB多叢集網關支援後端服務為gRPC服務,本文介紹如何通過ALB多叢集網關實現gRPC服務的路由轉寄。

前提條件

  • 已開通負載平衡ALB服務

  • 開啟艦隊管理功能

  • ACK One艦隊已關聯2個與Fleet執行個體相同VPC的ACK叢集。具體操作,請參見管理關聯集群

  • 已從ACK One控制台擷取Fleet執行個體的KubeConfig,並通過kubectl串連至Fleet執行個體。

  • 已安裝grpccurl工具

  • 已擷取到可信的數位憑證。您可以從以下幾個途徑擷取數位憑證。

    • 從阿里雲數位憑證中心購買認證。具體操作,請參見購買正式認證

    • 從其他CA購買認證。

    • 按照本文步驟一產生自我簽署憑證。

      重要

      由於缺乏可靠的CA認證,自我簽署憑證在瀏覽器和用戶端中預設不受信任,通常會導致客戶訪問時收到安全警告。本文中產生的自我簽署憑證僅作為樣本,請勿在生產環境中使用。若您已購買認證,請跳轉至步驟二

步驟一:產生自我簽署憑證(可選)

如果您暫未擁有認證,您可參照此步驟產生自我簽署憑證,樣本中使用grpc.example.com作為認證的網域名稱。關於對ALB執行個體配置認證的方式,請參見配置HTTPS認證以實現加密通訊,本文以其文中Secret認證方式為例

  1. 建立並拷貝以下內容至/tmp/openssl.cnf檔案中。

    [ req ]
    #default_bits           = 2048
    #default_md             = sha256
    #default_keyfile        = privkey.pem
    distinguished_name      = req_distinguished_name
    attributes              = req_attributes
    req_extensions          = v3_req
    
    [ req_distinguished_name ]
    countryName                     = Country Name (2 letter code)
    countryName_min                 = 2
    countryName_max                 = 2
    stateOrProvinceName             = State or Province Name (full name)
    localityName                    = Locality Name (eg, city)
    0.organizationName              = Organization Name (eg, company)
    organizationalUnitName          = Organizational Unit Name (eg, section)
    commonName                      = Common Name (eg, fully qualified host name)
    commonName_max                  = 64
    emailAddress                    = Email Address
    emailAddress_max                = 64
    
    [ req_attributes ]
    challengePassword               = A challenge password
    challengePassword_min           = 4
    challengePassword_max           = 20
    
    [v3_req]
    # Extensions to add to a certificate request
    basicConstraints = CA:FALSE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    subjectAltName = @alt_names
    
    [alt_names]
    DNS.1 = grpc.example.com
  1. 執行以下命令簽署認證請求。

    openssl req -new -nodes -keyout grpc.key -out grpc.csr -config /tmp/openssl.cnf -subj "/C=CN/ST=Zhejiang/L=Hangzhou/O=AlibabaCloud/OU=ContainerService/CN=grpc.example.com"
  2. 執行以下命令簽署認證。

    openssl x509 -req -days 3650 -in grpc.csr -signkey grpc.key -out grpc.crt -extensions v3_req -extfile /tmp/openssl.cnf

    命令執行成功後,可得到認證grpc.crt與私密金鑰檔案grpc.key

  3. 執行以下命令,將認證通過grpc-secret添加到叢集中gateway-demo Namespace下。

    kubectl create secret tls grpc-secret --key grpc.key --cert grpc.crt -ngateway-demo   # grpc.key替換為您的認證檔案,grpc.crt替換為您的私密金鑰檔案。

步驟二:部署gRPC服務到多個叢集

ACK One支援多叢集GitOps和多叢集應用資源分發兩種方式,方便您將應用部署到多個叢集,詳情請參見GitOps快速入門建立多叢集應用應用分發快速入門。本文以GitOps的多叢集應用分發為例。

  1. 登入ACK One控制台,在左側導覽列選擇艦隊 > 多叢集GitOps

  2. 多叢集GitOps頁面左上方,單擊艦隊名稱後的Dingtalk_20231226104633.jpg按鈕,在下拉式清單中選擇目標艦隊。

  3. 單擊建立多叢集應用 > GitOps進入建立多叢集應用 - GitOps頁面。

  4. YAML 建立頁簽,將以下樣本YAML內容複寫到控制台,然後單擊確定部署應用。

    說明
    • 以下YAML內容是將部署到所有關聯集群中gateway-demo namespace下,您也可以通過快捷建立選擇叢集,變化會同步到YAML 建立的內容。

    • 若叢集中沒有gateway-demo Namespace,則需您手動建立。

    apiVersion: argoproj.io/v1alpha1
    kind: ApplicationSet
    metadata:
      name: appset-grpc-demo
      namespace: argocd
    spec:
      template:
        metadata:
          name: '{{.metadata.annotations.cluster_name}}-grpc'
          namespace: argocd
        spec:
          destination:
            name: '{{.name}}'
            namespace: gateway-demo
          project: default
          source:
            repoURL: https://github.com/ivan-cai/gitops-demo.git
            path: manifests/directory/grpc
            targetRevision: main
          syncPolicy:
            automated: {}
            syncOptions:
              - CreateNamespace=true
      generators:
        - clusters:
            selector:
              matchExpressions:
                - values:
                    - cluster
                  key: argocd.argoproj.io/secret-type
                  operator: In
                - values:
                    - in-cluster
                  key: name
                  operator: NotIn
      goTemplateOptions:
        - missingkey=error
      syncPolicy:
        preserveResourcesOnDeletion: false
      goTemplate: true

步驟三:建立ALB多叢集網關並建立Ingress

通過在ACK One 艦隊中建立AlbConfig對象來建立一個ACK One ALB多叢集網關,並為ALB多叢集網關添加關聯集群。對於gRPC服務,必須使用HTTPS協議,所以在listeners中需要添加HTTPS連接埠,本文以443連接埠為例。

  1. 從ACK One艦隊所在VPC,擷取兩個虛擬交換器ID。

  2. 使用以下內容,建立gateway.yaml檔案。

    說明
    • 請將${vsw-id1}${vsw-id2}替換為您上一步擷取的交換器ID,${cluster1}${cluster2}替換為您待添加的關聯集群ID。

    • 子叢集${cluster1}${cluster2}的安全性群組的入方向需要允許該交換器網段的IP和所有連接埠通過。

    apiVersion: alibabacloud.com/v1
    kind: AlbConfig
    metadata:
      name: ackone-gateway-demo
      annotations:
        # 添加要處理流量的關聯集群到ALB多叢集執行個體。
        alb.ingress.kubernetes.io/remote-clusters: ${cluster1},${cluster2}
    spec:
      config:
        name: one-alb-demo
        addressType: Internet
        addressAllocatedMode: Fixed
        zoneMappings:
        - vSwitchId: ${vsw-id1}
        - vSwitchId: ${vsw-id2}
      listeners:
      - port: 8001
        protocol: HTTP
      - port: 443
        protocol: HTTPS
    ---
    apiVersion: networking.k8s.io/v1
    kind: IngressClass
    metadata:
      name: alb
    spec:
      controller: ingress.k8s.alibabacloud/alb
      parameters:
        apiGroup: alibabacloud.com
        kind: AlbConfig
        name: ackone-gateway-demo
  3. 使用以下內容,建立Ingress。

    說明

    Ingress中必須指定annotation:alb.ingress.kubernetes.io/backend-protocol: grpc,以及對應的alb.ingress.kubernetes.io/listen-ports。並且引用步驟一中的Secret認證。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        alb.ingress.kubernetes.io/listen-ports: |
         [{"HTTPS": 443}]
        alb.ingress.kubernetes.io/backend-protocol: grpc
      name: grpc-ingress
      namespace: gateway-demo
    spec:
      ingressClassName: alb
      rules:
      - host: grpc.example.com
        http:
          paths:
          - backend:
              service:
                name: grpc-service
                port:
                  number: 50051
            path: /
            pathType: Prefix
      tls:
      - hosts:
        - grpc.example.com
        secretName: grpc-secret

步驟四:驗證流量轉寄效果

  1. 執行以下命令,查看Ingress資訊。

    kubectl get ingress -ngateway-demo

    預期輸出:

    NAME           CLASS   HOSTS              ADDRESS         PORTS     AGE
    grpc-ingress   alb     grpc.example.com   alb-*****       80, 443   3m51s
  2. 使用grpcurl串連服務。

    # <ADDRESS>替換為上一步中記錄的ALB網域名稱。
    grpcurl -insecure -authority grpc.example.com <ADDRESS>:443 list 

    輸出如下,表明流量被Ingress成功轉寄到後端gRPC服務:

    grpc.reflection.v1alpha.ServerReflection
    helloworld.Greeter