收集 Pod 纵向自动扩缩器事件日志

本页面介绍了 Google Kubernetes Engine (GKE) 中的垂直 Pod 自动扩缩器发出的决策事件。通过分析这些事件,您可以深入了解 Pod 纵向自动伸缩器控制器如何管理工作负载伸缩,并了解其操作背后的决策过程。

Pod 纵向自动扩缩器会发出决策事件,这些事件作为日志条目存储在 Cloud Logging 中。

准备工作

请务必满足以下前提条件:

选择或创建项目

您可以使用现有项目,也可以为本教程创建一个新项目。

  1. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. 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) 获得此权限。了解如何授予角色

启用 API

设置 Cloud Shell

在本教程中,您将使用 Cloud Shell 运行 gcloudkubectl 命令。Cloud Shell 是一种 shell 环境,用于管理在 Google Cloud上托管的资源。它预安装有 Google Cloud CLIkubectl 命令行工具。

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

激活 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 决策日志,请执行以下操作:

  1. 查看集群的现有配置。如果集群已配置特定的日志记录组件,请决定是要添加到现有日志记录配置还是覆盖现有日志记录配置。

  2. 如需启用垂直 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)'

替换以下内容:

在集群上启用 KCP_VPA 决策日志后,输出类似于以下内容:

SYSTEM_COMPONENTS,APISERVER,CONTROLLER_MANAGER,SCHEDULER,KCP_VPA

在 Logs Explorer 中查看 Pod 纵向自动扩缩器的日志

您可以在 Logs Explorer 中监控 Pod 纵向自动扩缩器的行为。如需查看 Pod 纵向自动扩缩器日志,请完成以下步骤:

  1. 前往“日志浏览器”页面:

    转到日志浏览器

  2. 选择所有日志名称,然后在日志名称中搜索 vpa-controller

    日志浏览器会显示所有 Pod 纵向自动扩缩器日志,包括项目中已启用 Pod 纵向自动扩缩器日志的所有集群的日志。

  3. 您可以使用集群名称或工作负载名称过滤日志。例如,如需列出集群中特定工作负载的事件,请使用以下查询指定集群名称和工作负载名称:

    resource.labels.cluster_name="CLUSTER_NAME" AND
    jsonPayload.target.name="WORKLOAD_NAME"
    

    替换以下内容:

    • CLUSTER_NAME:集群的名称。
    • WORKLOAD_NAME:工作负载的名称。

停用 Pod 纵向自动扩缩决策日志

  1. 如需在现有集群上停用 KCP_VPA 决策日志,请运行以下命令:

    gcloud container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --project=PROJECT_ID \
        --logging=SYSTEM
    
  2. 验证 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
  • 更新建议
  • 逐出 Pod
  • 在逐出时应用建议
InPlaceOrRecreate
  • 更新建议
  • 就地应用建议
  • 驱逐 Pod(当 In-place 调整大小失败时,可能会出现这种类型的日志)
  • 在逐出时应用建议(当 In-place 调整大小失败时,可能会出现此类日志)

对于模式为 InPlaceOrRecreate 的 Pod 纵向自动扩缩器,当 In-place resize 失败时,自动扩缩器的行为与 Recreate 模式相同。

更新建议

以下 Pod 纵向自动扩缩器模式可以生成更新建议日志:Auto(已弃用)、RecreateInPlaceOrRecreate

相应决策日志的 jsonPayload 包含以下字段:

字段 说明
vpaName VPA 的名称。
vpaNamespace VPA 的命名空间。
target 相应 VPA 所定位的工作负载。
  • name:工作负载的名称。
  • kind:工作负载的类型。
  • apiVersion:工作负载的 API 版本。
operation 正在运行的操作。该值可以是以下各项之一:
  • UPDATE_RECOMMENDATION
  • EVICT_POD
  • APPLY_RECOMMENDATION_IN_PLACE
  • APPLY_RECOMMENDATION_ON_EVICTION
state 操作的状态。该值可以是以下各项之一:
  • SUCCEEDED
  • SKIPPED
  • FAILED
reason

原因说明了操作被跳过或失败的原因。

对于操作 APPLY_RECOMMENDATION_IN_PLACEAPPLY_RECOMMENDATION_ON_EVICTION 的成功情况,它明确指出,由于应用了修改(例如设置了上限或自动驾驶资源比率),所应用的建议可能与操作 UPDATE_RECOMMENDATION 中的原始建议不同。

recommendedResources 原始建议。这与 VPA 对象中的 Status.Recommendation 字段完全相同。
  • containerName:相应建议所针对的容器的名称。
  • target:可能应用的实际建议。
  • lowerBound:建议的下限。
  • upperBound:建议的上限。
  • uncappedTarget:在受下限或上限限制之前的建议值。
confidence 建议的置信度。当状态为 succeeded 时,此字段存在。该值可以是以下各项之一:
  • LOW:VPA 处理的指标样本数量少于 10 个。
  • HIGH:VPA 已处理 10 个或更多指标样本。

更新建议日志示例:

{
 "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 所定位的工作负载。
  • name:工作负载的名称。
  • kind:工作负载的类型。
  • apiVersion:工作负载的 API 版本。
operation 正在运行的操作。该值可以是以下各项之一:
  • UPDATE_RECOMMENDATION
  • EVICT_POD
  • APPLY_RECOMMENDATION_IN_PLACE
  • APPLY_RECOMMENDATION_ON_EVICTION
state 操作的状态。该值可以是以下各项之一:
  • SUCCEEDED
  • SKIPPED
  • FAILED
reason

原因说明了操作被跳过或失败的原因。

对于操作 APPLY_RECOMMENDATION_IN_PLACEAPPLY_RECOMMENDATION_ON_EVICTION 的成功情况,该原因说明了所应用的建议可能与操作 UPDATE_RECOMMENDATION 中的原始建议不同,这是因为应用了修改(例如设置了上限或自动驾驶资源比率)。

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 所定位的工作负载。
  • name:工作负载的名称。
  • kind:工作负载的类型。
  • apiVersion:工作负载的 API 版本。
operation 正在运行的操作。该值可以是以下各项之一:
  • UPDATE_RECOMMENDATION
  • EVICT_POD
  • APPLY_RECOMMENDATION_IN_PLACE
  • APPLY_RECOMMENDATION_ON_EVICTION
state 操作的状态。该值可以是以下各项之一:
  • SUCCEEDED
  • SKIPPED
  • FAILED
reason

原因说明了操作被跳过或失败的原因。

对于操作 APPLY_RECOMMENDATION_IN_PLACEAPPLY_RECOMMENDATION_ON_EVICTION 的成功情况,它明确指出,由于应用了修改(例如设置了上限或自动驾驶资源比率),所应用的建议可能与操作 UPDATE_RECOMMENDATION 中的原始建议不同。

pod Pod 的名称。
appliedResources 应用于 Pod 的资源。
  • containerName:容器的名称。
  • requests:已应用的资源请求。
    • cpu:应用的 CPU。
    • memory:应用的内存。
  • limits:应用的资源限制。
    • cpu:应用的 CPU。
    • memory:应用的内存。
confidence 建议的置信度。当状态为 succeeded 时,此字段存在。该值可以是以下各项之一:
  • LOW:VPA 处理的指标样本数量少于 10 个。
  • HIGH:VPA 已处理 10 个或更多指标样本。

驱逐日志中的应用建议示例:

{
 "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 所定位的工作负载。
  • name:工作负载的名称。
  • kind:工作负载的类型。
  • apiVersion:工作负载的 API 版本。
operation 正在运行的操作。该值可以是以下各项之一:
  • UPDATE_RECOMMENDATION
  • EVICT_POD
  • APPLY_RECOMMENDATION_IN_PLACE
  • APPLY_RECOMMENDATION_ON_EVICTION
state 操作的状态。该值可以是以下各项之一:
  • SUCCEEDED
  • SKIPPED
  • FAILED
reason

原因说明了操作被跳过或失败的原因。

对于操作 APPLY_RECOMMENDATION_IN_PLACEAPPLY_RECOMMENDATION_ON_EVICTION 的成功情况,该原因说明了所应用的建议可能与操作 UPDATE_RECOMMENDATION 中的原始建议不同,这是因为应用了修改(例如设置了上限或自动驾驶资源比率)。

pod Pod 的名称。
appliedResources 应用于 Pod 的资源。
  • containerName:容器的名称。
  • requests:已应用的资源请求。
    • cpu:应用的 CPU。
    • memory:应用的内存。
  • limits:应用的资源限制。
    • cpu:应用的 CPU。
    • memory:应用的内存。
confidence 建议的置信度。当状态为 succeeded 时,此字段存在。该值可以是以下各项之一:
  • LOW:VPA 处理的指标样本数量少于 10 个。
  • HIGH:VPA 已处理 10 个或更多指标样本。

就地应用建议日志示例:

{
 "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 支持团队联系。

后续步骤