将 Anthos 工具链与 Active Assist 搭配使用


本文档是系列文章中的一篇,讨论了企业可以用于通过 Active Assist 来大规模优化云足迹的架构模式。本教程介绍如何为与 Anthos 工具链搭配使用的 Active Assist 建议构建自动化流水线。它适用于使用 Anthos Config Management 管理 Anthos 环境和 Config Connector 来管理 Google Cloud 资源的人员。本系列文章的其他部分如下所示:

您在本教程中构建的自动化流水线可以帮助您实现以下目标:

  • 扩大 Active Assist 产品组合在组织中的使用范围。
  • 使 Active Assist 成为您的持续集成和持续交付 (CI/CD) 流水线的一部分。
  • 使用 GitHub 问题和拉取请求等结构控制 Active Assist 建议的审核和启动。

本教程还使用 kpt,这是 Google 开发的开源工具包,可帮助您管理、操作、自定义和应用 Kubernetes 资源配置数据文件。

架构

以下架构图展示了您在本教程中使用的组件。

架构中使用的组件。

这些组件的使用方式如下:

  • GitHub 的一次且仅一次 (DRY) 代码库,该代码库用于您在 Google Cloud 组织中的多个项目之间部署的 Config Connector 模板。
  • 一个或多个特定于项目或环境的 GitHub 代码库,其中包含混合配置文件。这些混合代码库适用于 Anthos Config Management 管理的环境。它们使用 Config Connector 在 Google Cloud 组织中操作和管理 Google Cloud 资源。
  • 使用 Anthos Config Management 进行版本控制和偏移检测的 Anthos 集群。此集群还安装了 Config Connector。借助 Config Connector,集群可以管理整个 Google Cloud 组织中的 Google Cloud 资源。
  • 可以在将模板推送到 GitHub DRY 代码库时触发构建的 Cloud Build 触发器。
  • 定期触发构建的计划 Cloud Build 触发器。构建作业使用 kpt 函数。该函数会调用 Active Assist Recommender API 以获取有效建议。它会查看并解析建议,以确定是否需要调整或优化 Config Connector 管理的 Google Cloud 资源。如果需要调整或优化 Config Connector 管理的 Google Cloud 资源,kpt 函数会在 DRY 代码库中创建 GitHub 问题以及推荐更改的详细信息。

此架构的工作流如下:

  1. 有权访问 DRY 代码库的授权团队在代码库中创建和管理 Config Connector 模板。
  2. 当创建或修改模板并签入 main 分支时,就会触发 Cloud Build 作业。
  3. Cloud Build 作业通过调用 kpt setter 来融合模板。该作业会将混合配置文件推送到混合 GitHub 代码库。Secret Manager 用于存储私有代码库的 GitHub 部署密钥。
  4. Config Sync 监控混合代码库的更改,并将代码库中的更新应用于代管式集群。
  5. Config Connector 会监控更改;如果由于 Config Sync 应用 Kubernetes 资源模型 (KRM) 更改而需要创建或更新任何资源,则 Config Connector 会启动 Google Cloud 资源。
  6. 计划 Cloud Build 触发器会定期运行以调用 Recommender API,从而提取 Config Connector 管理的项目的有效建议。
  7. 计划 Cloud Build 作业执行自定义 kpt 函数以调用 Recommender API 并提取和解析有效建议。
  8. kpt 函数会创建一个 GitHub 问题,用于显示当前资源配置和建议的资源配置的比较。使用此方法,系统会在 DRY 代码库中创建 GitHub 问题,从而更轻松地跟踪代码库更改。

目标

  • 创建以下示例 GitHub 代码库:
    • Config Connector KRM 的 DRY 代码库。
    • 用于保存使用 kpt setter 生成的混合配置文件的代码库。
  • 使用 Anthos Config Management、Config Sync 和 Config Connector 创建 Anthos 集群。
  • 创建示例 kpt 函数以检索由 Config Connector 管理的项目的 Active Assist 建议。
  • 创建一个在将模板推送到 DRY 代码库的 main 分支时触发的 Cloud Build 触发器。
  • 创建一个定期运行的计划 Cloud Build 作业,以便为 Config Connector 管理的资源检索可用的 Active Assist 建议。
  • 使用本教程的 GitHub 代码库中提供的桩建议来测试端到端流水线。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

准备工作

  1. 在 Google Cloud Console 中,转到项目选择器页面。

    转到“项目选择器”

  2. 选择或创建 Google Cloud 项目。

  3. 记下 Google Cloud 项目 ID。您将在下一部分中设置环境时使用此 ID。在本教程中,此项目称为 build 项目。
  4. 启用 Cloud Build、Firestore、App Engine、Pub/Sub、Cloud Run、Cloud Scheduler、Cloud Source Repositories API。

    启用 API

    在本教程中,您将使用默认应用凭据。如果系统提示您在向项目添加凭据页面上创建凭据,请点击取消
  5. 确保您的 Google Cloud 项目已启用结算功能

设置您的环境

在本教程中,您将在 Cloud Shell 中运行所有命令。

  1. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

  2. 为当前 build Google Cloud 项目的 ID 和编号设置变量:

    export RECO_MGR_PROJECT=PROJECT_ID
    gcloud config set project $RECO_MGR_PROJECT
    export RECO_MGR_PROJECT_NUMBER=$(gcloud projects describe $RECO_MGR_PROJECT --format='value(projectNumber)')
    

    PROJECT_ID 替换为您在上一部分中记下的项目 ID。

  3. 为部署区域设置变量:

    export REGION=us-central1
    export ZONE=us-central1-a
    
  4. 克隆包含本教程中使用的示例应用代码的代码库:

    git clone https://github.com/GoogleCloudPlatform/activeassist-anthos-toolchain.git
    
  5. 转到项目目录:

    cd activeassist-anthos-toolchain
    

构建流水线

在本部分中,您将创建组件以构建流水线。Active Assist 建议是根据使用模式和系统指标生成的。每个建议类别都可以使用不同的默认时间范围来根据生成的建议分析使用情况数据和指标。如需测试端到端流水线,您在上一步中克隆的代码库提供了用于运行端到端流水线的示例建议(存根)。

或者,如果您在具有现有资源和建议的示例项目中运行流水线,则可以对示例代码进行适当的更改,然后运行流水线。

设置示例私有 GitHub 代码库

在以下部分中,您将设置本教程的示例 GitHub 代码库。

设置私有 DRY GitHub 代码库

  1. 为 DRY 代码库创建私有 GitHub 代码库。请记下您为代码库指定的名称。

  2. 在 Cloud Shell 中,为您的 GitHub 用户名和 DRY 代码库的名称创建环境变量:

    export REPO_OWNER=YOUR_GITHUB_USERNAME
    export DRY_REPO_NAME=YOUR_PRIVATE_DRY_REPO
    

    替换以下内容:

    • YOUR_GITHUB_USERNAME:您的 GitHub 用户名。
    • YOUR_PRIVATE_DRY_REPO:您的 DRY 代码库的名称。
  3. 创建个人访问令牌 (PAT) 以在此代码库中创建问题。如果存在需要查看的 Active Assist 建议,流水线会创建 GitHub 问题。如需详细了解如何在 GitHub 中创建 PAT,请参阅 GitHub 文档

    为此令牌设置范围时,请选择完全控制私有代码库

  4. 在 Cloud Shell 中,为您生成的 PAT 创建环境变量:

    export GITHUB_TOKEN=YOUR_PERSONAL_ACCESS_TOKEN
    

    YOUR_PERSONAL_ACCESS_TOKEN 替换为您自己的令牌。

设置私有混合 GitHub 代码库

  1. 为混合代码库创建私有 GitHub 代码库。记下您为代码库指定的名称。

  2. 在 Cloud Shell 中,为混合代码库设置环境变量:

    export HYDRATED_REPO_NAME=YOUR_PRIVATE_HYDRATED_REPO
    export HYDRATED_REPO='git@github.com:$REPO_OWNER/$HYDRATED_REPO_NAME.git'
    

    YOUR_PRIVATE_HYDRATED_REPO 替换为混合代码库的名称。

  3. 创建部署密钥对:

    ssh-keygen -t rsa -b 4096 \
    -C 'active-assist-robot' \
    -N '' \
    -f $(pwd)/active-assist-robot
    

    通过部署密钥,您可以在运行 Cloud Build 作业以融合配置文件时部署到私有 GitHub 代码库。

  4. 输出生成的密钥:

    cat $(pwd)/active-assist-robot.pub
    
  5. 将部署密钥添加到私有 GitHub 代码库。添加部署密钥时,请务必选择允许写入权限。如需了解如何将部署密钥添加到 GitHub 代码库,请参阅管理部署密钥的 GitHub 文档。

将 GitHub 密钥上传到 Secret Manager

  1. 在 Cloud Shell 中,创建 Secret 以存储来自部署密钥对的私钥:

    gcloud secrets create github-ssh-key \
      --data-file=$(pwd)/active-assist-robot
    
  2. 创建 Secret 以存储 PAT:

    echo $GITHUB_TOKEN | gcloud secrets create github-pat --data-file=-
    

创建 Anthos 集群

在本部分中,您将使用 Config Connector 插件创建 Anthos 集群,创建一个身份并配置 Config Connector。您还将配置 Config Sync,这是 Anthos Config Management 的另一个组件。您可以使用 Anthos Config Management 在所有基础架构中创建通用配置(包括自定义政策),并将其同时应用于本地和云端环境。Anthos Config Management 将会评估变更并将其发布至所有 Kubernetes 集群,从而保证集群状态始终符合您的期望。

  1. 在 Cloud Shell 中,创建一个新的 GKE 集群并启用 Config Connector 插件

    gcloud container clusters create sample-ops \
      --machine-type n1-standard-4 \
      --zone $ZONE \
      --release-channel regular \
      --addons ConfigConnector \
      --workload-pool=$RECO_MGR_PROJECT.svc.id.goog \
      --enable-stackdriver-kubernetes \
      --enable-ip-alias
    
  2. 完成使用 GKE 插件安装指南中的以下部分,以创建身份并配置 Config Connector。

    1. 创建身份
    2. 配置 Config Connector
  3. 在您创建的 Anthos 集群中安装 Config Sync。配置 Anthos Config Management 和 Config Sync 时,您必须执行以下操作:

    1. 使用令牌向 Config Sync 授予对 Git 的只读权限。使用您在设置专用 DRY GitHub 代码库时创建的 GitHub 令牌。令牌可通过 $GITHUB_TOKEN 环境变量获取。
    2. 使用 gcloud 配置 Config Sync。 设置以下设置:
      1. sourceFormathierarchy
      2. syncRepohttps://github.com/YOUR_GITHUB_USERNAME/YOUR_PRIVATE_HYDRATED_REPO
      3. syncBranchmain
      4. secretTypetoken
      5. policyDir:请勿填写此选项

创建 Cloud Build 触发器以推送到混合代码库

在以下部分中,您将创建一个在模板被推送到 YOUR_PRIVATE_DRY_REPO 代码库的主分支时触发的 Cloud Build 触发器。此触发器会运行用于融合 YOUR_PRIVATE_DRY_REPO 代码库中的配置即数据 KRM 模板的步骤,并将混合配置文件推送到您的 YOUR_PRIVATE_HYDRATED_REPO 代码库。

将 Cloud Build 连接到您的 GitHub 代码库

在本部分中,您将 YOUR_PRIVATE_DRY_REPOYOUR_PRIVATE_HYDRATED_REPO GitHub 代码库连接到 Cloud Build。

  1. 转到 Cloud Build 应用的 GitHub 市场页面。

    转到 Cloud Build 应用页面

  2. 点击使用 Google Cloud Build 进行设置

  3. 如果系统提示,请登录 GitHub。

  4. 选择 Only select repositories

    使用选择代码库下拉列表通过 Cloud Build 应用启用对 YOUR_PRIVATE_DRY_REPOYOUR_PRIVATE_HYDRATED_REPO 代码库的访问权限。

  5. 点击安装

  6. 登录 Google Cloud。 随即将显示授权页面,并且系统会提示您授权 Google Cloud Build 应用连接到 Google Cloud。

  7. 点击授权 Google Cloud Build by GoogleCloudBuild (Authorize Google Cloud Build by GoogleCloudBuild)。 系统会将您重定向至 Google Cloud 控制台。

  8. 选择您的 Google Cloud 项目。

  9. 选择同意复选框,然后点击下一步

  10. 点击安装

  11. 登录 Google Cloud。 随即将显示授权页面,并且系统会提示您授权 Google Cloud Build 应用连接到 Google Cloud。

  12. 点击授权 Google Cloud Build by GoogleCloudBuild (Authorize Google Cloud Build by GoogleCloudBuild)。 系统会将您重定向至 Google Cloud 控制台。

  13. 选择您的 Google Cloud 项目。

  14. 选择同意复选框,然后点击下一步

  15. 在显示的选择代码库页面中,选择以下 GitHub 代码库:

    • YOUR_PRIVATE_DRY_REPO
    • YOUR_PRIVATE_HYDRATED_REPO
  16. 点击连接,然后点击完成

为 DRY 代码库创建 Cloud Build 触发器

  1. 在 Cloud Shell 中,运行以下命令:

    envsubst < cloudbuild.template.yaml > cloudbuild.yaml
    

    该命令会生成 cloudbuild.yaml 文件。

  2. 创建触发器:

    gcloud beta builds triggers create github \
      --name ActiveAssistDemo \
      --repo-name=$DRY_REPO_NAME \
      --repo-owner=$REPO_OWNER \
      --branch-pattern="main" \
      --build-config=cloudbuild.yaml
    
  3. 授予 Cloud Build 服务帐号访问 Secret Manager 的权限:

    gcloud secrets add-iam-policy-binding github-ssh-key  \
      --member="serviceAccount:${RECO_MGR_PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
      --role="roles/secretmanager.secretAccessor"
    
    gcloud secrets add-iam-policy-binding github-pat  \
      --member="serviceAccount:${RECO_MGR_PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
      --role="roles/secretmanager.secretAccessor"
    

为 Active Assist 建议创建计划 Cloud Build 触发器

在以下部分中,您将创建一个定期运行的计划 Cloud Build 触发器。此触发器使用 kpt 函数提取 Active Assist 建议,并确定 YOUR_PRIVATE_HYDRATED_REPO 代码库中的资源是否有任何有效建议。如果有需要审核和激活的资源配置有效建议,kpt 函数还会在 YOUR_PRIVATE_HYDRATED_REPO 代码库中创建 GitHub 问题。

生成 Cloud Build 映像

在本部分中,您将生成一个包含 kpt、gh 和节点组件的 Cloud Build 映像。

  1. 在 Cloud Shell 中,构建 Docker 映像并将其推送到 Container Registry

    gcloud auth configure-docker
    
    docker build -t gcr.io/$RECO_MGR_PROJECT/kpt-dev-gh:1 ./recommender-kpt-function
    
    docker push gcr.io/$RECO_MGR_PROJECT/kpt-dev-gh:1
    

为您的混合代码库创建 Cloud Build 触发器

  1. 在 Cloud Shell 中,创建在设置计划的 Cloud Build 触发器时需要使用的配置文件:

     envsubst < cloudbuild-scheduled-recommendations.template.yaml > cloudbuild-scheduled-recommendations.yaml
    
  2. 创建 Cloud Build 触发器:

    gcloud beta builds triggers create github \
      --name ActiveAssistScheduledRecommendations \
      --repo-name=YOUR_PRIVATE_HYDRATED_REPO \
      --repo-owner=$REPO_OWNER \
      --branch-pattern="main" \
      --build-config=cloudbuild-scheduled-recommendations.yaml
    
  3. 获取此触发器的 ID:

    export TRIGGER_ID=`gcloud beta builds triggers describe \
      ActiveAssistScheduledRecommendations \
      --format="value(id)"`
    

创建 Cloud Scheduler 作业以调用触发器

  1. 在 Cloud Shell 中,创建服务帐号:

    gcloud iam service-accounts create build-invoker \
       --description "Service Account used by Cloud Scheduler to invoke the sample scheduled Cloud Build job" \
       --display-name "recommender-scheduler-sa" \
       --project $RECO_MGR_PROJECT
    

    Cloud Scheduler 作业使用此服务帐号运行 recommender-parser 服务。

  2. 向服务帐号授予调用 Cloud Build 作业的权限:

    gcloud projects add-iam-policy-binding $RECO_MGR_PROJECT \
      --member serviceAccount:build-invoker@$RECO_MGR_PROJECT.iam.gserviceaccount.com \
      --role roles/cloudbuild.builds.editor \
      --project $RECO_MGR_PROJECT
    
     gcloud projects add-iam-policy-binding $RECO_MGR_PROJECT \
       --member serviceAccount:build-invoker@$RECO_MGR_PROJECT.iam.gserviceaccount.com \
       --role roles/serviceusage.serviceUsageConsumer \
       --project $RECO_MGR_PROJECT
    
  3. 创建 Cloud Scheduler 作业以调用您在上一步中创建的触发器:

    gcloud scheduler jobs create http scheduled-build \
       --project $RECO_MGR_PROJECT \
       --time-zone "America/Los_Angeles" \
       --schedule="0 */3 * * *" \
       --uri="https://cloudbuild.googleapis.com/v1/projects/${RECO_MGR_PROJECT}/triggers/${TRIGGER_ID}:run" \
       --description="Scheduler job to invoke Cloud Build" \
       --oauth-service-account-email="build-invoker@$RECO_MGR_PROJECT.iam.gserviceaccount.com" \
       --headers="Content-Type=application/json" \
       --http-method="POST" \
    

    如果您看到以下消息,请选择 Y

    There is no App Engine app in the project.

    如果系统提示您选择希望 App Engine 应用所在的区域,请选择 us-central 区域。

提交 Cloud Build 配置文件并将其推送到 GitHub

将您创建的两个 Cloud Build 配置文件推送到 YOUR_PRIVATE_DRY_REPO 代码库:

git remote add dry https://github.com/$REPO_OWNER/$DRY_REPO_NAME.git

git add cloudbuild.yaml
git add cloudbuild-scheduled-recommendations.yaml
git commit -m "Added cloudbuild configuration YAMLs"
git push dry main

在推送到私有代码库时,系统可能会提示您输入 GitHub 凭据。

查看 Cloud Build 作业的结果

提交更改并将其推送到 YOUR_PRIVATE_DRY_REPO 代码库时,将会触发 Cloud Build 作业。如果 Cloud Build 作业成功运行,则会创建多个资源。在本部分中,您将验证 Cloud Build 作业完成后是否创建了资源。

  1. 通过 Cloud Shell,在您的 sample-ops 集群中,验证您是否拥有名为 activeassist-kcc 的命名空间:

    kubectl get ns | grep activeassist-kcc
    
  2. Config Connector 会将正在运行的示例 Compute Engine 实例部署到 PROJECT_ID 项目中。

    验证项目中是否存在 Compute Engine 实例:

     gcloud compute instances list | grep \
     computeinstance-sample-cloudmachine
    

    此机器的 MACHINE_TYPE 类型是 n1-standard-1

运行端到端测试

为了使您能够测试端到端流水线,您为本教程克隆的代码库提供了示例建议(桩)。您可以使用这些桩来运行端到端流水线。桩会模仿 Active Assist 建议载荷,并建议将已部署的计算引擎实例的机器类型从 n1-standard-1 实例类型更改为 g1-small 实例类型。

在本部分中,您将手动调用计划的 Cloud Build 触发器,以运行使用 kpt 函数提取 Active Assist 建议的作业。您还将验证是否已在 YOUR_PRIVATE_DRY_REPO 代码库中创建 GitHub 问题。

  1. 打开 Google Cloud 控制台中的“构建触发器”页面

    打开“构建触发器”页面

  2. 选择 ActiveAssistScheduledRecommendations 触发器。

  3. 要手动测试触发器,请点击触发器列表中触发器条目上的运行

    触发器会在您的 YOUR_PRIVATE_DRY_REPO 代码库中创建 GitHub 问题。问题内容类似如下:

    gcloud auth configure-docker
    
    docker build -t gcr.io/$RECO_MGR_PROJECT/kpt-dev-gh:1 ./recommender-kpt-function
    
    docker push gcr.io/$RECO_MGR_PROJECT/kpt-dev-gh:1
    

    在示例问题中,kpt 函数输出显示 Compute Engine 实例的当前 MACHINE_TYPE 类型为 n1-standard-1 类型。Active Assist 建议将其更改为 g1-small 类型。

    企业中的版本控制审核人员可以审核自动化的 GitHub 问题,并视情况为企业采取相应的措施。

清理

为避免因本教程中使用的资源导致您的 Google Cloud 帐号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤