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

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

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

准备工作

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

选择或创建项目

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

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud新手,请 创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 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

  3. Verify that billing is enabled for your Google Cloud project.

  4. 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

  5. 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 支持团队联系。

后续步骤