將應用程式初期測試部署至目標
本快速入門導覽課程說明如何使用 Cloud Deploy,將範例應用程式映像檔以初期測試版部署至 Google Kubernetes Engine 或 Cloud Run。(您也可以將 Canary 部署作業執行至 GKE 連結的叢集,但本快速入門僅顯示 GKE 和 Cloud Run)。
初期測試部署會將流量分配給已部署的應用程式版本和新版本。Cloud Run 會根據您在推送管道中設定的百分比分配流量。GKE 會將新版本部署至一定比例的 Pod。本快速入門導覽課程會先部署至 50%,然後部署至 100%。
在本快速入門導覽課程中,只有一個目標 (prod)。因此,我們只會建立一個 GKE 叢集或一個 Cloud Run 服務來執行應用程式。
在本快速入門導覽課程中,您將執行下列操作:
建立一個 GKE 叢集或定義一個 Cloud Run 服務。
您也可以將初期測試部署至 GKE 附加叢集,但本快速入門導覽課程只會使用 GKE 和 Cloud Run。
建立 Skaffold 設定和 Kubernetes 資訊清單,指定要部署的 (預先建構) 容器映像檔。
定義 Cloud Deploy 推送管道和部署目標。
建立發布版本來叫用推送管道,系統會自動部署至一個目標。
這個首發版本略過 Canary 階段。
在 Google Cloud 控制台中查看推送管道和版本。
建立第二個版本,這次執行初期測試階段,將應用程式部署至 50%。
將版本推送至 100%。
事前準備
- 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
安裝 Google Cloud CLI。
-
若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
安裝 Google Cloud CLI。
-
若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init - 請確認預設的 Compute Engine 服務帳戶具備足夠的權限。
服務帳戶可能已具備必要權限。如果專案已停用為預設服務帳戶自動授予角色的功能,則適用這些步驟。
- 首先,請新增
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" - 為特定執行階段新增開發人員角色。
- 適用於 GKE 和 GKE with 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" -
新增
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
- 首先,請新增
如果您已安裝 CLI,請確認您執行的是最新版本:
gcloud components update
建立執行階段環境
GKE
建立一個 GKE Autopilot 叢集:
gcloud container clusters create-auto canary-quickstart-cluster \
--project=PROJECT_ID \
--region=us-central1
GKE + Gateway API
建立一個 GKE 叢集,並使用建議設定來支援 Istio:
gcloud container clusters create canary-quickstart-cluster \ --machine-type=n1-standard-1 \ --num-nodes 4 \ --region=us-central1 \ --project=PROJECT_ID取得叢集憑證:
gcloud container clusters get-credentials canary-quickstart-cluster \ --project=PROJECT_ID \ --region=us-central1如果叢集上沒有 Kubernetes Gateway API CRD,請安裝。
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v0.6.2/standard-install.yaml安裝 Istio,啟用 Istio 的 Gateway 控制器實作。
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 服務設定。
開啟終端機視窗。
建立新目錄並前往該目錄。
GKE
mkdir deploy-canary-quickstart-gke cd deploy-canary-quickstart-gkeGKE + Gateway API
mkdir deploy-canary-quickstart-gke-gatewayapi cd deploy-canary-quickstart-gke-gatewayapiCloud Run
mkdir deploy-canary-quickstart-run cd deploy-canary-quickstart-run建立名為
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參考資料。建立應用程式資訊清單。
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 資訊清單,會套用至叢集以部署應用程式。這個資訊清單包含初期測試部署所需的 Service 和 Deployment 資源,以及使用 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 資訊清單,會套用至叢集以部署應用程式。這個資訊清單包含初期測試部署所需的 Service 和 Deployment 資源,以及使用 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
向 Cloud Deploy 服務註冊管道和目標:
gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=PROJECT_ID您現在有一個管道,並為初期測試部署策略設定一個目標。
確認管道和目標:
在 Google Cloud 控制台中,前往 Cloud Deploy 的「Delivery pipelines」(推送管道) 頁面,查看可用推送管道的清單。
系統會顯示您剛建立的推送管道,而您設定的目標會列在「目標」欄中。

建立發布版本
版本是代表部署變更的中央 Cloud Deploy 資源。推送管道會定義該版本的生命週期。如要進一步瞭解該生命週期,請參閱「Cloud Deploy 服務架構」。
如要建立代表要部署容器映像檔的 release 資源,請從 deploy-canary-quickstart-gke、deploy-canary-quickstart-gke-gatewayapi 或 deploy-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%。接著,我們會建立另一個版本,並執行初期測試版。
在實際情況中,您通常會執行初期測試部署,應用程式已在執行中,因此很少會跳過這個階段。
在 Google Cloud 控制台中查看版本
您已建立第一個版本,系統也建立了推出作業,現在可以在 Google Cloud 管理中心查看版本和推出作業。您也可以查看管道的視覺化呈現方式,瞭解發行內容的目前狀態。
在 Google Cloud 控制台中,前往 Cloud Deploy 的「Delivery pipelines」(推送管道) 頁面,查看 my-canary-demo-app-1 推送管道。
按一下推送管道名稱「my-canary-demo-app-1」。
管道圖表會顯示應用程式的部署狀態。由於管道中只有一個階段,因此視覺化內容只會顯示一個節點。

發行內容會列在「推送 pipeline 詳細資料」下方的「發行內容」分頁中。
按一下發行內容名稱
test-release-001。推出版本會顯示在「推出版本」下方。您可以點選推出作業來查看詳細資料,包括部署記錄。

請注意,推出狀態為「待推進」,且管道視覺化圖表顯示的目標有「推進至穩定版」的連結。
推進推出階段
第一個版本發布後,系統略過初期測試階段,並等待開始「穩定」階段,將應用程式部署至 100%:
在管道的視覺化畫面中,按一下「Advance to stable」。
系統提示時,按一下「進階」確認操作。
幾分鐘後,推出作業會進入「穩定」階段,應用程式也會部署至 100%。

執行初期測試部署
由於第一個版本略過初期測試階段,我們現在要建立另一個版本,這次會執行初期測試部署。
如要建立新的
release,請從deploy-canary-quickstart-gke、deploy-canary-quickstart-gke-gatewayapi或deploy-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:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaaGKE + 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:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaaCloud 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 階段:

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

也就是說,應用程式現在已部署至 50% 的裝置。如果是以 serviceNetworking 為基礎的 GKE,則會部署到一半的 Pod。對於以 Gateway API 為基礎的 GKE 和 Cloud Run 流量,系統會分配 50%。
按一下「進階推出」,然後在系統提示時按一下「進階」。
這會將推出作業推進至「穩定」階段,將應用程式部署至 100%。

清除所用資源
為了避免系統向您的 Google Cloud 帳戶收取本頁面所用資源的費用,請按照下列步驟操作。
刪除
canary-quickstart-cluster叢集 (僅限 GKE):gcloud container clusters delete canary-quickstart-cluster --region=us-central1 --project=PROJECT_ID刪除
my-canary-run-service服務 (僅限 Cloud Run):gcloud run services delete my-canary-run-service --region=us-central1 --project=PROJECT_ID刪除推送管道、目標,以及所有發布和推出資源:
gcloud deploy delete --file=clouddeploy.yaml --force --region=us-central1 --project=PROJECT_ID刪除 Cloud Deploy 建立的 Cloud Storage bucket。
一個結尾是
_clouddeploy,另一個是[region].deploy-artifacts.[project].appspot.com。
大功告成,您已經完成本快速入門導覽課程!