使用部署政策限制推出作業

本快速入門導覽課程說明如何防止 Cloud Deploy 在指定時間內將推出內容發布至目標,以及如何覆寫該限制。

在本快速入門導覽課程中,您將完成下列事項:

  1. 建立 Skaffold 設定和 Kubernetes 資訊清單或 Cloud Run 服務定義,指定要部署的 (預先建構) 容器映像檔。

  2. 定義 Cloud Deploy 推送管道和一個部署目標,指向一個 GKE 叢集或 Cloud Run 服務。

    這個管道只包含一個階段,適用於一個目標。

  3. 為目標設定部署政策。

    這項政策會定義日期範圍,禁止在該範圍內向目標推出版本。

  4. 建立版本。

    通常建立版本時,Cloud Deploy 會為推送管道進度中的第一個目標建立推出作業。在本例中,由於政策禁止部署至目標,因此系統不會為該目標建立推出作業。

  5. 在 Google Cloud 控制台中查看結果。

    由於這項政策,您不會看到版本的推出作業,且推送管道的視覺化內容中也沒有待處理的動作。

  6. 覆寫部署政策。

    這項覆寫作業會導致 Cloud Deploy 現在為目標建立推出作業。

  7. 在 Google Cloud 控制台中查看結果。

    由於政策已遭到覆寫,您會看到推出作業正在進行中 (或已完成,如果時間已過)。

事前準備

  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. Verify that billing is enabled for your Google Cloud project.

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

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. 如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI

  7. 如要初始化 gcloud CLI,請執行下列指令:

    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. Verify that billing is enabled for your Google Cloud project.

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

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. 如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI

  13. 如要初始化 gcloud CLI,請執行下列指令:

    gcloud init
  14. 如果您已安裝 Google Cloud 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:

        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
      

    建立執行階段環境

    如果您要部署至 Cloud Run,可以略過這個指令

    如果是 GKE,請建立一個叢集:quickstart-cluster-qsprod。 叢集的 Kubernetes API 端點必須可從公開網際網路連上網路。根據預設,GKE 叢集可從外部存取。

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

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

    Cloud Deploy 會使用 Skaffold 提供詳細資料,說明要部署的內容,以及如何將內容部署至目標

    在本快速入門導覽課程中,您將建立 skaffold.yaml 檔案,其中會識別用於部署範例應用程式的 Kubernetes 資訊清單。

    1. 開啟終端機視窗。

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

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

      GKE

      apiVersion: skaffold/v4beta1
      kind: Config
      manifests:
        rawYaml:
        - k8s-pod.yaml
      deploy:
        kubectl: {}
      

      Cloud Run

      apiVersion: skaffold/v4beta1
      kind: Config
      manifests:
        rawYaml:
        - service.yaml
      deploy:
        cloudrun: {}
      

      這個檔案是基本的 Skaffold 設定。在本快速入門導覽課程中,您會建立檔案。但您也可以讓 Cloud Deploy 為您建立一個,適用於基本、非正式版應用程式。

      如要進一步瞭解這個設定檔,請參閱 skaffold.yaml 參考資料

    4. 為應用程式建立資訊清單,也就是 Cloud Run 的服務定義或 GKE 的 Kubernetes 資訊清單。

      GKE

      建立名為 k8s-pod.yaml 的檔案,並在當中加入下列內容:

      apiVersion: v1
      kind: Pod
      metadata:
        name: getting-started
      spec:
        containers:
        - name: nginx
          image: my-app-image
      

      這個檔案是基本的 Kubernetes 資訊清單,會套用至叢集以部署應用程式。要部署的容器映像檔在此設為預留位置 my-app-image,您建立版本時,會將其替換為特定映像檔。

      Cloud Run

      建立名為 service.yaml 的檔案,並在當中加入下列內容:

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

      這個檔案是基本的 Cloud Run 服務定義,用於部署應用程式。要部署的容器映像檔在此設定為預留位置 my-app-image,當您建立版本時,會以特定映像檔取代。

    建立推送管道和目標

    您可以在一個檔案或多個檔案中定義發布管道和目標。在本快速入門導覽課程中,您將建立同時包含這兩者的單一檔案。

    1. 建立推送管道和目標定義:

      GKE

      deploy-policy-quickstart 目錄中建立新檔案:clouddeploy.yaml,並加入下列內容:

      apiVersion: deploy.cloud.google.com/v1
      kind: DeliveryPipeline
      metadata:
        name: deploy-policy-pipeline
      serialPipeline:
        stages:
        - targetId: prod-target
      ---
      
      apiVersion: deploy.cloud.google.com/v1
      kind: Target
      metadata:
        name: prod-target
      description: production cluster
      gke:
        cluster: projects/PROJECT_ID/locations/us-central1/clusters/quickstart-cluster-qsprod
      

      Cloud Run

      deploy-policy-quickstart 目錄中建立新檔案:clouddeploy.yaml,並加入下列內容:

      apiVersion: deploy.cloud.google.com/v1
      kind: DeliveryPipeline
      metadata:
        name: deploy-policy-pipeline
      serialPipeline:
        stages:
        - targetId: prod-target
      ---
      
      apiVersion: deploy.cloud.google.com/v1
      kind: Target
      metadata:
        name: prod-target
      description: production Run service
      run:
        location: projects/PROJECT_ID/locations/us-central1
      
    2. 向 Cloud Deploy 服務註冊管道和目標資源:

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

      現在您有一個推送管道,其中包含一個目標。

    3. 確認管道和目標:

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

      開啟「推送管道」頁面

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

       Google Cloud 控制台中的推送 pipeline 頁面,顯示您的 pipeline

    建立部署政策

    您可以在與交付管道和目標相同的檔案中定義部署政策,也可以在個別檔案中定義。在本快速入門導覽課程中,我們會分別定義。

    1. 在您建立推送管道和目標的同一個目錄中,建立名為 deploypolicy.yaml 的新檔案,並在當中加入下列內容:

      apiVersion: deploy.cloud.google.com/v1
      description: Restrict all rollouts in the deploy-policy-pipeline resource for the next ten years
      kind: DeployPolicy
      metadata:
        name: quickstart-deploy-policy
      selectors:
      - deliveryPipeline:
          id: 'deploy-policy-pipeline'
      rules:
      - rolloutRestriction:
          id: no-rollouts
          timeWindows:
            timeZone: America/New_York
            oneTimeWindows:
            - start: 2024-01-01 00:00
              end: 2034-01-01 24:00
      

      這項政策將於 2024 年 1 月 1 日起生效,並禁止推出 10 年。這並非實際政策,只是為了本快速入門導覽課程而設定,確保您建立發行內容時,政策已就位。

    2. 向 Cloud Deploy 服務註冊部署政策資源:

      gcloud deploy apply --file=deploypolicy.yaml --region=us-central1 --project=PROJECT_ID
      
    3. 確認部署政策:

      在 Google Cloud 控制台中,前往 Cloud Deploy 的「Deploy policies」(部署政策) 頁面,即可查看可用政策清單。

      開啟「部署政策」頁面

      畫面會顯示您剛才建立的部署政策。

       Google Cloud 控制台的「部署政策」頁面

    建立發布版本

    「版本」是 Cloud Deploy 的核心資源,代表要部署的變更。推送 pipeline 會定義該版本的生命週期。如要進一步瞭解該生命週期,請參閱 Cloud Deploy 服務架構

    GKE

    deploy-policy-quickstart 目錄執行下列指令,建立版本:

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

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

    Cloud Run

    deploy-policy-quickstart 目錄執行下列指令,建立版本:

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

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

    在正常情況下,使用這項指令建立版本時,Cloud Deploy 會為第一個目標建立推出作業。在本例中,由於推出作業受到部署政策限制,因此系統不會建立任何推出作業。指令列會顯示錯誤訊息:

    ERROR: (gcloud.deploy.releases.create) A create-rollout attempt was blocked by the "quickstart-deploy-policy" policy. Target: "prod-target", Delivery pipeline: "deploy-policy-pipeline", policy rule: "no-rollouts"

    覆寫政策限制

    如要部署遭部署政策封鎖的範例應用程式,您需要覆寫該政策。如要這麼做,請針對這個版本建立新的推出作業,這次請加入 --override-deploy-policies 選項:

    GKE

    deploy-policy-quickstart 目錄執行下列指令,建立版本:

     gcloud deploy releases promote --release=test-release-001 \
       --project=PROJECT_ID \
       --region=us-central1 \
       --delivery-pipeline=deploy-policy-pipeline \
       --to-target=prod-target \
       --override-deploy-policies=quickstart-deploy-policy
    

    Cloud Run

    deploy-policy-quickstart 目錄執行下列指令,建立版本:

     gcloud deploy releases promote --release=test-release-001 \
       --project=PROJECT_ID \
       --region=us-central1 \
       --delivery-pipeline=deploy-policy-pipeline \
       --to-target=prod-target \
       --override-deploy-policies=quickstart-deploy-policy
    

    由於您加入了 --override-deploy-policies=quickstart-deploy-policy,且您擁有 roles/clouddeploy.policyAdmin 角色,因此 Cloud Deploy 會忽略您建立的部署政策,並為 prod-target 建立推出作業。

    在 Google Cloud 控制台中查看結果

    1. 在 Google Cloud 控制台中,再次前往 Cloud Deploy 的「Delivery pipelines」(推送 pipeline) 頁面,查看推送 pipeline (deploy-policy-pipeline)。

      開啟「推送管道」頁面

    2. 按一下推送管道的名稱 (deploy-policy-pipeline)。

      管道視覺化會顯示應用程式的部署狀態。在本例中,由於政策遭到覆寫,因此系統已建立推出作業,且作業成功。

      顯示推出作業的推送管道視覺化圖表

      發行內容會列在「推送 pipeline 詳細資料」下方的「發行內容」分頁中。

    清除所用資源

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

    1. 刪除 GKE 叢集或 Cloud Run 服務:

      GKE

      gcloud container clusters delete quickstart-cluster-qsprod --region=us-central1 --project=PROJECT_ID
      

      Cloud Run

      gcloud run services delete my-deploy-policy-run-service --region=us-central1 --project=PROJECT_ID
      
    2. 刪除部署政策:

      gcloud deploy delete --file=deploypolicy.yaml --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 bucket。

      開啟 Cloud Storage 瀏覽器頁面

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

    後續步驟