本页面介绍了 Google Kubernetes Engine (GKE) 中的垂直 Pod 自动扩缩器发出的决策事件。通过分析这些事件,您可以深入了解 Pod 纵向自动伸缩器控制器如何管理工作负载伸缩,并了解其操作背后的决策过程。
Pod 纵向自动扩缩器会发出决策事件,这些事件作为日志条目存储在 Cloud Logging 中。
准备工作
请务必满足以下前提条件:
选择或创建项目
您可以使用现有项目,也可以为本教程创建一个新项目。
- 登录您的 Google Cloud 账号。如果您是 Google Cloud新手,请 创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
启用 API
启用 GKE 和 Cloud Logging API。
启用 API 所需的角色
如需启用 API,您需要拥有 serviceusage.services.enable 权限。如果您创建了项目,则可能已经通过 Owner 角色 (roles/owner) 获得了此权限。否则,您可以通过 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 获得此权限。了解如何授予角色。
设置 Cloud Shell
在本教程中,您将使用 Cloud Shell 运行 gcloud 和 kubectl 命令。Cloud Shell 是一种 shell 环境,用于管理在 Google Cloud上托管的资源。它预安装有 Google Cloud CLI 和 kubectl 命令行工具。
在 Google Cloud 控制台中,激活 Cloud Shell。
控制台下方的框架内会打开一个 Cloud Shell 会话。
在运行本教程中的命令之前,请确保将默认项目设置为您要在其中部署示例应用的项目 ID。如果尚未进行此项设置,请在 Cloud Shell 中运行以下命令:
gcloud config set project PROJECT_ID
将 PROJECT_ID 替换为您的项目 ID。
所需的角色和权限
如需获得启用日志生成以及访问和处理日志所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:
-
在集群中启用 Pod 纵向自动扩缩器事件日志记录:Kubernetes Engine Cluster Admin (
roles/container.clusterAdmin) -
访问日志并使用 Logs Explorer 和 Observability Analytics:Logs Viewer (
roles/logging.viewer)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
要求
- 您的 GKE 集群必须运行
1.36.0-gke.1601000版或更高版本。 - 在 GKE 集群中启用 Cloud Logging。
- 确保您拥有要监控的 Pod 纵向自动扩缩器。确保垂直 Pod 自动扩缩器字段不包含敏感数据。
费用
启用 Cloud Logging 并收集 Pod 纵向自动扩缩程序决策日志时,您需要按 Cloud Logging 价格付费。
启用 Pod 纵向自动扩缩器决策日志
以下各部分中的命令会启用由 KCP_VPA 生成的日志的导出功能,并将这些日志保存在 Cloud Logging 中的目标位置 logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fvpa-controller"。
在新集群上启用日志
如需创建启用 KCP_VPA 决策日志的新集群,请运行以下命令。
gcloud container clusters create CLUSTER_NAME \
--location=LOCATION \
--project=PROJECT_ID \
--logging=SYSTEM,KCP_VPA
替换以下内容:
CLUSTER_NAME:要创建或更新的集群的名称。PROJECT_ID:您的 Google Cloud 项目 ID。LOCATION:集群的计算区域或可用区。
在现有集群上启用日志
如需在现有集群上启用 KCP_VPA 决策日志,请执行以下操作:
查看集群的现有配置。如果集群已配置特定的日志记录组件,请决定是要添加到现有日志记录配置还是覆盖现有日志记录配置。
如需启用垂直 Pod 自动扩缩器决策日志,请运行以下命令。如果您要添加到现有配置,请同时将现有日志记录配置添加到命令中。
gcloud container clusters update CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --logging=SYSTEM,KCP_VPA替换以下内容:
CLUSTER_NAME:要创建或更新的集群的名称。PROJECT_ID:您的 Google Cloud 项目 ID。LOCATION:集群的计算区域或可用区。
验证是否已启用日志记录
如需验证集群上是否已启用 KCP_VPA 决策日志,请检索集群更新后的日志记录配置,并查看日志列表。为此,请运行以下命令:
gcloud container clusters describe CLUSTER_NAME \
--location=LOCATION \
--flatten=loggingConfig \
--format='csv[delimiter=",",no-heading](componentConfig.enableComponents)'
替换以下内容:
CLUSTER_NAME:集群的名称。LOCATION:集群的计算区域或可用区。
在集群上启用 KCP_VPA 决策日志后,输出类似于以下内容:
SYSTEM_COMPONENTS,APISERVER,CONTROLLER_MANAGER,SCHEDULER,KCP_VPA
在 Logs Explorer 中查看 Pod 纵向自动扩缩器的日志
您可以在 Logs Explorer 中监控 Pod 纵向自动扩缩器的行为。如需查看 Pod 纵向自动扩缩器日志,请完成以下步骤:
前往“日志浏览器”页面:
选择所有日志名称,然后在日志名称中搜索
vpa-controller。日志浏览器会显示所有 Pod 纵向自动扩缩器日志,包括项目中已启用 Pod 纵向自动扩缩器日志的所有集群的日志。
您可以使用集群名称或工作负载名称过滤日志。例如,如需列出集群中特定工作负载的事件,请使用以下查询指定集群名称和工作负载名称:
resource.labels.cluster_name="CLUSTER_NAME" AND jsonPayload.target.name="WORKLOAD_NAME"替换以下内容:
CLUSTER_NAME:集群的名称。WORKLOAD_NAME:工作负载的名称。
停用 Pod 纵向自动扩缩决策日志
如需在现有集群上停用
KCP_VPA决策日志,请运行以下命令:gcloud container clusters update CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --logging=SYSTEM验证
KCP_VPA决策日志是否已停用。为此,请运行以下命令:gcloud container clusters describe CLUSTER_NAME \ --location=LOCATION \ --flatten=loggingConfig \ --format='csv[delimiter=",",no-heading](componentConfig.enableComponents)'当集群上的
KCP_VPA决策日志被停用时,输出类似于以下内容:SYSTEM_COMPONENTS,APISERVER,CONTROLLER_MANAGER,SCHEDULER
日志类型
Pod 纵向自动扩缩器的决策事件存储在 Cloud Logging 中的 logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fvpa-controller" 位置,该位置位于与 GKE 集群在同一项目的 _Default bucket 中。所有记录的事件都采用 JSON 格式,并且可以在日志条目的 jsonPayload 字段中找到。
生成的日志类型和频率取决于为工作负载配置的 Pod 纵向自动扩缩模式。VPA 日志有四种类型,按其执行的操作进行分类:
- 更新建议:每个 Pod 纵向自动扩缩器每分钟都会生成一条新的更新建议日志。
- 逐出 Pod:当纵向 Pod 自动扩缩器决定以
Recreate模式调整大小时,每个纵向 Pod 自动扩缩器都会为每个 Pod 生成一条“逐出 Pod”日志。 - 在逐出时应用建议:当 Pod 纵向自动扩缩器决定以
Recreate模式调整大小后,会为每个 Pod 生成一条应用建议日志。 - 就地应用建议:当 Pod 纵向自动扩缩器决定以
InPlaceOrRecreate模式调整大小时,每个 Pod 纵向自动扩缩器都会为每个 Pod 生成一条就地应用建议日志。
控制器可以发出的日志类型取决于 Pod 纵向自动扩缩器的模式。下表列出了每种模式下可以发出的日志。
| Pod 纵向自动扩缩器模式 | 可发出的日志类型 |
|---|---|
Auto(已弃用)或 Recreate |
|
InPlaceOrRecreate |
|
对于模式为 InPlaceOrRecreate 的 Pod 纵向自动扩缩器,当 In-place resize 失败时,自动扩缩器的行为与 Recreate 模式相同。
更新建议
以下 Pod 纵向自动扩缩器模式可以生成更新建议日志:Auto(已弃用)、Recreate 和 InPlaceOrRecreate。
相应决策日志的 jsonPayload 包含以下字段:
| 字段 | 说明 |
|---|---|
vpaName |
VPA 的名称。 |
vpaNamespace |
VPA 的命名空间。 |
target |
相应 VPA 所定位的工作负载。
|
operation |
正在运行的操作。该值可以是以下各项之一:
|
state |
操作的状态。该值可以是以下各项之一:
|
reason |
原因说明了操作被跳过或失败的原因。 对于操作 |
recommendedResources |
原始建议。这与 VPA 对象中的 Status.Recommendation 字段完全相同。
|
confidence |
建议的置信度。当状态为 succeeded 时,此字段存在。该值可以是以下各项之一:
|
更新建议日志示例:
{
"insertId": "ehz6w9d304v4zttg",
"jsonPayload": {
"state": "SUCCEEDED",
"instance": {
"vm_name": "my-unique-vm-identifier",
"zone": "us-central1-c"
},
"recommendedResources": [
{
"lowerBound": {
"memory": "5Mi",
"cpu": "5m"
},
"containerName": "nginx",
"uncappedTarget": {
"memory": "5Mi",
"cpu": "1m"
},
"upperBound": {
"memory": "5Mi",
"cpu": "5m"
},
"target": {
"memory": "5Mi",
"cpu": "5m"
}
}
],
"operation": "UPDATE_RECOMMENDATION",
"target": {
"name": "my-workload",
"kind": "Deployment",
"apiVersion": "apps/v1"
},
"vpaNamespace": "default",
"vpaName": "my-vpa"
},
"resource": {
"type": "k8s_control_plane_component",
"labels": {
"component_location": "us-central1-c",
"project_id": "my-project",
"cluster_name": "my-cluster",
"location": "us-central1-c",
"component_name": "vpa-controller"
}
},
"timestamp": "2026-01-22T19:28:16.069635605Z",
"severity": "INFO",
"labels": {
"compute.googleapis.com/resource_name": "my-unique-vm-identifier"
},
"logName": "projects/my-project/logs/container.googleapis.com%2Fvpa-controller",
"sourceLocation": {
"file": "vpa_event_logger.go",
"line": "23"
},
"receiveTimestamp": "2026-01-22T19:28:17.750678359Z"
}
逐出 Pod
在 VPA 模式 Auto(已弃用)和 Recreate 下,系统会提供驱逐 Pod 日志。如果 In-place resize 操作失败,VPA 模式 InPlaceOrRecreate 也可能会出现此日志类型。
相应决策日志的 jsonPayload 包含以下字段:
| 字段 | 说明 |
|---|---|
vpaName |
VPA 的名称。 |
vpaNamespace |
VPA 的命名空间。 |
target |
相应 VPA 所定位的工作负载。
|
operation |
正在运行的操作。该值可以是以下各项之一:
|
state |
操作的状态。该值可以是以下各项之一:
|
reason |
原因说明了操作被跳过或失败的原因。 对于操作 |
pod |
Pod 的名称。 |
驱逐 Pod 日志示例:
{
"insertId": "8x278gc4f75oowf4",
"jsonPayload": {
"target": {
"kind": "Deployment",
"apiVersion": "apps/v1",
"name": "my-deployment"
},
"operation": "EVICT_POD",
"vpaName": "my-vpa",
"pod": "my-deployment-856ff7966-gr4rh",
"state": "SUCCEEDED",
"vpaNamespace": "default",
"instance": {
"vm_name": "my-unique-vm-identifier",
"zone": "us-central1-c"
}
},
"resource": {
"type": "k8s_control_plane_component",
"labels": {
"component_name": "vpa-controller",
"cluster_name": "my-cluster",
"component_location": "us-central1-c",
"location": "us-central1-c",
"project_id": "my-project"
}
},
"timestamp": "2026-01-22T19:26:25.283067078Z",
"severity": "INFO",
"labels": {
"compute.googleapis.com/resource_name": "my-unique-vm-identifier"
},
"logName": "projects/my-project/logs/container.googleapis.com%2Fvpa-controller",
"sourceLocation": {
"file": "vpa_event_logger.go",
"line": "23"
},
"receiveTimestamp": "2026-01-22T19:26:27.766941073Z"
}
在逐出时应用建议
在驱逐日志中应用建议的功能适用于 VPA 模式 Auto(已弃用)和 Recreate。如果 In-place resize 失败,VPA 模式 InPlaceOrRecreate 也可能会出现此日志类型。
相应决策日志的 jsonPayload 包含以下字段:
| 字段 | 说明 |
|---|---|
vpaName |
VPA 的名称。 |
vpaNamespace |
VPA 的命名空间。 |
target |
相应 VPA 所定位的工作负载。
|
operation |
正在运行的操作。该值可以是以下各项之一:
|
state |
操作的状态。该值可以是以下各项之一:
|
reason |
原因说明了操作被跳过或失败的原因。 对于操作 |
pod |
Pod 的名称。 |
appliedResources |
应用于 Pod 的资源。
|
confidence |
建议的置信度。当状态为 succeeded 时,此字段存在。该值可以是以下各项之一:
|
驱逐日志中的应用建议示例:
{
"insertId": "366tcmgdkq94eppg",
"jsonPayload": {
"appliedResources": [
{
"containerName": "my-container",
"requests": {
"memory": "15Mi",
"cpu": "15m"
}
}
],
"vpaName": "my-vpa",
"vpaNamespace": "default",
"instance": {
"zone": "us-central1-c",
"vm_name": "my-unique-vm-identifier"
},
"pod": "my-deployment-856ff7966-%",
"state": "SUCCEEDED",
"target": {
"name": "my-deployment",
"kind": "Deployment",
"apiVersion": "apps/v1"
},
"operation": "APPLY_RECOMMENDATION_ON_EVICTION"
},
"resource": {
"type": "k8s_control_plane_component",
"labels": {
"location": "us-central1-c",
"component_location": "us-central1-c",
"cluster_name": "my-cluster",
"component_name": "vpa-controller",
"project_id": "my-project"
}
},
"timestamp": "2026-01-22T19:26:25.344313199Z",
"severity": "INFO",
"labels": {
"compute.googleapis.com/resource_name": "my-unique-vm-identifier"
},
"logName": "projects/my-project/logs/container.googleapis.com%2Fvpa-controller",
"sourceLocation": {
"file": "vpa_event_logger.go",
"line": "23"
},
"receiveTimestamp": "2026-01-22T19:26:32.744122156Z"
}
就地应用建议
当 VPA 模式为 InPlaceOrRecreate 时,系统会提供“就地应用建议”日志。
相应决策日志的 jsonPayload 包含以下字段:
| 字段 | 说明 |
|---|---|
vpaName |
VPA 的名称。 |
vpaNamespace |
VPA 的命名空间。 |
target |
相应 VPA 所定位的工作负载。
|
operation |
正在运行的操作。该值可以是以下各项之一:
|
state |
操作的状态。该值可以是以下各项之一:
|
reason |
原因说明了操作被跳过或失败的原因。 对于操作 |
pod |
Pod 的名称。 |
appliedResources |
应用于 Pod 的资源。
|
confidence |
建议的置信度。当状态为 succeeded 时,此字段存在。该值可以是以下各项之一:
|
就地应用建议日志示例:
{
"insertId": "suzfuepgyiwap7hb",
"jsonPayload": {
"pod": "my-deployment-cdc7fd7b4-grxlk",
"vpaNamespace": "default",
"state": "SUCCEEDED",
"target": {
"name": "my-deployment",
"apiVersion": "apps/v1",
"kind": "Deployment"
},
"operation": "APPLY_RECOMMENDATION_IN_PLACE",
"appliedResources": [
{
"containerName": "my-container",
"limits": {
"cpu": "10m",
"memory": "10Mi"
},
"requests": {
"cpu": "5m",
"memory": "5Mi"
}
}
],
"instance": {
"zone": "us-central1-c",
"vm_name": "my-unique-vm-identifier"
},
"vpaName": "my-vpa"
},
"resource": {
"type": "k8s_control_plane_component",
"labels": {
"project_id": "my-project",
"component_location": "us-central1-c",
"cluster_name": "my-cluster",
"location": "us-central1-c",
"component_name": "vpa-controller"
}
},
"timestamp": "2026-01-22T19:26:25.214095375Z",
"severity": "INFO",
"labels": {
"compute.googleapis.com/resource_name": "my-unique-vm-identifier"
},
"logName": "projects/my-project/logs/container.googleapis.com%2Fvpa-controller",
"sourceLocation": {
"file": "vpa_event_logger.go",
"line": "23"
},
"receiveTimestamp": "2026-01-22T19:26:27.766941073Z"
}
问题排查
本部分介绍了与 Pod 纵向自动扩缩器事件相关的问题和解决步骤。
没有事件
如果您没有看到任何 Pod 纵向自动扩缩器决策事件,请确保您已完成以下所有操作:
- 您已为集群启用 Cloud Logging。
- 您已为集群启用
KCP_VPA日志。 - 您已至少将一个正确配置的
vpa对象部署到集群。
如需查看 vpa 对象配置,请运行以下命令:
kubectl describe vpa $VPA_NAME
如果您仍然没有看到任何 KCP_VPA 日志,请与Google Cloud 支持团队联系。
后续步骤
- 查看 GKE 日志简介。
- 了解 GKE 日志。
- 了解如何使用查询示例查找特定 GKE 日志。
- 详细了解 Pod 纵向自动扩缩。