將應用程式以初期測試部署至目標
本快速入門導覽課程說明如何使用 Cloud Deploy,將初期測試版中的應用程式範例圖像,提交至 Google Kubernetes Engine 或 Cloud Run。(您也可以執行 GKE Enterprise 的 Canary 部署,但本快速入門指南只會顯示 GKE 和 Cloud Run)。
初期測試部署會將流量分散到已部署的應用程式版本和新版本之間。Cloud Run 會根據您在推送管道中設定的百分比分配流量。GKE 會將新版本部署至部分 Pod。這個快速入門課程會先部署至 50%,然後再部署至 100%。
在本快速入門導覽課程中,只有一個目標 (prod
)。因此,我們只會建立一個 GKE 叢集或一個 Cloud Run 服務來執行應用程式。
在本快速入門導覽課程中,您將執行以下操作:
建立一個 GKE 叢集或定義一個 Cloud Run 服務。
您也可以將 Canary 部署至 GKE Enterprise 叢集,但本快速入門教學課程只使用 GKE 和 Cloud Run。
建立 Skaffold 設定和 Kubernetes 資訊清單,指定要部署的 (預先建構) 容器映像檔。
定義 Cloud Deploy 推送管道和部署目標。
建立版本,自動部署至單一目標,藉此叫用發布管道。
這個第一個版本略過 Canary 測試階段。
在 Google Cloud 控制台中查看推送管道和版本。
建立第二個版本,這次執行初期測試階段,將應用程式部署至 50%。
將版本推送至 100%。
事前準備
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
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 搭配 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
建立執行階段環境
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,請安裝這些 CRD。
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v0.6.2/standard-install.yaml
安裝 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,可以略過這項指令,不必採取任何行動。
- 首先新增
如果您已安裝 CLI,請確認您執行的是最新版本:
gcloud components update
準備 Skaffold 設定和應用程式資訊清單
Cloud Deploy 會使用 Skaffold 提供詳細資訊,說明要部署哪些內容,以及如何正確地將這些內容部署至目標。
在本快速入門導覽課程中,您會建立 skaffold.yaml
檔案,用於識別要部署的 Kubernetes 資訊清單或 Cloud Run 服務設定。
開啟終端機視窗。
建立新目錄並前往該目錄。
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
建立名為
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 資訊清單,會套用至叢集以部署應用程式。這個資訊清單包含 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
使用 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%。之後,我們會建立另一個版本,並執行初期測試版。
在實際情況中,您通常會在應用程式已在執行的情況下執行 Canary 部署,因此很少會略過這個階段。
在 Google Cloud 控制台中查看版本
您已建立第一個版本,因此系統會建立發布作業,您可以在 Google Cloud 控制台中查看版本和發布作業。您也可以查看 pipeline 視覺化圖表,瞭解版本目前的狀態。
在 Google Cloud 控制台中,前往 Cloud Deploy 的「Delivery pipelines」(推送管道) 頁面,查看「my-canary-demo-app-1」推送管道。
按一下推送管道名稱「my-canary-demo-app-1」。
管道示意圖會顯示應用程式的部署狀態。由於管道中只有一個階段,因此視覺化資訊只會顯示一個節點。
你的版本會列在「發布管道詳細資料」下方的「版本」分頁中。
按一下版本名稱
test-release-001
。推出計畫會顯示在「推出計畫」下方。您可以按一下推行內容,查看詳細資料,包括部署記錄。
請注意,推出狀態為「待提前」,而管道示意圖中顯示的目標有「提前至穩定版」的連結。
將推出階段推進至下一個階段
在第一個版本發布後,系統略過了初期測試階段,並等待開始「穩定」階段,以便將應用程式部署至 100%:
在管道示意圖中,按一下「前往穩定版」。
系統提示時,按一下「繼續」確認。
幾分鐘後,現在已進入「穩定」階段,應用程式已部署到 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: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 階段:
第一階段推出作業完成後,推出作業就會進入初期測試版本階段:
也就是說,應用程式現在已部署至 50%。對於以服務網路為基礎的 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 值區。
一個結尾是
_clouddeploy
,另一個是[region].deploy-artifacts.[project].appspot.com
。
大功告成,您已經完成本快速入門導覽課程!