本文档是系列文章中的一篇,讨论了企业可以用于通过 Active Assist 来大规模优化云足迹的架构模式。本教程介绍如何为与 GKE Enterprise 工具链搭配使用的 Active Assist 建议构建自动化流水线。它适用于使用 Config Sync 管理 GKE Enterprise 环境和 Config Connector 管理 Google Cloud 资源的人员。本系列文章的其他部分如下所示:
- 大规模使用 Active Assist 的模式
- 将无服务器流水线与 Active Assist 搭配使用
- 将 GKE Enterprise 工具链与 Active Assist 搭配使用(本文档)
您在本教程中构建的自动化流水线可以帮助您实现以下目标:
- 扩大 Active Assist 产品组合在组织中的使用范围。
- 使 Active Assist 成为您的持续集成和持续交付 (CI/CD) 流水线的一部分。
- 使用 GitHub 问题和拉取请求等结构控制 Active Assist 建议的审核和启动。
本教程还使用 kpt,这是 Google 开发的开源工具包,可帮助您管理、操作、自定义和应用 Kubernetes 资源配置数据文件。
架构
以下架构图展示了您在本教程中使用的组件。
这些组件的使用方式如下:
- GitHub 的一次且仅一次 (DRY) 代码库,该代码库用于您在 Google Cloud 组织中的多个项目之间部署的 Config Connector 模板。
- 一个或多个特定于项目或环境的 GitHub 代码库,其中包含混合配置文件。这些混合代码库适用于 Config Sync 管理的环境。它们使用 Config Connector 在 Google Cloud 组织中操作和管理 Google Cloud 资源。
- 使用 Config Sync 进行版本控制和偏移检测的 GKE 集群。此集群还安装了 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 问题以及推荐更改的详细信息。
此架构的工作流如下:
- 有权访问 DRY 代码库的授权团队在代码库中创建和管理 Config Connector 模板。
- 当创建或修改模板并签入
main分支时,就会触发 Cloud Build 作业。 - Cloud Build 作业通过调用 kpt setter 来融合模板。该作业会将混合配置文件推送到混合 GitHub 代码库。Secret Manager 用于存储私有代码库的 GitHub 部署密钥。
- Config Sync 监控混合代码库的更改,并将代码库中的更新应用于代管式集群。
- Config Connector 会监控更改;如果由于 Config Sync 应用 Kubernetes 资源模型 (KRM) 更改而需要创建或更新任何资源,则 Config Connector 会启动 Google Cloud资源。
- 计划 Cloud Build 触发器会定期运行以调用 Recommender API,从而提取 Config Connector 管理的项目的有效建议。
- 计划 Cloud Build 作业执行自定义 kpt 函数以调用 Recommender API 并提取和解析有效建议。
- kpt 函数会创建一个 GitHub 问题,用于显示当前资源配置和建议的资源配置的比较。使用此方法,系统会在 DRY 代码库中创建 GitHub 问题,从而更轻松地跟踪代码库更改。
目标
- 创建以下示例 GitHub 代码库:
- Config Connector KRM 的 DRY 代码库。
- 用于保存使用 kpt setter 生成的混合配置文件的代码库。
- 使用 Config Sync 和 Config Connector 创建 GKE 集群。
- 创建示例 kpt 函数以检索由 Config Connector 管理的项目的 Active Assist 建议。
- 创建一个在将模板推送到 DRY 代码库的
main分支时触发的 Cloud Build 触发器。 - 创建一个定期运行的计划 Cloud Build 作业,以便为 Config Connector 管理的资源检索可用的 Active Assist 建议。
- 使用本教程的 GitHub 代码库中提供的桩建议来测试端到端流水线。
费用
在本文档中,您将使用的以下收费组件: Google Cloud
- Cloud Build
- Cloud Run
- Firestore
- Pub/Sub
- Container Registry
- Cloud Scheduler
- Google Kubernetes Engine (GKE) Enterprise edition
您可使用 价格计算器 根据您的预计使用情况来估算费用。
完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理。
准备工作
-
在 Google Cloud 控制台中,前往项目选择器页面。
-
选择或创建 Google Cloud 项目。
选择或创建项目所需角色
- 选择项目:选择项目不需要特定的 IAM 角色,您可以选择已获授予角色的任何项目。
-
创建项目:如需创建项目,您需要拥有 Project Creator 角色
(
roles/resourcemanager.projectCreator),该角色包含resourcemanager.projects.create权限。了解如何授予 角色。
- 请记下 Google Cloud 项目 ID。您将在下一部分中设置环境时使用此 ID。在本教程中,此项目称为
build项目。 -
启用 Cloud Build、Firestore、App Engine、Pub/Sub、 Cloud Run、Cloud Scheduler 和 Cloud Source Repositories API。
在本教程中,您将使用默认的应用凭据。如果系统提示您在向项目添加凭据 页面上创建凭据,请点击取消 。启用 API 所需的角色
如需启用 API,您需要拥有 Service Usage Admin IAM 角色 (
roles/serviceusage.serviceUsageAdmin),该角色包含serviceusage.services.enable权限。了解如何授予 角色。 -
验证是否已为您的 Google Cloud 项目启用结算功能。
设置环境
在本教程中,您将在 Cloud Shell 中运行所有命令。
在 Google Cloud 控制台中,激活 Cloud Shell。
设置当前
buildGoogle 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。为部署区域设置变量:
export REGION=us-central1 export ZONE=us-central1-a克隆包含本教程中使用的示例应用代码的代码库:
git clone https://github.com/GoogleCloudPlatform/activeassist-anthos-toolchain.git转到项目目录:
cd activeassist-anthos-toolchain
构建流水线
在本部分中,您将创建组件以构建流水线。Active Assist 建议是根据使用模式和系统指标生成的。每个建议类别都可以使用不同的默认时间范围来根据生成的建议分析使用情况数据和指标。如需测试端到端流水线,您在上一步中克隆的代码库提供了用于运行端到端流水线的示例建议(存根)。
或者,如果您在具有现有资源和建议的示例项目中运行流水线,则可以对示例代码进行适当的更改,然后运行流水线。
设置示例私有 GitHub 代码库
在以下部分中,您将设置本教程的示例 GitHub 代码库。
设置私有 DRY GitHub 代码库
为 DRY 代码库创建私有 GitHub 代码库。请记下您为代码库指定的名称。
在 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 代码库的名称。
创建个人访问令牌 (PAT) 以在此代码库中创建问题。如果存在需要查看的 Active Assist 建议,流水线会创建 GitHub 问题。如需详细了解如何在 GitHub 中创建 PAT,请参阅 GitHub 文档。
为此令牌设置范围时,请选择完全控制私有代码库。
在 Cloud Shell 中,为您生成的 PAT 创建环境变量:
export GITHUB_TOKEN=YOUR_PERSONAL_ACCESS_TOKEN将
YOUR_PERSONAL_ACCESS_TOKEN替换为您自己的令牌。
设置私有混合 GitHub 代码库
为混合代码库创建私有 GitHub 代码库。记下您为代码库指定的名称。
在 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替换为混合代码库的名称。创建部署密钥对:
ssh-keygen -t rsa -b 4096 \ -C 'active-assist-robot' \ -N '' \ -f $(pwd)/active-assist-robot通过部署密钥,您可以在运行 Cloud Build 作业以融合配置文件时部署到私有 GitHub 代码库。
输出生成的密钥:
cat $(pwd)/active-assist-robot.pub将部署密钥添加到私有 GitHub 代码库。添加部署密钥时,请务必选择允许写入权限。如需了解如何将部署密钥添加到 GitHub 代码库,请参阅管理部署密钥的 GitHub 文档。
将 GitHub 密钥上传到 Secret Manager
在 Cloud Shell 中,创建 Secret 以存储来自部署密钥对的私钥:
gcloud secrets create github-ssh-key \ --data-file=$(pwd)/active-assist-robot创建 Secret 以存储 PAT:
echo $GITHUB_TOKEN | gcloud secrets create github-pat --data-file=-
创建 GKE 集群
在本部分中,您将使用 Config Connector 插件创建 GKE 集群,创建身份并配置 Config Connector。您还将配置 Config Sync。您可以使用 Config Sync 在所有基础设施中创建通用配置(包括自定义政策),并将其同时应用于本地和云端环境。Config Sync 会评估变更并将其发布至所有 Kubernetes 集群,以便集群中始终反映期望的状态。
在 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完成使用 GKE 插件安装指南中的以下部分,以创建身份并配置 Config Connector。
在您创建的 GKE 集群中安装 Config Sync。配置 Config Sync 时,您必须执行以下操作:
- 使用令牌向 Config Sync 授予对 Git 的只读权限。使用您在设置专用 DRY GitHub 代码库时创建的 GitHub 令牌。令牌可通过
$GITHUB_TOKEN环境变量获取。 - 使用 gcloud 配置 Config Sync。
设置以下设置:
- sourceFormat:
hierarchy - syncRepo:
https://github.com/YOUR_GITHUB_USERNAME/YOUR_PRIVATE_HYDRATED_REPO - syncBranch:
main - secretType:
token - policyDir:请勿填写此选项
- sourceFormat:
- 使用令牌向 Config Sync 授予对 Git 的只读权限。使用您在设置专用 DRY GitHub 代码库时创建的 GitHub 令牌。令牌可通过
创建 Cloud Build 触发器以推送到混合代码库
在以下部分中,您将创建一个在模板被推送到 YOUR_PRIVATE_DRY_REPO 代码库的主分支时触发的 Cloud Build 触发器。此触发器会运行用于融合 YOUR_PRIVATE_DRY_REPO 代码库中的配置即数据 KRM 模板的步骤,并将混合配置文件推送到您的 YOUR_PRIVATE_HYDRATED_REPO 代码库。
将 Cloud Build 连接到您的 GitHub 代码库
在本部分中,您将 YOUR_PRIVATE_DRY_REPO 和 YOUR_PRIVATE_HYDRATED_REPO GitHub 代码库连接到 Cloud Build。
转到 Cloud Build 应用的 GitHub 市场页面。
点击使用 Google Cloud Build 进行设置。
如果系统提示,请登录 GitHub。
选择 Only select repositories。
使用选择代码库下拉列表通过 Cloud Build 应用启用对
YOUR_PRIVATE_DRY_REPO和YOUR_PRIVATE_HYDRATED_REPO代码库的访问权限。点击安装。
登录 Google Cloud。随即将显示授权页面,并且系统会提示您授权 Google Cloud Build 应用连接到 Google Cloud。
点击授权 Google Cloud Build by GoogleCloudBuild 。 系统会将您重定向至 Google Cloud 控制台。
选择您的 Google Cloud 项目。
选择同意复选框,然后点击下一步 。
点击安装。
登录 Google Cloud。随即将显示授权页面,并且系统会提示您授权 Google Cloud Build 应用连接到 Google Cloud。
点击授权 Google Cloud Build by GoogleCloudBuild 。 系统会将您重定向至 Google Cloud 控制台。
选择您的 Google Cloud 项目。
选择同意复选框,然后点击下一步 。
在显示的选择代码库页面中,选择以下 GitHub 代码库:
YOUR_PRIVATE_DRY_REPOYOUR_PRIVATE_HYDRATED_REPO
点击连接,然后点击完成。
为 DRY 代码库创建 Cloud Build 触发器
在 Cloud Shell 中,运行以下命令:
envsubst < cloudbuild.template.yaml > cloudbuild.yaml该命令会生成
cloudbuild.yaml文件。创建触发器:
gcloud beta builds triggers create github \ --name ActiveAssistDemo \ --repo-name=$DRY_REPO_NAME \ --repo-owner=$REPO_OWNER \ --branch-pattern="main" \ --build-config=cloudbuild.yaml授予 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 触发器
Google Cloud在以下部分中,您将创建一个定期运行的计划 Cloud Build 构建触发器。此触发器使用 kpt 函数提取 Active Assist 建议,并确定 YOUR_PRIVATE_HYDRATED_REPO 代码库中的资源是否有任何有效建议。如果有需要审核和激活的资源配置有效建议,kpt 函数还会在 YOUR_PRIVATE_HYDRATED_REPO 代码库中创建 GitHub 问题。
生成 Cloud Build 映像
在本部分中,您将生成一个包含 kpt、gh 和节点组件的 Cloud Build 映像。
在 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 触发器
在 Cloud Shell 中,创建在设置计划的 Cloud Build 触发器时需要使用的配置文件:
envsubst < cloudbuild-scheduled-recommendations.template.yaml > cloudbuild-scheduled-recommendations.yaml创建 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获取此触发器的 ID:
export TRIGGER_ID=`gcloud beta builds triggers describe \ ActiveAssistScheduledRecommendations \ --format="value(id)"`
创建 Cloud Scheduler 作业以调用触发器
在 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_PROJECTCloud Scheduler 作业使用此服务账号运行
recommender-parser服务。向服务账号授予调用 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创建 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 作业完成后是否创建了资源。
通过 Cloud Shell,在您的
sample-ops集群中,验证您是否拥有名为activeassist-kcc的命名空间:kubectl get ns | grep activeassist-kccConfig 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 问题。
在 Google Cloud 控制台中打开构建触发器页面。
选择
ActiveAssistScheduledRecommendations触发器。要手动测试触发器,请点击触发器列表中触发器条目上的运行。
触发器会在您的
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 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
- 在 Google Cloud 控制台中,前往 管理资源 页面。
- 在项目列表中,选择要删除的项目,然后点击删除。
- 在对话框中输入项目 ID,然后点击 关闭以删除项目。
后续步骤
- 详细了解 Google Cloud无服务器技术。
- 了解如何将 Policy Intelligence 建议集成到基础架构即代码 (IaC) 流水线中。