学习路线:可伸缩应用 - 使用 Config Sync 集中进行更改


本系列教程适用于想要部署、运行和管理在 Google Kubernetes Engine (GKE) Enterprise 版本上运行的现代应用环境的 IT 管理员和运维人员。在学习本系列教程的过程中,您将学习如何使用 Cymbal Bank 示例微服务应用配置监控和提醒、扩缩工作负载以及模拟故障。

  1. 创建集群并部署示例应用
  2. 使用 Google Cloud Managed Service for Prometheus 进行监控
  3. 扩缩工作负载
  4. 模拟故障
  5. 集中进行变更管理(本教程)

概览和目标

在构建新服务和应用时,您可能需要在不同的环境中测试更改。随着组织的不断发展壮大,您可能需要为不同的团队使用不同的集群配置。管理具有不同配置的多个集群可能很有挑战性。您可以使用 Config Sync 等 GitOps 工具来帮助您管理这些挑战。

创建集群教程中,您创建了一个集群并将 Cymbal Bank 应用部署到该集群。

在本教程中,您将了解如何将应用的 Kubernetes 清单存储在集中式 Git 代码库中,以及如何使用 Config Sync 等工具将应用部署到舰队中的多个集群。您将学习如何完成以下任务:

  • 创建 Git 代码库并将其连接到 Cloud Build

  • 创建集群、将其注册到舰队,并在集群舰队上安装 Config Sync

  • 使用舰队软件包在集群上或舰队中部署 Cymbal Bank 和其他资源

费用

您将为本系列教程启用 GKE Enterprise 并部署 Cymbal Bank 示例应用,这意味着您需要按照我们价格页面中列出的价格,按集群为 GKE Enterprise on Google Cloud 付费,直到您停用 GKE Enterprise 或删除项目。

您还需要负责运行 Cymbal Bank 示例应用时产生的其他 Google Cloud 费用,例如 Compute Engine 虚拟机和负载均衡器的费用。

准备工作

如需了解如何从 Git 代码库存储、更改和部署资源,您必须完成第一个教程,以创建一个使用 Autopilot 模式的 GKE 集群并部署 Cymbal Bank 基于微服务的示例应用。

我们建议您按顺序针对 Cymbal Bank 完成本系列教程。在完成本系列教程的过程中,您将学习新技能并使用其他 Google Cloud 产品和服务。

如需使用 Config Sync 将 Kubernetes 清单从 Git 代码库部署到集群,您必须启用以下 API:

gcloud services enable configdelivery.googleapis.com cloudbuild.googleapis.com developerconnect.googleapis.com

创建 Git 代码库并将其连接到 Cloud Build

舰队软件包是 Kubernetes 资源清单的集合。通过将这些清单打包为一个软件包,您可以直接从 Git 代码库将应用部署到舰队中的多个集群。采用此工作流程可获享以下优势:

  • 通过在舰队中部署资源(而不是逐个集群手动应用资源),提高了可伸缩性。
  • 通过渐进式发布实现更安全的更新。
  • 在 Git 中集中获取配置文件的其他工作流,例如版本控制和审批。

为了演示如何在 Git 中存储和进行更改,请复刻 Cymbal Bank 代码库并将其连接到 Cloud Build。

复刻 Cymbal Bank 代码库

在本教程中,您将对 Git 代码库进行更改,以演示 Config Sync 如何帮助您安全地管理 Kubernetes 资源的更改并进行部署。如需直接进行这些更改,您必须复刻 Git 代码库,而不是克隆 Git 代码库。

如需复刻代码库,请完成以下步骤:

  1. 在 GitHub 中,前往 Cymbal Bank (bank-of-anthos) 示例代码库

  2. 点击复刻,以获取包含源文件的代码库的副本。

    替代文本

  3. 如果需要,请登录您的 GitHub 账号。如果您有权访问 GitHub 上的其他组织或团队,请确保将代码库复刻到您的个人账号。

现在,您已有一个 Cymbal Bank 代码库分支。您部署的所有 Kubernetes 清单都位于 /kubernetes-manifests 文件夹中。

将代码库连接到 Cloud Build

Cloud Build 是一项可在 Google Cloud 上执行构建的服务,可用于实现 GitOps 形式的持续交付。Config Sync 的舰队软件包服务使用 Cloud Build 从 Git 代码库提取 Kubernetes 资源,并将其部署到集群。使用舰队软件包时,您只需为每个要同步的代码库设置 Cloud Build 一次。舰队软件包 API 会通过 Cloud Build 自动创建构建触发器。

如需将 GitHub 代码库连接到 Cloud Build,请执行以下操作:

  1. 打开 Google Cloud 控制台中的 Cloud Build 页面,然后选择代码库

    打开“代码库”页面

  2. 确保您位于第 2 代代码库页面。如有需要,请选择查看代码库(第 2 代)

  3. 点击创建主机连接

  4. 区域菜单中,选择 us-central1 (Iowa) 作为区域。

  5. 名称字段中,输入 cymbal-bank-connection 作为连接的名称。

  6. 点击连接

  7. 如果您是第一次将 Cloud Build 关联到您的 GitHub 账号,请完成以下步骤:

    1. 接受对您的 GitHub OAuth 令牌的请求。该令牌会存储在 Secret Manager 中,供 Cloud Build GitHub 连接使用。点击继续
    2. 将 Cloud Build 安装到 GitHub 代码库中。选择在新账号中安装
    3. 在随即打开的 GitHub 新窗口中,选择您之前用来创建 Cymbal Bank 分支的 GitHub 账号。在生产环境中,您可以选择您已向其委托访问权限的其他账号或代码库。
    4. 按照任何身份验证提示在 GitHub 中确认您的身份。
    5. 在用于 Cloud Build 代码库访问的 GitHub 窗口中,选择 Only select repositories
    6. 从列出代码库的下拉菜单中,选择 bank-of-anthos 的分支。
    7. 点击保存
  8. 在 Google Cloud 控制台的 Cloud Build 页面中,点击关联代码库以将新的 Git 代码库连接到 Cloud Build。

  9. 连接菜单中,选择 cymbal-bank-connection

  10. 代码库菜单中,选择 bank-of-anthos 分支。

  11. 选择关联

创建集群

在本系列的第一个教程中,您创建了一个集群,并将 Cymbal Bank 应用部署到该集群。在实际场景中,不太可能只有一个集群需要管理。借助 GKE,您可以将集群全部分组到一个舰队中:舰队是可共同管理的资源的逻辑组。在舰队中,您可以进一步对集群进行分组,其中一些集群代表不同环境或属于不同团队。例如,您可能有一个开发集群、一个预演集群和一个生产集群。在大型组织中,各个团队可能有各自的集群用于不同的环境。作为 IT 管理员或运维人员,这可能意味着您必须管理数十个集群!

在所有这些集群中部署应用或自定义政策等单个资源时,Config Sync 等 GKE Enterprise 功能可帮助您大规模管理这些部署。

为便于演示如何将资源部署到不同环境或集群舰队中,您将创建一个新集群,并将 Cymbal Bank 应用部署到该集群:

  1. 创建一个模拟开发环境的 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
  2. 标签是可添加到 GKE 资源以帮助整理这些资源的键值对。对于舰队软件包,您可以使用舰队成员资格标签来自定义舰队软件包针对的集群。不支持其他类型的标签。

    向舰队成员资格添加标签:

    gcloud container fleet memberships update scalable-apps-dev \
        --update-labels=env=dev
    

    当您在本教程后面部分创建队列软件包时,此标签可确保资源仅部署在 scalable-apps-dev 集群上,而不是部署在本系列的第一个教程中的 scalable-apps 集群上。

安装 Config Sync

在两个集群上安装 Config Sync:

  1. 在 Google Cloud 控制台中,转到功能部分下的配置页面。

    转到“配置”

  2. 点击 安装 Config Sync
  3. 保持手动升级处于选中状态。
  4. 版本菜单应默认为 Config Sync 的最新版本。如果需要,请选择最新版本。
  5. 安装选项下,选择 Install Config Sync on entire fleet (recommended)
  6. 点击安装 Config Sync
  7. 在 Config Sync 的设置标签页中,查看集群列表的“状态”字段。几分钟后,状态会显示为“待处理”,直到为 Config Sync 正确配置了集群。状态最多可能需要 10 分钟才能更改为已启用

部署 Cymbal Bank

在本系列的第一个教程中,您使用了 kubectl 命令将应用配置应用于集群。在本教程中,您将使用 Config Sync 的舰队软件包功能将这些相同的配置部署到新集群。在后面的部分中,您将看到一个如何将新资源添加到 Git 代码库并将这些资源部署到集群舰队中的示例。

为 Cloud Build 设置服务账号

服务账号是一种通常由应用(而非个人)使用的特殊账号。创建服务账号时,最佳实践是应为单个特定服务或任务创建服务账号,并为该服务账号提供精细的角色。在本教程中,您将创建一个服务账号,以向 Cloud Build 授予从 Git 代码库提取 Kubernetes 资源并将其部署到集群的权限。

如需创建服务账号并授予所需的权限,请完成以下步骤:

  1. 创建服务账号:

    gcloud iam service-accounts create "cymbal-bank-service-account"
    
  2. 通过为 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 作为该政策的条件。

  3. 通过为 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 应用创建版本

舰队软件包需要语义版本标记才能知道要从哪个代码库版本部署。建议您在对代码库进行更改时创建新版本,因为这有助于版本控制,并便于在需要时更轻松地回滚到稳定版本。

  1. 在 Cymbal Bank 的 GitHub 分支的网络浏览器窗口中,在边栏的版本部分下,点击创建新版本

  2. 选择 Choose a tag 菜单,然后输入 v1.0.0 作为标记。点击 Create new tag

  3. 点击 Publish release

设置身份验证

正如本系列的第一个教程所述,您必须创建一个 JWT 来处理用户身份验证,并创建一个 Kubernetes Secret 来存储您创建的新集群的 JWT。最好为每个集群提供一个用于身份验证的唯一 JWT。

  1. 在 Cloud Shell 中,创建 JWT:

    openssl genrsa -out jwtRS256.key 4096
    openssl rsa -in jwtRS256.key -outform PEM -pubout -out jwtRS256.key.pub
    
  2. 创建 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 提取资源并将其部署到舰队。

  1. 在 Cloud Shell 中,为 configdelivery Google Cloud CLI 命令设置默认位置。与将代码库连接到 Cloud Build 一样,在舰队软件包功能处于预览版阶段时,您必须使用 us-central1

    gcloud config set config_delivery/location us-central1
    
  2. 创建一个名为 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 集群不受影响。在下一部分中,您将看到一个针对舰队中的所有集群的舰队软件包示例。

    发布策略字段用于控制资源在各个集群中的部署方式。在此示例中,您只部署到一个集群,因此此字段不会更改发布方式。但是,如果您有许多集群,则此设置可确保资源文件全部应用于一个集群,然后再继续下一个集群。这样,您就可以监控发布进度。

  3. 创建舰队软件包:

    gcloud alpha container fleet packages create cymbal-bank-fleet-package \
        --source=fleetpackage-spec.yaml \
        --project=PROJECT_ID
    
  4. 验证是否已创建舰队软件包:

    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 处理构建触发器可能需要几分钟时间。

  5. 构建触发器成功完成后,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 资源。

  6. 在 Google Cloud 控制台的 Google Kubernetes Engine 页面中,选择 scalable-apps-dev 集群,然后前往工作负载页面,以查看部署在所有 GKE 集群上的工作负载的汇总视图:

    打开“工作负载”页面

    在 Autopilot 调整 Pod 以满足资源请求时,您可能会看到一些错误。几分钟后,您应该会看到 Pod 开始运行,且状态为正常

  7. 如需查看 Cymbal Bank 网页界面,请完成以下步骤:

    1. 在 Google Cloud 控制台的 Google Kubernetes Engine 页面中,前往网关、服务和入站流量页面。

      转到“网关、Service 和 Ingress”页面

    2. 如需查找 Cymbal Bank Ingress,请点击“Service”的标签页,然后找到名为 frontend 的 Service。

    3. 点击 frontend Ingress 的端点链接(例如 198.51.100.143:80),以打开 Cymbal Bank 网页界面。

在舰队中部署资源

接下来,设想一下这样一个场景:您想要使用新的微服务扩展 Cymbal Bank 应用。您希望将此微服务部署到您当前的所有集群以及未来添加到舰队的任何集群。通过使用舰队软件包,您可以部署到多个集群,并在新集群上获取自动部署。

向 Git 代码库添加新资源

为了演示如何向应用添加新服务,您将创建一个基本的 nginx 部署并将其添加到集群中:

  1. 在 Cymbal Bank 的 GitHub 分支的网络浏览器窗口中,选择添加文件,然后点击创建新文件

  2. 将文件命名为 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
    
  3. 点击提交更改...

  4. 在确认对话框中,保持 Commit directly to the main branch 处于选中状态,然后点击提交更改

  5. 在复刻的 Cymbal Bank 代码库的主页面上,从边栏中选择版本

  6. 在页面顶部,选择 Draft a new release

  7. 选择 Choose a tag 菜单,然后输入 v1.1.0 作为标记。点击 Create new tag

  8. 点击 Publish release

使用舰队软件包将资源部署到集群

如需部署新资源,请创建新的舰队软件包:

  1. 此舰队软件包不包含选择器字段,因此针对舰队中的所有集群。这也意味着,未来添加到舰队的任何集群都会自动添加 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
    
  2. 创建舰队软件包以开始发布:

    gcloud alpha container fleet packages create new-deployment-fleet-package \
        --source=new-deployment-fleet-package.yaml \
        --project=PROJECT_ID
    
  3. 验证是否已创建舰队软件包:

    gcloud alpha container fleet packages list
    

    您可以点击提供的链接以查看 Cloud Build 作业的流式日志。

    舰队软件包开始在舰队中发布 Kubernetes 资源。发布过程可能需要几分钟时间才能开始并完成。

  4. 在 Google Cloud 控制台的 Google Kubernetes Engine 页面中,前往工作负载页面,以查看在所有 GKE 集群上部署的工作负载的汇总视图:

    打开“工作负载”页面

您可以继续探索使用舰队软件包的不同部署策略。例如,您可以尝试向复刻的代码库中添加不同类型的资源,并使用不同的舰队软件包配置来部署这些资源。您还可以使用舰队软件包来删除各个集群中部署的任何资源。如需详细了解舰队软件包,请参阅 Config Sync 文档中的部署舰队软件包

删除舰队中的资源

就像您可以在舰队中部署资源一样,您可以使用舰队软件包删除舰队中的资源。

如需移除各个资源,大致步骤如下:

  1. 从 Git 代码库中删除资源。
  2. 创建新的 Git 版本并创建新标记。
  3. 更新舰队软件包 tag 字段。
  4. 运行舰队软件包更新命令

或者,您也可以删除舰队软件包本身,这会一并删除由舰队软件包管理的所有资源。

例如,如果您想移除上一部分中的 nginx 部署,请运行以下命令:

gcloud alpha container fleet packages delete new-deployment-fleet-package --force

清理

为避免系统因本教程中使用的资源而向您的 Google Cloud 账号收取费用,请删除您创建的项目。

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

您可以通过完成以下步骤删除复刻的代码库:

  1. 在 Cymbal Bank 的 GitHub 分支的网络浏览器窗口中,点击代码库名称下方的设置

  2. 在“常规设置”页面(默认处于选中状态)上,前往“危险地区”部分,然后点击删除此代码库

  3. 点击 I want to delete this repository

  4. 阅读警告,然后点击 I have read and understand these effects

  5. 如需验证您删除的代码库是否正确,请在文本字段中输入复刻的 Cymbal Bank 代码库的名称。

  6. 点击删除此代码库

后续步骤

在开始创建自己的 GKE Enterprise 集群环境(与您在本系列教程中所学的环境类似)之前,请查看一些生产环境注意事项