本教程介绍如何使用 VPA 建议和用量指标来合理调整 Google Kubernetes Engine (GKE) 工作负载的大小。
了解合理调整资源容量的重要性
预配不足可能会使容器缺少足够的必要资源来运行应用,导致应用运行缓慢并且可靠性下降。过度预配不会影响应用的性能,但可能会增加您的每月费用。
下表说明了 CPU 和内存预配不足和过度预配的影响:
资源 | 配置状态 | 风险 | 说明 |
---|---|---|---|
CPU | 过度 | 费用 | 预留不必要的资源,导致工作负载费用增加。 |
不足 | 性能 | 导致工作负载运行缓慢或无响应。 | |
未设置 | 可靠性 | CPU 可能被限制为 0,导致工作负载无响应。 | |
内存 | 过度 | 费用 | 预留不必要的资源,导致工作负载费用增加。 |
不足 | 可靠性 | 导致应用因内存不足 (OOM) 错误而终止。 | |
未设置 | 可靠性 | kubelet 可能随时停止 Pod,并将其标记为失败。 |
目标
在本教程中,您将学习如何完成以下操作:
- 部署一个示例应用。
- 将 GKE 建议指标从 Monitoring 导出到 BigQuery。
- 使用 BigQuery 和 Looker Studio 查看所有项目的 GKE 容器建议。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
您可使用价格计算器根据您的预计使用情况来估算费用。
完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理。
准备工作
设置项目
Cloud Shell 预装了本教程所需的软件,包括 Docker、kubectl
、gcloud CLI 和 Terraform。
如果您不使用 Cloud Shell,则必须安装 gcloud CLI。
- 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.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
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 - Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
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 -
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_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.
- Replace
设置您的环境
如需设置您的环境,请按以下步骤操作
设置环境变量:
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。设置默认环境变量:
gcloud config set project $PROJECT_ID gcloud config set compute/region $REGION gcloud config set compute/zone $ZONE
克隆代码库。
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
切换到工作目录。
cd kubernetes-engine-samples/cost-optimization/gke-vpa-recommendations
(可选)设置示例应用
这是一个可选部分,用于部署示例应用。如需使用现有集群,请确保集群上已配置 Cloud Monitoring。
为了模拟真实环境,您将使用设置脚本来部署 Online Boutique。
以下步骤将安装示例应用并修改默认配置。例如,说明会为某些工作负载配置 Pod 横向自动扩缩器 (HPA),并更改资源请求和限制。
运行设置脚本:
./scripts/setup.sh
设置脚本会执行以下任务:
- 创建 GKE 集群。
- 部署 Online Boutique 示例应用。
- 更新 Pod CPU 和内存资源请求。
- 为
adservice
工作负载配置 HorizontalPodAutoscaler 资源,以模拟真实环境。
设置脚本最多可能需要 10 分钟才能完成。
验证示例应用已准备就绪:
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
创建代码库
创建代码库以存储指标导出器映像。
创建一个新的 Docker 代码库:
gcloud artifacts repositories create main --repository-format=docker \ --location=$REGION \ --description="docker repository"
设置对 Docker 代码库的身份验证:
gcloud auth configure-docker $REGION-docker.pkg.dev
运行以下命令来部署映像:
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
设置配置环境变量:
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_DATASET
和TF_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_SECONDS
和METRIC_WINDOW
更新为2592000
秒(30 天)。
部署 Terraform 配置
初始化、验证并应用您的配置:
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 创建和管理。
手动运行 Cloud Scheduler 作业:
gcloud scheduler jobs run recommendation-schedule --location ${REGION}
验证 Deployment
选择
workload-recommendations
详情页面上的日志标签页。验证 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 中查看容器建议
在 Google Cloud 控制台中,转到 BigQuery 页面。
验证数据是否显示在
gke_metrics
表和container_recommendations
视图中。根据工作负载的数量,将所有指标写入 BigQuery 可能需要几分钟时间。在查询编辑器中,选择
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
视图中的数据:
- 打开工作负载合理调整容量的信息中心模板
- 点击使用我自己的数据。
- 选择您的项目。
- 在“数据集”字段中,选择
gke_metric_dataset
。 - 在“表”字段中,选择
container_recommendations
。 - 点击添加。
- 点击添加到报告。
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
后续步骤
- 如需详细了解 GKE 费用优化,请参阅在 GKE 上运行费用经过优化的 Kubernetes 应用的最佳做法。
- 在 Google Cloud 架构框架:费用优化中查找优化 Google Cloud 工作负载费用的设计建议和最佳实践。
- 如需详细了解如何在需求较低的时段优化集群费用,请参阅在非高峰时段缩减 GKE 集群以降低费用。
- 如需详细了解 GKE 费用优化,请参阅使用 Monitoring 监控 GKE 集群以优化费用。