將應用程式以初期測試部署至目標

本快速入門導覽課程說明如何使用 Cloud Deploy,將初期測試版中的應用程式範例圖像,提交至 Google Kubernetes Engine 或 Cloud Run。(您也可以執行 GKE Enterprise 的 Canary 部署,但本快速入門指南只會顯示 GKE 和 Cloud Run)。

初期測試部署會將流量分散到已部署的應用程式版本和新版本之間。Cloud Run 會根據您在推送管道中設定的百分比分配流量。GKE 會將新版本部署至部分 Pod。這個快速入門課程會先部署至 50%,然後再部署至 100%。

在本快速入門導覽課程中,只有一個目標 (prod)。因此,我們只會建立一個 GKE 叢集或一個 Cloud Run 服務來執行應用程式。

在本快速入門導覽課程中,您將執行以下操作:

  1. 建立一個 GKE 叢集或定義一個 Cloud Run 服務。

    您也可以將 Canary 部署至 GKE Enterprise 叢集,但本快速入門教學課程只使用 GKE 和 Cloud Run。

  2. 建立 Skaffold 設定和 Kubernetes 資訊清單,指定要部署的 (預先建構) 容器映像檔。

  3. 定義 Cloud Deploy 推送管道和部署目標

  4. 建立版本,自動部署至單一目標,藉此叫用發布管道。

    這個第一個版本略過 Canary 測試階段

  5. 在 Google Cloud 控制台中查看推送管道和版本。

  6. 建立第二個版本,這次執行初期測試階段,將應用程式部署至 50%。

  7. 將版本推送至 100%。

事前準備

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  7. To initialize the gcloud CLI, run the following command:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  9. Make sure that billing is enabled for your Google Cloud project.

  10. Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  13. To initialize the gcloud CLI, run the following command:

    gcloud init
  14. 如果您已安裝 CLI,請確認您執行的是最新版本:

    gcloud components update
    

  15. 確認預設的 Compute Engine 服務帳戶具備足夠的權限。

    服務帳戶可能已具備必要權限。如果專案已停用為預設服務帳戶自動授予角色的功能,則適用這些步驟。

    1. 首先新增 clouddeploy.jobRunner 角色:

      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --role="roles/clouddeploy.jobRunner"
      

    2. 為特定執行階段新增開發人員角色。
      • 適用於 GKE 和 GKE 搭配 Gateway API:

        gcloud projects add-iam-policy-binding PROJECT_ID \
            --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
            --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
            --role="roles/container.developer"
        

      • 針對 Cloud Run:

        gcloud projects add-iam-policy-binding PROJECT_ID \
            --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
            --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
            --role="roles/run.developer"
        

    3. 新增 iam.serviceAccountUser 角色,其中包含要部署至執行階段的 actAs 權限:

      gcloud iam service-accounts add-iam-policy-binding $(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --role="roles/iam.serviceAccountUser" \
          --project=PROJECT_ID
      

    建立執行階段環境

    GKE

    建立一個 GKE Autopilot 叢集:

     gcloud container clusters create-auto canary-quickstart-cluster \
                      --project=PROJECT_ID \
                      --region=us-central1
    

    GKE + Gateway API

    1. 建立一個 GKE 叢集,並設定支援與 Istio 搭配使用的建議設定:

      gcloud container clusters create canary-quickstart-cluster \
             --machine-type=n1-standard-1 \
             --num-nodes 4 \
             --region=us-central1 \
             --project=PROJECT_ID
      
    2. 取得叢集憑證:

      gcloud container clusters get-credentials canary-quickstart-cluster \
             --project=PROJECT_ID \
             --region=us-central1
      
    3. 如果叢集上尚未安裝 Kubernetes Gateway API CRD,請安裝這些 CRD。

      kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v0.6.2/standard-install.yaml
      
    4. 安裝 Istio 即可啟用 Istio 的閘道控制器實作。

      curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.17.2 sh - \
      && ./istio-1.17.2/bin/istioctl install --set profile=minimal -y
      

    Cloud Run

    如果您使用的是 Cloud Run,可以略過這項指令,不必採取任何行動。

準備 Skaffold 設定和應用程式資訊清單

Cloud Deploy 會使用 Skaffold 提供詳細資訊,說明要部署哪些內容,以及如何正確地將這些內容部署至目標

在本快速入門導覽課程中,您會建立 skaffold.yaml 檔案,用於識別要部署的 Kubernetes 資訊清單或 Cloud Run 服務設定。

  1. 開啟終端機視窗。

  2. 建立新目錄並前往該目錄。

    GKE

    mkdir deploy-canary-quickstart-gke
    cd deploy-canary-quickstart-gke
    

    GKE + Gateway API

    mkdir deploy-canary-quickstart-gke-gatewayapi
    cd deploy-canary-quickstart-gke-gatewayapi
    

    Cloud Run

    mkdir deploy-canary-quickstart-run
    cd deploy-canary-quickstart-run
    
  3. 建立名為 skaffold.yaml 的檔案,並在當中加入下列內容:

    GKE

    apiVersion: skaffold/v4beta7
    kind: Config
    manifests:
      rawYaml:
      - kubernetes.yaml
    deploy:
      kubectl: {}
    

    GKE + Gateway API

    apiVersion: skaffold/v4beta7
    kind: Config
    manifests:
      rawYaml:
      - kubernetes.yaml
    deploy:
      kubectl: {}
    

    Cloud Run

    apiVersion: skaffold/v4beta7
    kind: Config
    manifests:
      rawYaml:
      - run.yaml
    deploy:
      cloudrun: {}
    

    這個檔案是基本 Skaffold 設定,可識別資訊清單。在本快速入門課程中,您將建立檔案。不過,您也可以讓 Cloud Deploy 為您建立一個,用於簡單的非正式版應用程式。

    如要進一步瞭解此檔案,請參閱 skaffold.yaml 參考資料

  4. 建立應用程式資訊清單。

    GKE

    deploy-canary-quickstart-gke 目錄中建立名為 kubernetes.yaml 的檔案,並在其中加入下列內容:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment
      labels:
        app: my-app
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - name: nginx
            image: my-app-image
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
      namespace: default
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
    

    這個檔案是 Kubernetes 資訊清單,會套用至叢集以部署應用程式。這個資訊清單包含 Canary 部署作業所需的服務和部署資源,以及使用 Gateway API 所需的 HTTPRoute 和 Gateway 資源。

    要部署的容器映像檔會在此處設為預留位置 my-app-image,並在建立版本時替換為特定映像檔。

    GKE + Gateway API

    deploy-canary-quickstart-gke-gatewayapi 目錄中建立名為 kubernetes.yaml 的檔案,並在其中加入下列內容:

    kind: Gateway
    apiVersion: gateway.networking.k8s.io/v1beta1
    metadata:
      name: my-gateway
      annotations:
        networking.istio.io/service-type: "ClusterIP"
    spec:
      gatewayClassName: istio
      listeners:
      - name: default
        hostname: "*.example.com"
        port: 80
        protocol: HTTP
        allowedRoutes:
          namespaces:
            from: All
    ---
    kind: HTTPRoute
    apiVersion: gateway.networking.k8s.io/v1beta1
    metadata:
      name: my-httproute
    spec:
      parentRefs:
      - kind: Gateway
        name: my-gateway
      hostnames:
      - "test.example.com"
      rules:
      - backendRefs:
        - name: my-service
          port: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        app: my-app
      ports:
      - name: tcp-port
        protocol: TCP
        port: 80
        targetPort: 8080
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment
      labels:
        app: my-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - name: nginx
            image: my-app-image
    

    這個檔案是 Kubernetes 資訊清單,會套用至叢集以部署應用程式。這個資訊清單包含 Canary 部署作業所需的服務和部署資源,以及使用 Gateway API 所需的 HTTPRoute 和 Gateway 資源。

    要部署的容器映像檔會在此處設為預留位置 my-app-image,並在建立版本時替換為特定映像檔。

    Cloud Run

    deploy-canary-quickstart-run 目錄中建立名為 run.yaml 的檔案,並在其中加入下列內容:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: my-canary-run-service
    spec:
      template:
        spec:
          containers:
          - image: my-app-image
    

    這個檔案是基本 Cloud Run 服務定義,會在部署時套用,以便在 Cloud Run 中建立服務。要部署的容器映像檔會在此處設為預留位置 my-app-image,並在建立版本時替換為特定映像檔。

建立推送管道和目標

您可以在單一檔案或個別檔案中定義提交管道和目標。在本快速入門導覽課程中,我們會為管道和單一目標建立一個檔案:

GKE

deploy-canary-quickstart-gke 目錄中建立名為 clouddeploy.yaml 的檔案,並在其中加入下列內容:

apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
  name: my-canary-demo-app-1
description: main application pipeline
serialPipeline:
  stages:
  - targetId: prod
    profiles: []
    strategy:
      canary:
        runtimeConfig:
          kubernetes:
            serviceNetworking:
              service: "my-service"
              deployment: "my-deployment"
        canaryDeployment:
          percentages: [50]
          verify: false
---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
  name: prod
description: prod GKE cluster
gke:
 cluster: projects/PROJECT_ID/locations/us-central1/clusters/canary-quickstart-cluster

GKE + Gateway API

deploy-canary-quickstart-gke-gatewayapi 目錄中建立名為 clouddeploy.yaml 的檔案,並在其中加入下列內容:

apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
  name: my-canary-demo-app-1
description: main application pipeline
serialPipeline:
  stages:
  - targetId: prod
    profiles: []
    strategy:
      canary:
        runtimeConfig:
          kubernetes:
            gatewayServiceMesh:
              httpRoute: "my-httproute"
              service: "my-service"
              deployment: "my-deployment"
        canaryDeployment:
          percentages: [50]
          verify: false
---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
  name: prod
description: prod GKE cluster
gke:
 cluster: projects/PROJECT_ID/locations/us-central1/clusters/canary-quickstart-cluster

Cloud Run

deploy-canary-quickstart-run 目錄中建立名為 clouddeploy.yaml 的檔案,並在當中加入下列內容:

apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
  name: my-canary-demo-app-1
description: main application pipeline
serialPipeline:
  stages:
  - targetId: prod
    profiles: []
    strategy:
      canary:
        runtimeConfig:
          cloudRun:
            automaticTrafficControl: true
        canaryDeployment:
          percentages: [50]
          verify: false
---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
  name: prod
description: prod Run Service
run:
  location: projects/PROJECT_ID/locations/us-central1
  1. 使用 Cloud Deploy 服務註冊管道和目標:

    gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=PROJECT_ID
    

    您現在已建立管道,並為初期測試版本策略設定一個目標。

  2. 確認管道和目標:

    在 Google Cloud 控制台中,前往 Cloud Deploy 的「Delivery pipelines」(推送管道) 頁面,查看可用的推送管道清單。

    開啟「Delivery pipelines」頁面

    系統會顯示您剛建立的推送管道,並在「目標」欄中列出您設定的目標。

     Google Cloud 控制台的發布管道視覺化圖表

建立版本

版本是代表待部署變更的集中式 Cloud Deploy 資源。發布管道會定義該版本的生命週期。如要進一步瞭解這個生命週期,請參閱 Cloud Deploy 服務架構

如要建立代表要部署的容器映像檔的 release 資源,請從 deploy-canary-quickstart-gkedeploy-canary-quickstart-gke-gatewayapideploy-canary-quickstart-run 目錄執行下列指令:

GKE

 gcloud deploy releases create test-release-001 \
   --project=PROJECT_ID \
   --region=us-central1 \
   --delivery-pipeline=my-canary-demo-app-1 \
   --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa

GKE + Gateway API

 gcloud deploy releases create test-release-001 \
   --project=PROJECT_ID \
   --region=us-central1 \
   --delivery-pipeline=my-canary-demo-app-1 \
   --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa

Cloud Run

 gcloud deploy releases create test-release-001 \
   --project=PROJECT_ID \
   --region=us-central1 \
   --delivery-pipeline=my-canary-demo-app-1 \
   --images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:95ade4b17adcd07623b0a0c68359e344fe54e65d0cb01b989e24c39f2fcd296a

請注意 --images= 旗標,您可以使用該旗標將資訊清單或服務定義中的預留位置 (my-app-image) 替換為特定 SHA 合格映像檔。Google 建議您以這種方式建立資訊清單範本,並在建立版本時使用 SHA 合格圖片名稱。

建立發布版本時,Cloud Deploy 也會自動建立推出資源,以便立即部署至單一目標 prod

我們跳過穩定階段

在這個第一個版本中,我們略過 Canary 階段,並部署至 100% (穩定階段)。這是因為應用程式先前未部署,因此無法計算 50% 的 Pod (適用於 GKE),也無法計算服務的流量分配方式 (適用於 Cloud Run)。Pod (GKE) 或修訂版本 (Cloud Run) 尚未存在。

跳過 Canary 階段後,我們現在可以開始穩定階段,將流量提升至 100%。之後,我們會建立另一個版本,並執行初期測試版。

在實際情況中,您通常會在應用程式已在執行的情況下執行 Canary 部署,因此很少會略過這個階段。

在 Google Cloud 控制台中查看版本

您已建立第一個版本,因此系統會建立發布作業,您可以在 Google Cloud 控制台中查看版本和發布作業。您也可以查看 pipeline 視覺化圖表,瞭解版本目前的狀態。

  1. 在 Google Cloud 控制台中,前往 Cloud Deploy 的「Delivery pipelines」(推送管道) 頁面,查看「my-canary-demo-app-1」推送管道。

    開啟「Delivery pipelines」頁面

  2. 按一下推送管道名稱「my-canary-demo-app-1」。

    管道示意圖會顯示應用程式的部署狀態。由於管道中只有一個階段,因此視覺化資訊只會顯示一個節點。

     Google Cloud 控制台的發布管道視覺化圖表

    你的版本會列在「發布管道詳細資料」下方的「版本」分頁中。

  3. 按一下版本名稱 test-release-001

    推出計畫會顯示在「推出計畫」下方。您可以按一下推行內容,查看詳細資料,包括部署記錄。

    在 Google Cloud 控制台發布

    請注意,推出狀態為「待提前」,而管道示意圖中顯示的目標有「提前至穩定版」的連結。

將推出階段推進至下一個階段

在第一個版本發布後,系統略過了初期測試階段,並等待開始「穩定」階段,以便將應用程式部署至 100%:

  1. 在管道示意圖中,按一下「前往穩定版」

  2. 系統提示時,按一下「繼續」確認。

幾分鐘後,現在已進入「穩定」階段,應用程式已部署到 100%。

穩定階段的推送管道

執行初期測試部署

由於第一個版本略過了初期測試階段,我們現在會建立另一個版本,這次會執行初期測試部署。

  1. 如要建立新的 release,請從 deploy-canary-quickstart-gkedeploy-canary-quickstart-gke-gatewayapideploy-canary-quickstart-run 目錄執行下列指令:

    GKE

    gcloud deploy releases create test-release-002 \
      --project=PROJECT_ID \
      --region=us-central1 \
      --delivery-pipeline=my-canary-demo-app-1 \
      --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
    

    GKE + Gateway API

    gcloud deploy releases create test-release-002 \
      --project=PROJECT_ID \
      --region=us-central1 \
      --delivery-pipeline=my-canary-demo-app-1 \
      --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
    

    Cloud Run

    gcloud deploy releases create test-release-002 \
      --project=PROJECT_ID \
      --region=us-central1 \
      --delivery-pipeline=my-canary-demo-app-1 \
      --images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:95ade4b17adcd07623b0a0c68359e344fe54e65d0cb01b989e24c39f2fcd296a
    

    幾分鐘後,系統會建立推行作業,這次會執行 Canary 階段:

    推送管道開始初期測試階段

    第一階段推出作業完成後,推出作業就會進入初期測試版本階段:

     Google Cloud 控制台中的提交管道視覺化圖表,應用程式已部署至 50%

    也就是說,應用程式現在已部署至 50%。對於以服務網路為基礎的 GKE,會部署至一半的 pod。以 Gateway API 為基礎的 GKE 和 Cloud Run 流量會分配 50%。

  2. 按一下「開始推廣」,然後在系統提示時按一下「開始」

    這會將推出作業推進至「穩定」階段,並將應用程式部署至 100%。

    推送管道處於穩定階段,已部署至 100%

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取您在本頁所用資源的費用,請按照下列步驟操作。

  1. 刪除 canary-quickstart-cluster 叢集 (僅限 GKE):

    gcloud container clusters delete canary-quickstart-cluster --region=us-central1 --project=PROJECT_ID
    
  2. 刪除 my-canary-run-service 服務 (僅限 Cloud Run):

    gcloud run services delete my-canary-run-service --region=us-central1 --project=PROJECT_ID
    
  3. 刪除推送管道、目標,以及所有版本和推出資源:

    gcloud deploy delete --file=clouddeploy.yaml --force --region=us-central1 --project=PROJECT_ID
    
  4. 刪除 Cloud Deploy 建立的 Cloud Storage 值區。

    一個結尾是 _clouddeploy,另一個是 [region].deploy-artifacts.[project].appspot.com

    開啟 Cloud Storage 瀏覽器頁面

大功告成,您已經完成本快速入門導覽課程!

後續步驟