將應用程式初期測試部署至目標
本快速入門導覽課程說明如何使用 Cloud Deploy,將範例應用程式映像檔以初期測試版部署至 Google Kubernetes Engine 或 Cloud Run。(您也可以將 Canary 部署至 GKE Enterprise,但本快速入門導覽只會顯示 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.
-
Verify 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.
-
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
如要初始化 gcloud CLI,請執行下列指令:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify 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.
-
如果您使用外部識別資訊提供者 (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
建立執行階段環境
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-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 部署作業所需的 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 資訊清單,會套用至叢集以部署應用程式。這個資訊清單包含 Canary 部署作業所需的 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 的核心資源,代表要部署的變更。推送 pipeline 會定義該版本的生命週期。如要進一步瞭解該生命週期,請參閱 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 管理中心查看版本和推出作業。您也可以查看管道的視覺化呈現方式,瞭解目前的發行狀態。
在 Google Cloud 控制台中,前往 Cloud Deploy 的「Delivery pipelines」(推送 pipeline) 頁面,查看 my-canary-demo-app-1 推送 pipeline。
按一下推送管道名稱「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: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% 的裝置。如果是以 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
。
大功告成,您已經完成本快速入門導覽課程!
後續步驟
- 首先,請新增
如果已安裝 CLI,請確認您使用的是最新版本:
gcloud components update