本系列教程适用于想要部署、运行和管理在 Google Kubernetes Engine 上运行的现代应用环境的 IT 管理员和运维人员。在学习本系列教程的过程中,您将学习如何使用 Cymbal Bank 示例微服务应用配置监控和提醒、扩缩工作负载以及模拟故障。
概览和目标
在构建新服务和应用时,您可能希望在不同的环境中测试更改。随着组织的不断发展壮大,您可能需要为不同的团队使用不同的集群配置。管理具有不同配置的多个集群可能很有挑战性。您可以使用 Config Sync 等 GitOps 工具来帮助您应对这些挑战。
在创建集群教程中,您创建了一个集群,并将 Cymbal Bank 应用部署到该集群。
在本教程中,您将了解如何将应用的 Kubernetes 清单存储在集中式 Git 代码库中,以及如何使用 Config Sync 等工具将应用部署到舰队中的多个集群。您将学习如何完成以下任务:
创建 Git 代码库并将其连接到 Cloud Build
创建集群,将其注册到舰队,然后在集群舰队上安装 Config Sync
使用舰队软件包在集群上或舰队中部署 Cymbal Bank 和其他资源
创建集群
在本系列的第一个教程中,您创建了一个集群,并将 Cymbal Bank 应用部署到该集群。在实际场景中,不太可能只有一个集群需要管理。借助 GKE,您可以将集群全部分组到一个舰队中:舰队是可共同管理的资源的逻辑组。在舰队中,您可以进一步将集群分组,其中一些集群代表不同的环境或属于不同的团队。例如,您可能有一个开发集群、一个预演集群和一个生产集群。在大型组织中,各个团队可能有各自的集群用于不同的环境。作为 IT 管理员或运营人员,这可能意味着您必须管理数十个集群!
在跨所有这些集群部署应用或自定义政策等各个资源时,Config Sync 等 GKE 功能可帮助您大规模管理这些部署。
为便于演示如何将资源部署到不同环境或集群舰队中,您将创建一个新集群,并将 Cymbal Bank 应用部署到该集群:
创建一个 GKE 集群,用于模拟开发环境:
gcloud container clusters create-auto scalable-apps-dev \ --project=PROJECT_ID \ --region=REGION \ --fleet-project=PROJECT_ID \ --release-channel=rapid
替换以下内容:
- 将
PROJECT_ID
替换为您在上一部分中创建的项目的自动生成 ID。项目 ID 通常与项目名称不同。例如,您的项目可能是 scalable-apps,但项目 ID 可能是 scalable-apps-567123。 - 将
REGION
替换为要在其中创建集群的区域,例如us-central1
。
- 将
标签是可添加到 GKE 资源以帮助整理这些资源的键值对。对于舰队软件包,您可以使用舰队成员资格标签自定义舰队软件包的目标集群。不支持其他类型的标签。
为舰队成员资格添加标签:
gcloud container fleet memberships update scalable-apps-dev \ --update-labels=env=dev
当您在本教程后面部分创建队列软件包时,此标签可确保资源仅部署在
scalable-apps-dev
集群上,而不是部署在本系列的第一个教程中的scalable-apps
集群上。
安装 Config Sync
在这两个集群上安装 Config Sync:
- 在 Google Cloud 控制台中,前往功能部分下的配置页面。
- 点击 add 安装 Config Sync。
- 保持手动升级处于选中状态。
- 版本菜单应默认为最新版本的 Config Sync。如果需要,请选择最新版本。
- 在安装选项下,选择 Install Config Sync on entire fleet (recommended)。
- 点击安装 Config Sync。
- 在 Config Sync 的设置标签页中,查看集群列表的“状态”字段。几分钟后,状态会显示为“待处理”,直到为 Config Sync 正确配置了集群。状态最多可能需要 10 分钟才能更改为已启用。
部署 Cymbal Bank
在本系列的第一个教程中,您使用了 kubectl
命令将应用配置应用于集群。在本教程中,您将使用 Config Sync 的舰队软件包功能将这些相同的配置部署到新集群。在后面的部分中,您将看到一个如何将新资源添加到 Git 代码库并将这些资源部署到集群舰队中的示例。
为 Cloud Build 设置服务账号
服务账号是一种通常由应用(而非个人)使用的特殊账号。创建服务账号时,最佳实践是应为单个特定服务或任务创建服务账号,并为该服务账号提供精细的角色。在本教程中,您将创建一个服务账号,以向 Cloud Build 授予从 Git 代码库提取 Kubernetes 资源并将其部署到集群的权限。
如需创建服务账号并授予所需的权限,请完成以下步骤:
创建服务账号:
gcloud iam service-accounts create "cymbal-bank-service-account"
通过为 Resource Bundle Publisher 角色添加 IAM 政策绑定,向服务账号授予从 Git 代码库提取资源的权限:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:cymbal-bank-service-account@PROJECT_ID.iam.gserviceaccount.com" \ --role='roles/configdelivery.resourceBundlePublisher'
如果系统提示,请选择
None
作为政策的条件。通过为 Logs Writer 角色添加 IAM 政策绑定,向服务账号授予写入日志的权限:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:cymbal-bank-service-account@PROJECT_ID.iam.gserviceaccount.com" \ --role='roles/logging.logWriter'
如果系统提示,请选择
None
作为政策的条件。
为 Cymbal Bank 应用创建版本
舰队软件包需要语义版本标记,以了解要从哪个版本的代码库进行部署。建议您在对代码库进行更改时创建新版本,因为这有助于版本控制,并可在需要时更轻松地回滚到稳定版本。
在 Cymbal Bank 的 GitHub 分支的网络浏览器窗口中,在边栏的版本部分下点击创建新版本。
选择 Choose a tag 菜单,然后输入
v1.0.0
作为标记。点击 Create new tag。点击 Publish release。
设置身份验证
正如本系列的第一个教程所述,您必须创建一个 JWT 来处理用户身份验证,并创建一个 Kubernetes Secret 来存储您创建的新集群的 JWT。每个集群最好拥有一个唯一 JWT 用于进行身份验证。
在 Cloud Shell 中,创建 JWT:
openssl genrsa -out jwtRS256.key 4096 openssl rsa -in jwtRS256.key -outform PEM -pubout -out jwtRS256.key.pub
创建 Kubernetes Secret:
kubectl create secret generic jwt-key --from-file=./jwtRS256.key --from-file=./jwtRS256.key.pub
使用舰队软件包部署 Cymbal Bank 应用
FleetPackage
资源是一种声明性 API,用于将多个 Kubernetes 清单部署到集群舰队。
如需创建舰队软件包,您需要定义 FleetPackage
规范,该规范指向包含您连接到 Cloud Build 的 Kubernetes 资源的代码库。然后应用 FleetPackage
资源,该资源会从 Git 提取资源并将其部署到舰队。
在 Cloud Shell 中,为
configdelivery
Google Cloud CLI 命令设置默认位置。与将代码库连接到 Cloud Build 一样,在舰队软件包功能处于预览版阶段时,您必须使用us-central1
:gcloud config set config_delivery/location us-central1
创建一个名为
fleetpackage-spec.yaml
的文件,其中包含以下内容:resourceBundleSelector: cloudBuildRepository: name: projects/PROJECT_ID/locations/us-central1/connections/cymbal-bank-connection/repositories/REPOSITORY_NAME tag: v1.0.0 serviceAccount: projects/PROJECT_ID/serviceAccounts/cymbal-bank-service-account@PROJECT_ID.iam.gserviceaccount.com path: kubernetes-manifests target: fleet: project: projects/PROJECT_ID selector: matchLabels: env: dev rolloutStrategy: rolling: maxConcurrent: 1
将
REPOSITORY_NAME
替换为 Cloud Build 连接中显示的代码库的名称。选择器字段与您之前创建的舰队成员资格标签匹配。这会确保 Cymbal Bank 应用仅部署在
scalable-apps-dev
集群上。第一个教程中的scalable-apps
集群不受影响。在下一部分中,您将看到一个针对舰队中的所有集群的舰队软件包示例。发布策略字段用于控制资源在各个集群中的部署方式。在此示例中,您只部署到一个集群,因此此字段不会更改部署进度。但是,如果您有许多集群,则此设置可确保资源文件全部应用于一个集群,然后再继续下一个集群。这样,您就可以监控部署进度。
创建舰队软件包:
gcloud alpha container fleet packages create cymbal-bank-fleet-package \ --source=fleetpackage-spec.yaml \ --project=PROJECT_ID
验证是否已创建舰队软件包:
gcloud alpha container fleet packages list
输出将列出构建触发器的状态。几秒钟后,
MESSAGE
字段会更新,输出类似于以下内容:MESSAGES: Build status: WORKING. The release is still being built; see the build status on the following page:
您可以点击所提供的链接以查看 Cloud Build 作业的流式日志。Cloud Build 可能需要几分钟时间来处理构建触发器。
当构建触发器成功完成时,
gcloud alpha container fleet packages list
的输出类似于以下内容:NAME: cymbal-bank-fleet-package STATE: ACTIVE CREATE_TIME: 2024-07-09T15:15:56 ACTIVE_ROLLOUT: rollout-20240709-153621 LAST_COMPLETED_ROLLOUT: MESSAGES:
舰队软件包开始在舰队中发布 Kubernetes 资源。
在 Google Cloud 控制台的 Google Kubernetes Engine 页面中,选择
scalable-apps-dev
集群,然后前往工作负载页面,以查看部署在所有 GKE 集群上的工作负载的汇总视图:当 Autopilot 调整 Pod 以满足资源请求时,您可能会看到一些错误。几分钟后,您应该会看到 Pod 开始运行,且状态为正常。
如需查看 Cymbal Bank 网页界面,请完成以下步骤:
在 Google Cloud 控制台的 Google Kubernetes Engine 页面中,前往网关、服务和入站流量页面。
如需查找 Cymbal Bank Ingress,请点击“Service”的标签页,然后找到名为
frontend
的 Service。点击
frontend
Ingress 的端点链接(例如198.51.100.143:80
),以打开 Cymbal Bank 网页界面。
在舰队中部署资源
接下来,设想一下这样一个场景:您想要使用新的微服务扩展 Cymbal Bank 应用。您希望将此微服务部署到您当前的所有集群以及未来添加到舰队的任何集群。通过使用舰队软件包,您可以部署到多个集群,并在新集群上获取自动部署。
向 Git 代码库添加新资源
为了演示如何向应用添加新服务,您可以创建一个基本的 nginx 部署并将其添加到集群中:
在 Cymbal Bank 的 GitHub 分支的网络浏览器窗口中,点击添加文件,然后点击创建新文件。
将文件命名为
new-resource/nginx.yaml
,然后将以下内容粘贴到其中:apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx:1.14.2 name: nginx ports: - containerPort: 80
点击提交更改...。
在确认对话框中,保持 Commit directly to the
main
branch 处于选中状态,然后点击提交更改。在复刻的 Cymbal Bank 代码库的主页面上,从边栏中选择版本。
在页面顶部,选择 Draft a new release。
选择 Choose a tag 菜单,然后输入
v1.1.0
作为标记。点击 Create new tag。点击 Publish release。
使用舰队软件包将资源部署到集群
如需部署新资源,请创建新的舰队软件包:
此舰队软件包不包含选择器字段,因此针对舰队中的所有集群。这也意味着,未来添加到舰队的任何集群都会自动添加 nginx 部署。
在 Cloud Shell 中,创建一个名为
new-deployment-fleet-package.yaml
的文件,其中包含以下内容:resourceBundleSelector: cloudBuildRepository: name: projects/PROJECT_ID/locations/us-central1/connections/cymbal-bank-connection/repositories/REPOSITORY_NAME tag: v1.1.0 serviceAccount: projects/PROJECT_ID/serviceAccounts/cymbal-bank-service-account@PROJECT_ID.iam.gserviceaccount.com path: kubernetes-manifests/new-resource target: fleet: project: projects/PROJECT_ID rolloutStrategy: rolling: maxConcurrent: 1
创建舰队软件包以开始部署:
gcloud alpha container fleet packages create new-deployment-fleet-package \ --source=new-deployment-fleet-package.yaml \ --project=PROJECT_ID
验证是否已创建舰队软件包:
gcloud alpha container fleet packages list
您可以点击提供的链接以查看 Cloud Build 作业的流式日志。
舰队软件包开始在舰队中发布 Kubernetes 资源。部署开始并完成可能需要几分钟时间。
在 Google Cloud 控制台的 Google Kubernetes Engine 页面中,前往工作负载页面,以查看部署在所有 GKE 集群上的工作负载的汇总视图:
您可以使用舰队软件包继续探索不同部署策略。 例如,您可以尝试向复刻的代码库中添加不同类型的资源,并使用不同的舰队软件包配置来部署这些资源。您还可以使用舰队软件包来删除各个集群中部署的任何资源。如需详细了解舰队软件包,请参阅 Config Sync 文档中的部署舰队软件包。
删除舰队中的资源
就像您可以在舰队中部署资源一样,您可以使用舰队软件包删除舰队中的资源。
如需移除单独的资源,请执行以下简要步骤:
- 从您的 Git 代码库中删除该资源。
- 创建新的 Git 版本并创建新标记。
- 更新舰队软件包
tag
字段。 - 运行舰队软件包更新命令。
或者,您也可以删除舰队软件包本身,这会一并删除由舰队软件包管理的所有资源。
例如,如果您想移除上一部分中的 nginx 部署,请运行以下命令:
gcloud alpha container fleet packages delete new-deployment-fleet-package --force