Cloud Service Mesh 範例:初期測試部署


在本教學課程中,您將瞭解常見用途:使用 Istio API 透過 Cloud Service Mesh 推出 Canary 部署。

什麼是初期測試部署?

初期測試部署會將一小部分流量導向新版微服務,然後逐漸提高該百分比,同時淘汰舊版。如果這個程序發生錯誤,流量可以切換回舊版。透過 Cloud Service Mesh,您可以將流量導向新服務,確保新服務安全無虞。

費用

在本文件中,您會使用 Google Cloud的下列計費元件:

如要根據預測用量估算費用,請使用 Pricing Calculator

初次使用 Google Cloud 的使用者可能符合免費試用資格。

完成本教學課程後,您可以刪除已建立的資源,避免持續產生費用。詳情請參閱「清除」。

事前準備

部署 Online Boutique

  1. kubectl 的目前環境設為要部署 Online Boutique 的叢集。指令取決於您是在 GKE 叢集還是 GKE 以外的 Kubernetes 叢集上佈建 Cloud Service Mesh:

    Google Cloud 中的 GKE

    gcloud container clusters get-credentials CLUSTER_NAME  \
        --project=PROJECT_ID \
        --zone=CLUSTER_LOCATION 
    

    Google Cloud 以外的 GKE

    kubectl config use-context CLUSTER_NAME 
    
  2. 為範例應用程式和輸入閘道建立命名空間:

    kubectl create namespace onlineboutique
    
  3. 標記 onlineboutique 命名空間,自動插入 Envoy Proxy。 請按照這篇文章的步驟,啟用自動 Sidecar 插入功能。

  4. 部署範例應用程式。在本教學課程中,您將部署 Online Boutique,這是一個微服務示範應用程式。

    kubectl apply \
    -n onlineboutique \
    -f https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-service-mesh-samples/main/docs/shared/online-boutique/kubernetes-manifests.yaml
    
  5. 執行下列指令,將 version=v1 標籤新增至 productcatalog 部署作業:

    kubectl patch deployments/productcatalogservice -p '{"spec":{"template":{"metadata":{"labels":{"version":"v1"}}}}}' \
    -n onlineboutique
    

    查看您部署的服務:

    kubectl get pods -n onlineboutique
    

    預期輸出內容:

    NAME                                     READY   STATUS    RESTARTS   AGE
    adservice-85598d856b-m84m6               2/2     Running   0          2m7s
    cartservice-c77f6b866-m67vd              2/2     Running   0          2m8s
    checkoutservice-654c47f4b6-hqtqr         2/2     Running   0          2m10s
    currencyservice-59bc889674-jhk8z         2/2     Running   0          2m8s
    emailservice-5b9fff7cb8-8nqwz            2/2     Running   0          2m10s
    frontend-77b88cc7cb-mr4rp                2/2     Running   0          2m9s
    loadgenerator-6958f5bc8b-55q7w           2/2     Running   0          2m8s
    paymentservice-68dd9755bb-2jmb7          2/2     Running   0          2m9s
    productcatalogservice-84f95c95ff-c5kl6   2/2     Running   0          114s
    recommendationservice-64dc9dfbc8-xfs2t   2/2     Running   0          2m9s
    redis-cart-5b569cd47-cc2qd               2/2     Running   0          2m7s
    shippingservice-5488d5b6cb-lfhtt         2/2     Running   0          2m7s
    

    READY 欄中的 2/2 表示 Pod 已啟動並執行,且已成功注入 Envoy Proxy。

  6. 部署 productcatalog 第 1 版的 VirtualServiceDestinationRule

     kubectl apply -f destination-vs-v1.yaml -n onlineboutique
    
    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: productcatalogservice
    spec:
      host: productcatalogservice
      subsets:
      - labels:
          version: v1
        name: v1
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: productcatalogservice
    spec:
      hosts:
      - productcatalogservice
      http:
      - route:
        - destination:
            host: productcatalogservice
            subset: v1

    請注意,資源中只會出現 v1

    查看建立的 Destination Rule

      kubectl get destinationrules -n onlineboutique
    

    預期輸出內容:

      NAME                    HOST                    AGE
      productcatalogservice   productcatalogservice   2m
    

    查看建立的 VirtualService

      kubectl get virtualservices -n onlineboutique
    

    預期結果:

      NAME                    GATEWAYS   HOSTS                       AGE
      productcatalogservice              ["productcatalogservice"]   2m
    
  7. 使用 Ingress 閘道的外部 IP 位址,在瀏覽器中造訪應用程式:

    kubectl get services -n GATEWAY_NAMESPACE
    

下一節將帶您瀏覽 Cloud Service Mesh 使用者介面,並說明如何查看指標。

在 Google Cloud 控制台中查看服務

  1. 在 Google Cloud 控制台中,前往「Google Kubernetes Engine (GKE) Enterprise 版服務」頁面。

    前往 Google Kubernetes Engine (GKE) Enterprise 版服務

  2. 預設會以「清單」檢視模式查看服務。

    表格總覽可讓您一目瞭然地觀察所有服務和重要指標。

  3. 按一下右上方的「拓撲」。 您可以在這裡查看服務及其互動情形。

    展開「服務」,將游標懸停在各項服務上,即可查看每項服務的「每秒要求數」

  4. 返回「表格檢視」

  5. 在「服務表」中,選取 productcatalogservice。系統會將您導向服務總覽頁面。

  6. 在畫面左側,按一下「流量」

  7. 確保傳入 productcatalogservice 的流量 100% 都會導向工作負載服務。

下一節將說明如何建立 productcatalog 服務的第 2 版。

部署服務的 v2 版本

  1. 在本教學課程中,productcatalogservice-v2 會在含有 EXTRA_LATENCY 欄位的要求中,導入 3 秒的延遲。這會模擬新版服務中的迴歸。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: productcatalogservice-v2
    spec:
      selector:
        matchLabels:
          app: productcatalogservice
      template:
        metadata:
          labels:
            app: productcatalogservice
            version: v2
        spec:
          containers:
          - env:
            - name: PORT
              value: '3550'
            - name: EXTRA_LATENCY
              value: 3s
            name: server
            image: gcr.io/google-samples/microservices-demo/productcatalogservice:v0.3.6
            livenessProbe:
              exec:
                command: ["/bin/grpc_health_probe", "-addr=:3550"]
            ports:
            - containerPort: 3550
            readinessProbe:
              exec:
                command: ["/bin/grpc_health_probe", "-addr=:3550"]
            resources:
              limits:
                cpu: 200m
                memory: 128Mi
              requests:
                cpu: 100m
                memory: 64Mi
          terminationGracePeriodSeconds: 5

    將這項資源套用至 onlineboutique 命名空間。

    kubectl apply -f productcatalog-v2.yaml -n onlineboutique
    
  2. 檢查應用程式 Pod。

    kubectl get pods -n onlineboutique
    

    預期輸出內容:

    NAME                                     READY   STATUS    RESTARTS   AGE
    adservice-85598d856b-8wqfd                  2/2     Running   0          25h
    cartservice-c77f6b866-7jwcr                 2/2     Running   0          25h
    checkoutservice-654c47f4b6-n8c6x            2/2     Running   0          25h
    currencyservice-59bc889674-l5xw2            2/2     Running   0          25h
    emailservice-5b9fff7cb8-jjr89               2/2     Running   0          25h
    frontend-77b88cc7cb-bwtk4                   2/2     Running   0          25h
    loadgenerator-6958f5bc8b-lqmnw              2/2     Running   0          25h
    paymentservice-68dd9755bb-dckrj             2/2     Running   0          25h
    productcatalogservice-84f95c95ff-ddhjv      2/2     Running   0          25h
    productcatalogservice-v2-6df4cf5475-9lwjb   2/2     Running   0          8s
    recommendationservice-64dc9dfbc8-7s7cx      2/2     Running   0          25h
    redis-cart-5b569cd47-vw7lw                  2/2     Running   0          25h
    shippingservice-5488d5b6cb-dj5gd            2/2     Running   0          25h
    

    請注意,現在列出了兩個 productcatalogservices

  3. 使用 DestinationRule 指定服務的子集。在這種情況下,v1 有一個子集,v2 則有另一個子集。productcatalogservice

    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: productcatalogservice
    spec:
      host: productcatalogservice
      subsets:
      - labels:
          version: v1
        name: v1
      - labels:
          version: v2
        name: v2

    請注意 labels 欄位。流量由 VirtualService 路由後,系統會區分 productcatalogservice 的版本。

    套用 DestinationRule

    kubectl apply -f destination-v1-v2.yaml -n onlineboutique
    

在 v1 和 v2 之間拆分流量

  1. 使用 VirtualService 定義一小部分的流量,並將其導向 productcatalogservice 的 v2。

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: productcatalogservice
    spec:
      hosts:
      - productcatalogservice
      http:
      - route:
        - destination:
            host: productcatalogservice
            subset: v1
          weight: 75
        - destination:
            host: productcatalogservice
            subset: v2
          weight: 25

    子集欄位會指出版本,權重欄位則會指出流量的百分比拆分。75% 的流量會導向 productcatalog 的 v1,25% 的流量則會導向 v2。

    套用 VirtualService

    kubectl apply -f vs-split-traffic.yaml -n onlineboutique
    

如果您造訪叢集 Ingress 的 EXTERNAL_IP,應該會發現前端載入速度會定期變慢。

下一節將說明如何使用 Google Cloud 控制台查看流量分配情形。

在 Google Cloud 控制台中觀察流量分配

  1. 返回 Google Cloud 控制台,然後前往 GKE Enterprise 服務頁面。 前往 GKE Enterprise 服務

  2. 按一下右上方的「拓撲」

    展開 productcatalogservice 工作負載,並記下 productcatalogserviceproductcatalogservice-v2 部署作業。

  3. 返回「表格檢視」

  4. 按一下「服務」表格中的 productcatalogservice

  5. 返回左側導覽列的「流量」

  6. 請注意,系統會根據 VirtualService 檔案中指定的百分比,將傳入流量分配給 v1 和 v2,且 productcatalog 服務有 2 個工作負載。

    頁面右側會顯示「要求」、「錯誤率」和「延遲時間指標」。 透過 Cloud Service Mesh,每項服務都會列出這些指標,為您提供可觀測性指標。

推出或復原至某個版本

在初期測試部署期間觀察指標後,您可以完成推出新服務版本,或利用 VirtualService 資源還原至原始服務版本。

推出

確認 v2 服務的行為符合預期後,您可以逐步增加導向 v2 服務的流量百分比。最後,從您在上方建立的 VirtualService 資源中移除流量分配,即可將所有流量導向新服務。

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: productcatalogservice
spec:
  hosts:
  - productcatalogservice
  http:
  - route:
    - destination:
        host: productcatalogservice
        subset: v2

如要將所有流量導向 productcatalogservice 的 v2:

kubectl apply -f vs-v2.yaml -n onlineboutique

復原

如要還原至 v1 服務,請套用先前的 destination-vs-v1.yaml。這樣一來,流量只會導向 productcatalogservice 的 v1。

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: productcatalogservice
spec:
  hosts:
  - productcatalogservice
  http:
  - route:
    - destination:
        host: productcatalogservice
        subset: v1

如要將所有流量導向 productcatalogservice 的 v1:

kubectl apply -f vs-v1.yaml -n onlineboutique

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取本教學課程中所用資源的相關費用,請刪除含有該項資源的專案,或者保留專案但刪除個別資源。

如要避免系統持續向您的 Google Cloud 帳戶收取本教學課程所用資源的費用,請刪除專案或個別資源。

刪除專案

在 Cloud Shell 中刪除專案:

gcloud projects delete PROJECT_ID

刪除資源

如要避免產生額外費用,請刪除叢集:

gcloud container clusters delete  CLUSTER_NAME  \
  --project=PROJECT_ID \
  --zone=CLUSTER_LOCATION 

如果您使用 gcloud container fleet memberships 向機群註冊叢集 (而非在建立叢集時使用 --enable-fleet--fleet-project),請移除過時的成員資格:

gcloud container fleet memberships delete  MEMBERSHIP  \
  --project=PROJECT_ID

如要保留為 Cloud Service Mesh 設定的叢集,但移除 Online Boutique 範例:

  1. 刪除應用程式命名空間:

    kubectl delete -f namespace onlineboutique
    

    預期輸出內容:

    namespace "onlineboutique" deleted
    
  2. 刪除服務項目:

    kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/main/istio-manifests/frontend.yaml -n onlineboutique
    kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/main/istio-manifests/frontend-gateway.yaml -n onlineboutique
    

    預期輸出內容:

    serviceentry.networking.istio.io "allow-egress-googleapis" deleted
    serviceentry.networking.istio.io "allow-egress-google-metadata" deleted
    

後續步驟