使用 Cloud Deploy 部署 Cloud Run 應用程式

1. 總覽

在本研究室中,您將使用 Cloud Deploy 將 .Net 應用程式部署至 Cloud Run。您將使用 Cloud Build 建構容器映像檔,但不使用 Dockerfile。您將使用 Cloud Deploy 設定包含三個目標環境的管道,並完成透過環境推送版本的步驟。最後,您會核准要部署至正式環境的版本。

916a54f51af5ee54.png

什麼是 Cloud Build?

Cloud Build 可讓您迅速建構所有程式設計語言版本的軟體。

什麼是 Cloud Deploy?

Cloud Deploy 是一項全代管的持續推送軟體更新服務。您可以使用 Cloud Deploy 建立 GKE、Anthos 和 Cloud Run 的部署管道。

什麼是 Cloud Run?

您可以使用 Cloud Run,在全代管平台上部署以任何語言 (包括 Go、Python、Java、Node.js、.NET 和 Ruby) 編寫的可擴充容器化應用程式。

什麼是 Skaffold?

Skaffold 是一項指令列工具,可為原生 Kubernetes 應用程式提供持續開發功能。Cloud Deploy 會使用 Skaffold 執行算繪和部署作業。

學習目標

本實驗室將說明如何執行下列工作:

  • 建立 Cloud Deploy 管道
  • 使用 Cloud Build 為 .Net 應用程式建立容器映像檔,不使用 Dockerfile
  • 使用 Cloud Deploy 將應用程式部署至 Cloud Run
  • 推送 Cloud Deploy 版本

必要條件

  • 本實驗室假設您已熟悉 Cloud 控制台和殼層環境。

2. 設定和需求

Cloud 專案設定

  1. 登入 Google Cloud 控制台,然後建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請務必建立帳戶

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 「Project name」是這個專案參與者的顯示名稱。這是 Google API 不會使用的字元字串。您隨時可以更新。
  • 專案 ID 在所有 Google Cloud 專案中都是不重複的值,且無法變更 (設定後即無法變更)。Cloud 控制台會自動產生一個專屬字串,您通常不需要特別留意。在大多數程式碼研究室中,您都需要參照專案 ID (通常會標示為 PROJECT_ID)。如果您不喜歡系統產生的 ID,可以隨機產生另一組 ID。或者,您也可以自行嘗試,看看是否可用。這項設定在這個步驟後即無法變更,並會在專案期間維持不變。
  • 提醒您,有些 API 會使用第三個值,也就是「專案編號」。如要進一步瞭解這三個值,請參閱說明文件
  1. 接下來,您需要在 Cloud 控制台中啟用帳單功能,才能使用 Cloud 資源/API。執行本程式碼研究室時,費用應該不會太高,甚至可能不收費。如要關閉資源,避免產生教學課程以外的費用,您可以刪除建立的資源,或刪除整個專案。Google Cloud 新使用者可享有 $300 美元的免費試用期

環境設定

按一下搜尋列右側的圖示,即可啟用 Cloud Shell。

eb0157a992f16fa3.png

在 Cloud Shell 中執行下列指令,設定專案環境變數:

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
--format='value(projectNumber)')
export REGION=us-central1

啟用 API:

gcloud services enable \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  clouddeploy.googleapis.com \
  artifactregistry.googleapis.com

建立 Artifact Registry 存放區來儲存應用程式容器映像檔:

gcloud artifacts repositories create containers-repo \
  --repository-format=docker \
  --location=${REGION} \
  --description="Containers repository"

3. 查看設定檔

29c2533441779de0.png

複製應用程式原始碼:

git clone https://github.com/gitrey/deploy-cloudrun-app-with-clouddeploy.git
cd deploy-cloudrun-app-with-clouddeploy

查看 Cloud Deploy 管道設定:

clouddeploy.yaml

apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
 name: cloud-run-pipeline
description: application deployment pipeline
serialPipeline:
 stages:
 - targetId: dev-env
   profiles: [dev]
 - targetId: qa-env
   profiles: [qa]
 - targetId: prod-env
   profiles: [prod]
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
 name: dev-env
description: Cloud Run development service
run:
 location: projects/_PROJECT_ID/locations/us-west1
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
 name: qa-env
description: Cloud Run QA service
run:
 location: projects/_PROJECT_ID/locations/us-central1
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
 name: prod-env
description: Cloud Run PROD service
run:
 location: projects/_PROJECT_ID/locations/us-south1

查看 skaffold.yaml 檔案,瞭解如何定義三個環境,以及如何使用 Cloud Run 做為目標服務。

skaffold.yaml

apiVersion: skaffold/v3alpha1
kind: Config
metadata: 
  name: cloud-run-app
profiles:
- name: dev
  manifests:
    rawYaml:
    - deploy-dev.yaml
- name: qa
  manifests:
    rawYaml:
    - deploy-qa.yaml
- name: prod
  manifests:
    rawYaml:
    - deploy-prod.yaml
deploy:
  cloudrun: {}

查看服務設定檔。

deploy-dev.yaml

kind: Service
metadata:
  name: app-dev
spec:
  template:
    spec:
      containers:
      - image: app
        resources:
          limits:
            cpu: 1000m
            memory: 128Mi

deploy-qa.yaml

kind: Service
metadata:
  name: app-dev
spec:
  template:
    spec:
      containers:
      - image: app

deploy-prod.yaml

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: app-prod
spec:
  template:
    spec:
      containers:
      - image: app

查看 cloudbuild.yaml 檔案,瞭解建構容器映像檔和建立 Cloud Deploy 版本的步驟:

cloudbuild.yaml

steps:
- name: 'gcr.io/k8s-skaffold/pack'
  entrypoint: 'pack'
  args: ['build',
         '--builder=gcr.io/buildpacks/builder',
         '--publish', '${_REGION}-docker.pkg.dev/${PROJECT_ID}/containers-repo/app:$BUILD_ID']
  id: Build and package .net app
- name: gcr.io/google.com/cloudsdktool/cloud-sdk:slim
  args: 
      [
        "deploy", "releases", "create", "release-$_RELEASE_TIMESTAMP",
        "--delivery-pipeline", "cloud-run-pipeline",
        "--region", "${_REGION}",
        "--images", "app=${_REGION}-docker.pkg.dev/${PROJECT_ID}/containers-repo/app:$BUILD_ID"
      ]
  entrypoint: gcloud

4. 建立 Cloud Deploy 管道

請在 clouddeploy.yaml 中替換 _PROJECT_ID 值:

sed -i "s/_PROJECT_ID/$PROJECT_ID/g" clouddeploy.yaml

建立 Cloud Deploy 管道:

gcloud deploy apply \
  --file=clouddeploy.yaml \
  --region=${REGION} \
  --project=${PROJECT_ID}

Cloud Deploy 中查看已建立的管道。

5. 建構容器映像檔並建立版本

將 Cloud Deploy 操作員權限新增至 Cloud Build 服務帳戶:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
    --role=roles/clouddeploy.operator

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
    --role=roles/iam.serviceAccountUser

建立容器映像檔和 Cloud Deploy 版本:

export RELEASE_TIMESTAMP=$(date '+%Y%m%d-%H%M%S')

gcloud builds submit \
  --config cloudbuild-plus.yaml \
  --substitutions=_REGION=${REGION},_RELEASE_TIMESTAMP=${RELEASE_TIMESTAMP}

Cloud Deploy 中查看已建立的版本。等待部署至開發人員環境的作業完成。

6. 將版本推送至品質確保和實際工作環境

使用 Cloud 控制台或 Cloud Shell,將版本推送至下一個目標(qa-env)。

使用 Cloud Shell 推送版本,執行 gcloud 指令來推送版本。

gcloud beta deploy releases promote \
    --release="release-${RELEASE_TIMESTAMP}" \
    --delivery-pipeline=cloud-run-pipeline \
    --region=${REGION} \
    --quiet

等待部署至 QA 環境的作業完成。將版本推送至下一個目標(prod-env)。

gcloud beta deploy releases promote \
    --release="release-${RELEASE_TIMESTAMP}" \
    --delivery-pipeline=cloud-run-pipeline \
    --region=${REGION} \
    --quiet

在 Cloud Console 中開啟 Cloud Deploy,並核准正式版部署作業。

4c838b60770e9691.png

查看 Cloud Deploy 管道狀態和可用的 DORA 指標 (「部署次數」、「部署頻率」、「部署失敗率」)。

指標

說明

部署次數

部署至推送管道中最終目標的成功與失敗作業總數。

部署頻率

推送管道部署至您推送管道中最終目標的頻率。DevOps Research and Assessment (DORA) 計畫所定義的四大關鍵指標之一。

部署失敗率

將內容發布至推送管道中最終目標的失敗百分比。

查看 Cloud Run 中已部署的應用程式:

d6372b5350f10875.png

7. 恭喜!

恭喜,您已完成程式碼研究室!

課程內容:

  • 如何建立 Cloud Deploy 管道
  • 如何使用 Cloud Build 為 .Net 應用程式建立容器映像檔
  • 如何使用 Cloud Deploy 將應用程式部署至 Cloud Run
  • 如何推送 Cloud Deploy 版本

清除所用資源

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

刪除專案

如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。

8. 後續行動