Canary - 将应用部署到目标
本快速入门介绍如何使用 Cloud Deploy 交付示例应用 部署到 Google Kubernetes Engine 或 Cloud Run (您还可以运行到 GKE Enterprise 的 Canary 部署, 但这里仅显示 GKE 和 Cloud Run quickstart.)
Canary 部署会在已部署的应用版本和新版本之间分配流量。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 控制台中查看交付流水线和发布。
创建第二个版本,这次执行 Canary 阶段,将应用部署到 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.
-
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.
-
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 和采用 Gateway API 的 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"
-
添加
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,请安装这些 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,则可以跳过此命令,无需在此处执行任何操作。
准备 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 清单,用于应用到集群以部署应用。
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
此文件是一个 manifest, 应用于集群以部署应用此清单包含 Canary 部署所需的服务和部署资源,以及使用 Gateway API 所需的 HTTPRoute 和网关资源。
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 中创建您的服务。
创建交付流水线和目标
您可以在一个文件或单独的 文件。在本快速入门中,我们将为流水线和单个目标创建一个文件:
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
现在,您已经拥有了一个流水线,其中为 Canary 部署配置了一个目标 策略
确认您的流水线和目标:
在 Google Cloud 控制台中,前往 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:4a856b6f1c3ce723a456ddc2adfbb794cbfba93f727e2d96fcf6540bd0d6fff4
当您创建版本时,Cloud Deploy 还会自动创建一个发布资源,以便立即部署到您的一个目标 prod
。
我们会跳至稳定阶段
在首次发布时,我们会跳过 Canary 阶段,并部署到 100%(稳定阶段)。这是因为应用之前未部署,因此无法计算 50% 的 Pod(对于 GKE)或服务的流量分配方式(对于 Cloud Run)。Pod (GKE) 或修订版 (Cloud Run) 尚不存在。
跳过了 Canary 阶段,现在我们可以开始稳定阶段了, 这会将流量提升到 100%然后,我们将创建另一个版本 会执行 Canary 部署
在实际情况下,您通常会在应用已在运行的情况下执行 Canary 部署,因此很少会跳过此阶段。
在 Google Cloud 控制台中查看版本
现在,您已创建第一个版本,发布流程也已创建,您可以在 Google Cloud 控制台中查看该版本和发布流程。您还可以查看流水线直观显示效果,其中会显示发布版本的当前状态。
在 Google Cloud 控制台中,前往 Cloud Deploy 交付流水线页面,查看您的 my-canary-demo-app-1 交付流水线。
点击交付流水线的名称“my-canary-demo-app-1”。
流水线可视化会显示应用的部署状态。由于流水线中只有一个阶段,因此可视化结果中只会显示一个节点。
您的版本列在版本标签页中交付流水线详细信息下。
点击版本名称
test-release-001
。您的发布会显示在发布下。您可以点击发布以查看其详细信息,包括部署日志。
请注意,发布状态为“待推进”,并且流水线可视化图中显示的目标包含指向“推进到稳定版”的链接。
推进发布阶段
在首次发布后,系统跳过了 Canary 版阶段,发布流程正在等待开始“稳定版”阶段,该阶段会将应用部署到 100% 的用户:
在流水线可视化图表中,点击推进到稳定状态。
出现提示时,点击下一步以确认。
几分钟后,发布现已进入“稳定”阶段阶段,而 部署比例
执行 Canary 部署
由于第一个版本跳过了 Canary 阶段, 接下来,我们要创建另一个版本 部署。
如需创建新的
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:4a856b6f1c3ce723a456ddc2adfbb794cbfba93f727e2d96fcf6540bd0d6fff4
几分钟后,发布就会创建 执行:
第一个发布阶段完成后,发布即进入 Canary 版阶段:
这意味着,应用目前已部署到 50%。对于 部署基于 ServiceNetworking 的 GKE 服务 Pod。对于基于 Gateway API 的 GKE 和 Cloud Run 流量,分配比例为 50%。
点击 Advance Rollout(提前发布),然后在出现提示时点击 Advance(高级)。
这会将发布推进到“稳定版本”阶段,将应用部署到 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
。
恭喜,您已经完成快速入门!