大规模合理调整 GKE 工作负载容量


本教程介绍如何使用 VPA 建议和用量指标来合理调整 Google Kubernetes Engine (GKE) 工作负载的大小。

了解合理调整资源容量的重要性

预配不足可能会使容器缺少足够的必要资源来运行应用,导致应用运行缓慢并且可靠性下降。过度预配不会影响应用的性能,但可能会增加您的每月费用。

下表说明了 CPU 和内存预配不足和过度预配的影响:

资源 配置状态 风险 说明
CPU 超过 费用 预留不必要的资源,导致工作负载费用增加。
不足 性能 导致工作负载运行缓慢或无响应。
未设置 可靠性 CPU 可能被限制为 0,导致工作负载无响应。
内存 超过 费用 预留不必要的资源,导致工作负载费用增加。
不足 可靠性 导致应用因内存不足 (OOM) 错误而终止。
未设置 可靠性 kubelet 可能随时停止 Pod,并将其标记为失败。

目标

在本教程中,您将学习如何完成以下操作:

  • 部署一个示例应用。
  • 将 GKE 建议指标从 Monitoring 导出到 BigQuery。
  • 使用 BigQuery 和 Looker Studio 查看所有项目的 GKE 容器建议。

费用

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

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

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

准备工作

设置项目

Cloud Shell 预装了本教程所需的软件,包括 Dockerkubectlgcloud CLITerraform。 如果您不使用 Cloud Shell,则必须安装 gcloud CLI。

  1. 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.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Resource Manager, Google Kubernetes Engine, Cloud Monitoring, BigQuery, Cloud Run, Cloud Build APIs:

    gcloud services enable cloudresourcemanager.googleapis.com container.googleapis.com monitoring.googleapis.com bigquery.googleapis.com run.googleapis.com cloudbuild.googleapis.com cloudscheduler.googleapis.com artifactregistry.googleapis.com
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

    gcloud init
  9. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  10. Make sure that billing is enabled for your Google Cloud project.

  11. Enable the Resource Manager, Google Kubernetes Engine, Cloud Monitoring, BigQuery, Cloud Run, Cloud Build APIs:

    gcloud services enable cloudresourcemanager.googleapis.com container.googleapis.com monitoring.googleapis.com bigquery.googleapis.com run.googleapis.com cloudbuild.googleapis.com cloudscheduler.googleapis.com artifactregistry.googleapis.com
  12. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/serviceusage.serviceUsageAdmin, roles/container.clusterAdmin, roles/iam.serviceAccountAdmin, roles/iam.securityAdmin, roles/container.admin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
    • Replace PROJECT_ID with your project ID.
    • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

    • Replace ROLE with each individual role.

设置您的环境

如需设置您的环境,请按以下步骤操作

  1. 设置环境变量:

    export PROJECT_ID=PROJECT_ID
    export REGION=us-central1
    export ZONE=us-central1-f
    export IMAGE=$REGION-docker.pkg.dev/$PROJECT_ID/main/vpa-recs-image:latest
    

    PROJECT_ID 替换为您的 Google Cloud 项目 ID

  2. 设置默认环境变量:

    gcloud config set project $PROJECT_ID
    gcloud config set compute/region $REGION
    gcloud config set compute/zone $ZONE
    
  3. 克隆代码库。

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  4. 切换到工作目录。

    cd kubernetes-engine-samples/cost-optimization/gke-vpa-recommendations
    

(可选)设置示例应用

这是一个可选部分,用于部署示例应用。如需使用现有集群,请确保集群上已配置 Cloud Monitoring

为了模拟真实环境,您将使用设置脚本来部署 Online Boutique

以下步骤将安装示例应用并修改默认配置。例如,说明会为某些工作负载配置 Pod 横向自动扩缩器 (HPA),并更改资源请求和限制。

  1. 运行设置脚本:

    ./scripts/setup.sh
    

    设置脚本会执行以下任务:

    • 创建 GKE 集群。
    • 部署 Online Boutique 示例应用。
    • 更新 Pod CPU 和内存资源请求。
    • adservice 工作负载配置 HorizontalPodAutoscaler 资源,以模拟真实环境。

    设置脚本最多可能需要 10 分钟才能完成。

  2. 验证示例应用已准备就绪:

    kubectl get deployment
    

    输出类似于以下内容:

    NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
    adservice               2/2     2            2           4m54s
    cartservice             1/1     1            1           4m55s
    checkoutservice         1/1     1            1           4m56s
    currencyservice         1/1     1            1           4m55s
    emailservice            1/1     1            1           4m56s
    frontend                1/1     1            1           4m55s
    loadgenerator           1/1     1            1           4m55s
    paymentservice          1/1     1            1           4m55s
    productcatalogservice   1/1     1            1           4m55s
    recommendationservice   1/1     1            1           4m56s
    redis-cart              1/1     1            1           4m54s
    shippingservice         1/1     1            1           4m54s
    

创建代码库

创建代码库以存储指标导出器映像。

  1. 创建一个新的 Docker 代码库:

    gcloud artifacts repositories create main --repository-format=docker \
        --location=$REGION \
        --description="docker repository"
    
  2. 设置对 Docker 代码库的身份验证:

    gcloud auth configure-docker $REGION-docker.pkg.dev
    
  3. 运行以下命令来部署映像:

    gcloud builds submit metrics-exporter --region=$REGION --tag $IMAGE
    

部署应用

在以下部分中,您将使用 Terraform 执行以下任务:

  • 创建服务账号并分配管理 Google Cloud 资源并与之交互所需的权限。
  • 向服务账号授予 Monitoring Viewer、BigQuery Data Editor、BigQuery Data Owner、BigQuery Job User 和 Cloud Run Invoker 角色。
  • 部署 Cloud Run 作业(该作业可从 Artifact Registry 拉取 Docker 映像),并使用指定配置运行该映像。
  • 创建每天触发 Cloud Run 服务的 Cloud Scheduler 作业。
  • 创建 BigQuery 数据集、表和视图以存储指标数据和建议。

配置 Terraform

  1. 设置配置环境变量:

    export TF_VAR_BIGQUERY_DATASET=gke_metrics_dataset
    export TF_VAR_BIGQUERY_TABLE=gke_metrics
    export TF_VAR_RECOMMENDATION_WINDOW_SECONDS=1209600
    export TF_VAR_RECOMMENDATION_DISTANCE=86400
    export TF_VAR_LATEST_WINDOW_SECONDS=600
    export TF_VAR_METRIC_WINDOW=259200
    export TF_VAR_METRIC_DISTANCE=600
    

    此命令包含以下参数:

    • TF_VAR_BIGQUERY_DATASETTF_VAR_BIGQUERY_TABLE:用于存放 GKE 指标数据。
    • TF_VAR_RECOMMENDATION_WINDOW_SECONDS:VPA 建议的时间范围。默认值为 1,209,600 秒(14 天)。
    • TF_VAR_RECOMMENDATION_DISTANCE:返回 VPA 建议数据点的时间间隔。默认值为 86,400 秒(1 天)。
    • TF_VAR_LATEST_WINDOW_SECONDS:获取最新请求量和限制资源值的时间范围。默认值为 600 秒(10 分钟)。
    • METRIC_WINDOW:确定 GKE 用量和利用率指标的时间范围。默认值为 259,200 秒(3 天)。
    • METRIC_DISTANCE:返回数据点的时间间隔。默认值为 600 秒(10 分钟)。

    根据工作负载的需求调整这些值。例如,对于每月运行一次的批量工作负载,可将 TF_VAR_RECOMMENDATION_WINDOW_SECONDSMETRIC_WINDOW 更新为 2592000 秒(30 天)。

部署 Terraform 配置

  1. 初始化、验证并应用您的配置:

    terraform -chdir=terraform init
    terraform -chdir=terraform validate
    terraform -chdir=terraform apply -var project_id=$PROJECT_ID -var region=$REGION -var image=$IMAGE
    

    此命令提供执行计划,并在进行任何更改之前都请求您的批准。查看方案,如果一切符合预期,请输入 yes 以继续。

    应用命令成功完成后,您的资源将由 Terraform 创建和管理。

  2. 手动运行 Cloud Scheduler 作业:

    gcloud scheduler jobs run recommendation-schedule --location ${REGION}
    

验证 Deployment

  1. 选择 workload-recommendations 详情页面上的日志标签页。

  2. 验证 Cloud Run 控制台中正在处理指标日志:

    转到 Cloud Run

    日志显示写入 BigQuery 的指标。输出应类似如下所示:

    INFO - Building Row
    INFO - Successfully wrote 12 rows to BigQuery table [PROJECT_ID].gke_metric_dataset.gke_metrics.
    INFO - Run Completed
    

    如果输出不匹配,请等待五分钟,然后运行 gcloud scheduler jobs run recommendation-schedule --location $REGION 命令。

在 BigQuery 中查看容器建议

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 验证数据是否显示在 gke_metrics 表和 container_recommendations 视图中。根据工作负载的数量,将所有指标写入 BigQuery 可能需要几分钟时间。

  3. 在查询编辑器中,选择 container_recommendations 视图中的所有行:

    SELECT * FROM `PROJECT_ID.gke_metrics_dataset.container_recommendations`
    

    此程序会从 Cloud Monitoring 中提取以下指标:

    • 工作负载详情:项目 ID、集群名称、控制器和容器名称。

    • CPU/内存用量和利用率:工作负载正在使用的 CPU 和内存量,以及正在使用的 CPU 和内存所占的百分比。

    • 请求量和限制:为工作负载请求的 CPU 和内存量,以及允许工作负载使用的 CPU 和内存量上限。

    • CPU 和内存工作负载建议:为了确保工作负载平稳运行,根据针对部署的 VPA 建议和针对非部署对象的实际用量和目标利用率,应向工作负载分配多少 CPU 和内存的建议。

在 Looker Studio 中直观呈现建议

Looker Studio 是一个免费的自助式商业智能平台,您可以在其中构建和使用数据可视化、信息中心和报告。借助 Looker Studio,您可以连接到数据、创建可视化图表并与他人共享数据分析结果。

使用 Looker Studio 直观呈现 BigQuery container_recommendations 视图中的数据:

  1. 打开工作负载合理调整容量的信息中心模板
  2. 点击使用我自己的数据
  3. 选择您的项目。
  4. 在“数据集”字段中,选择 gke_metric_dataset
  5. 在“表”字段中,选择 container_recommendations
  6. 点击添加
  7. 点击添加到报告

Looker Studio 模板详细信息

Looker Studio 模板详情页面提供以下信息:

  • GKE 工作负载合理调整容量概览:提供集群的概览,包括:
    • 可能存在可靠性问题和性能问题的“倾尽全力”工作负载和“可爆发”工作负载的数量。
    • 可能会节省的 CPU 和内存资源。正值表示过度预配,而负值表示预配不足。
  • 工作负载建议:针对工作负载 CPU 和内存的请求和限制提供相关建议。
  • 存在风险的 GKE 工作负载:显示最有可能遇到可靠性和性能问题的工作负载。
  • 历史记录 - 工作负载合理调整容量 - 我们的表现如何?:提供关于工作负载合理调整容量和减少“倾尽全力”工作负载数量的实现情况的历史视图。

请求的 CPU 和 CPU 限制容器建议

如果请求的工作负载 CPU 和工作负载 CPU 限制值相等,则 QoS 被视为“Guaranteed”,并且 CPU 建议设置为 14 天时间段内的最大值。否则,将使用 14 天内请求的 CPU 建议的第 95 百分位。

当 CPU 请求和限制值相等时,CPU 限制的建议设置为仅部署对象的最大 CPU 请求 VPA 建议,目标利用率为 70%。如果工作负载的请求和限制不同,则使用现有的限制比率。

请求的内存和内存限制容器建议

内存建议仅针对 Deployment 对象使用最大 VPA 建议,并且最大目标内存利用率为 80%,以确保工作负载的可靠性。您可以更新 container_recommendation 视图的查询中的目标利用率值。

最佳做法是对请求和限制使用相同的内存量,因为内存是无法压缩的资源。内存耗尽时,必须关闭 Pod。为避免 Pod 被关闭并导致环境变得不稳定,您必须将请求的内存设置为内存限制。

设置建议的优先级

系统会为每一行分配一个优先级值,以凸显根据建议需要立即加以关注的工作负载。CPU 和内存的单位不同。为了统一单位,使用预定义 CPU 和内存的 E2 机器类型按需价格比率作为将内存单位转换为 CPU 单位的近似值。

优先级的计算公式如下:

priority = (CPU requested - CPU recommendation) + ((memory requested -
memory recommendation) / (vCPUs on-demand pricing /memory on-demand pricing ))

对于 Autopilot,部署配置请求的总资源应在支持的最小值和最大值范围内。

查看多个项目的 VPA 建议

如需查看多个项目的 VPA 容器建议,请使用新的项目作为范围项目

在生产环境中部署此项目时,请将要分析的所有项目添加到新项目的指标范围内。

清理

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

删除项目

为避免支付费用,最简单的方法是删除您为本教程创建的项目。

Delete a Google Cloud project:

gcloud projects delete PROJECT_ID

后续步骤