收集 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.31.5-gke.1090000 版或更高版本,或者运行 1.32.1-gke.1260000 版或更高版本。
  • 在 GKE 集群中启用 Cloud Logging。您需要按 Cloud Logging 价格付费。
  • 确保您拥有要监控的Pod 横向自动扩缩器。确保 Pod 横向自动扩缩器字段不包含敏感数据。

费用

启用 Cloud Logging 并收集 Horizontal Pod Autoscaler 决策日志时,需支付 Cloud Logging 费用

启用 Pod 横向自动扩缩器决策事件

如需创建启用 KCP_HPA 决策日志的新集群,请运行以下命令:

gcloud container clusters create CLUSTER_NAME \
    --location=LOCATION \
    --project=PROJECT_ID \
    --logging=SYSTEM,KCP_HPA

如需在现有集群上启用 KCP_HPA 决策日志,请运行以下命令:

gcloud container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --project=PROJECT_ID \
    --logging=SYSTEM,KCP_HPA

替换以下内容:

  • CLUSTER_NAME:要创建或更新的集群的名称。
  • PROJECT_ID:您的 Google Cloud 项目 ID。
  • LOCATION:集群的计算区域或可用区

这些命令会启用由 KCP_HPA 生成的日志的导出功能,并将这些日志保存在 Cloud Logging 中的目标位置 logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fhpa-controller"

检索集群更新后的日志记录配置,并查看日志列表,以确保已启用 KCP_HPA 日志:

gcloud container clusters describe CLUSTER_NAME \
    --location=LOCATION \
    --flatten=loggingConfig \
    --format='csv[delimiter=",",no-heading](componentConfig.enableComponents)'

输出类似于以下内容:

SYSTEM_COMPONENTS,APISERVER,CONTROLLER_MANAGER,SCHEDULER,KCP_HPA

在 Google Cloud 控制台中查看 Pod 横向自动扩缩器日志

您可以在Google Cloud 控制台中监控 Pod 横向自动扩缩器的行为。此视图提供了一种便捷的方式来查看 Cloud Logging 中提供的相同原子建议日志和最终建议日志,而无需离开工作负载的上下文。

如需在 Google Cloud 控制台中查看 pod 横向自动扩缩器日志,请完成以下步骤:

  1. 在 Google Cloud 控制台中,前往工作负载页面:

    转到“工作负载”

  2. 选择由 Pod 横向自动扩缩器管理的工作负载。

  3. 点击缩放标签页。

在此标签页上,您可以找到与伸缩相关的各种信息,包括资源使用情况、效率数据和日志。此标签页中的数据可帮助您确定最有效的工作负载自动扩缩配置。 在“日志”部分,您可以找到与“日志”中相同的信息,并按类型(包括“事件”“最终建议”和“原子建议”)过滤这些日志。如需详细了解各种日志,请参阅日志类型

停用 Pod 横向自动扩缩器决策事件

更新集群,以从 --logging 标志中移除 KCP_HPA 组件:

gcloud container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --project=PROJECT_ID \
    --logging=SYSTEM

替换以下内容:

  • CLUSTER_NAME:要创建或更新的集群的名称。
  • PROJECT_ID:您的 Google Cloud 项目 ID。
  • LOCATION:集群的计算区域或可用区

此命令会停用由 KCP_HPA 生成的日志的导出功能。您无法在 Cloud Logging 中使用 logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fhpa-controller" 过滤条件检索这些日志。

检索集群更新后的日志记录配置,并查看日志列表,以确保 KCP_HPA 日志已停用:

gcloud container clusters describe CLUSTER_NAME \
    --location=LOCATION \
    --flatten=loggingConfig \
    --format='csv[delimiter=",",no-heading](componentConfig.enableComponents)'

输出类似于以下内容:

SYSTEM_COMPONENTS,APISERVER,CONTROLLER_MANAGER,SCHEDULER

日志类型

Pod 横向自动扩缩器的决策事件存储在 Cloud Logging 中的 logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fhpa-controller" 位置,该位置位于与 GKE 集群在同一项目的 _Default 存储桶中。所有记录的事件都采用 JSON 格式,并且可以在日志条目的 jsonPayload 字段中找到。

除了对性能和费用产生的任何影响,还请确保您了解潜在的日志量对存储空间的需求。以下示例说明了 Pod 横向自动扩缩器生成每种决策事件的频率:

  • 原子建议:对于集群中每个 HPA 对象监控的每个指标,Pod 横向自动扩缩器每 15 秒生成一个原子建议事件。例如,如果您的集群中有两个 HPA 对象,并且每个 HPA 对象监控三个指标,则系统会每 15 秒记录六个原子建议

  • 最终建议:Pod 横向自动扩缩器每 15 秒为集群中的每个 HPA 对象生成一个最终建议事件。例如,如果集群中有两个 HPA 对象,则系统会每 15 秒记录两个最终建议

总共使用两个 HPA 对象,每个 HPA 对象监控三个指标KCP_HPA 日志会每 15 秒总共收到八个决策事件条目

原子建议

原子建议日志会根据在 Pod 横向自动扩缩器中指定的单个指标来描述建议。

原子日志包含以下字段:

字段 说明
start_time 表示 HPA 开始计算建议的时间。
hpa 与建议关联的 HPA 对象的名称。
pod_count 表示在提出建议时与 HPA 关联的 Pod 总数。此数量还包括已就绪、未就绪和已忽略的 Pod。
metric 提供有关用于建议的指标的规范和状态的信息。metric 字段包含以下子字段:
  • indexSpec metrics 数组中相应指标的索引。
  • type:具有来自 MetricSourceType 的值(例如 Resource、External)的指标类型。
  • spec:指标的名称以及针对该指标设置的目标。
  • status:与可伸缩性和扩缩限制相关的状态条件
  • newest_sample_time:最新指标样本的时间戳。
  • newest_sample_age_seconds:自建议计算开始以来最近样本的存在时间(以秒为单位)。负值表示指标样本时间早于计算开始时间。
summary 摘要字段包含有关建议结果的信息,包括建议的副本数量。如果无法提出建议,系统会显示一条错误消息。summary 字段包含以下子字段:
  • dampening:HPA 会对建议应用抑制及其方向,以尝试降低潜在扩缩幅度。抑制的情况可能如下:
    • up:向上抑制方向意味着 HPA 假定缺少指标的 Pod 对指标的使用率为 100%。
    • down:向下抑制方向意味着 HPA 假定缺少指标的 Pod 或未就绪的 Pod 对指标的使用率为 0%。
    • none:不应用抑制。
  • override:该字段为 HPA 提出的建议未被应用时提供原因的消息(例如,由于容差);如果未发生替换,则为 none
  • result:建议的结果。它会提出建议的副本数量,或者在无法计算建议时显示错误消息。

原子建议日志示例:

{
  "insertId": "xiu4bty9k5b279wu",
  "jsonPayload": {
    "instance": {
      "vm_name": "my-unique-vm-identifier",
      "zone": "us-central1-a"
    },
    "atomicRecommendation": {
      "startTime": "2025-02-06T20:07:00.573419526Z",
      "hpa": "gke-managed-cim/kube-state-metrics",
      "metric": {
        "newestSampleAgeSeconds": -39.573419526,
        "status": {
          "averageValue": "25849856"
        },
        "newestSampleTime": "2025-02-06T20:06:21Z",
        "type": "Resource",
        "spec": {
          "target": {
            "averageValue": "400Mi"
          },
          "name": "memory"
        }
      },
      "podCount": {
        "ready": 1,
        "total": 1
      },
      "summary": {
        "override": "none",
        "replicas": 1,
        "dampening": "none"
      }
    }
  },
  "resource": {
    "type": "k8s_control_plane_component",
    "labels": {
      "project_id": "my-project-id",
      "cluster_name": "my-cluster",
      "location": "us-central1-a",
      "component_location": "us-central1-a",
      "component_name": "hpa-controller"
    }
  },
  "timestamp": "2025-02-06T20:07:00.593777835Z",
  "severity": "INFO",
  "labels": {
    "compute.googleapis.com/resource_name": "my-unique-vm-identifier"
  },
  "logName": "projects/my-project-id/logs/container.googleapis.com%2Fhpa-controller",
  "sourceLocation": {
    "file": "event_logger.go",
    "line": "61"
  },
  "receiveTimestamp": "2025-02-06T20:07:05.284753647Z"
}

最终建议

最终建议日志说明了 Pod 横向自动扩缩器提出的综合建议。Pod 横向自动扩缩器会合并来自不同指标的所有原子建议,以创建最终建议并执行最终建议。执行意味着 HPA 会指示 Deployment 调整副本数以匹配建议的值。如果最终建议的 Pod 数量与正在运行的 Pod 数量不同,则 Pod 横向自动扩缩器会触发扩容或缩容事件,以相应地调整 Deployment。

最终建议日志包含以下字段:

字段 说明
start_time 表示 HPA 开始计算建议的时间。
hpa 与建议关联的 HPA 对象的名称。
target_ref 表示与建议关联的 HPA ScaleTargetRef 对象。
configured_size 在 HPA 计算并应用此建议之前记录的最后一个副本数量。
top_level_override 如果 HPA 提出的建议未被应用,则会提供原因(例如,由于容差);如果未发生替换,则为 none
top_level_limit 如果需要调整 HPA 提出的建议,则提供原因(例如,由于 HPA 规范中 MinReplicasMaxReplicas 字段定义的副本数量)。
leading_metric_index Spec metrics 数组中的前导指标索引是指其关联的原子建议用作最终建议的指标。
normalization 提供稳定性和限制摘要(如果存在),如下所示:

stabilization:描述稳定状态(如果已应用)。稳定性用于在扩缩使用的指标不断变动时限制副本数量的波动。stabilization 字段包含以下子字段:

  • replicas:稳定后的副本数量。
  • reason:应用的稳定类型,即 scaleUpscaleDown
  • stabilization_window:关联的稳定时间段(以秒为单位)。
  • replicas_before_stabilization:稳定前的建议副本数量。

limitation:描述如何处理扩缩限制(如果已应用)。此行为会根据设定的限制修改 HPA 提出的建议。limitation 字段包含以下子字段:

  • replicas:限制后的副本数量。
  • reason:扩缩超出副本数下限或上限的原因。
  • scaling_policy:应用的扩缩政策
  • selectPolicy:指定在按特定方向扩缩时如何选择政策。MaxChange 对应于 MaxChangePolicySelectMinChange 对应于 MinChangePolicySelect。如果停用了扩缩,则不会显示 selectPolicy 字段。
  • replicas_before_limitation:限制前的建议副本数。
replicas 建议的副本数量。
actuation_error 与失败关联的错误消息(如果执行失败)。
actuation_time 执行成功时的时间戳。
actuation_latency_seconds 从建议计算开始到执行成功所经过的时间(以秒为单位)。

最终建议日志示例:

{
  "insertId": "qzyv7alfv1sm19ns",
  "jsonPayload": {
    "finalRecommendation": {
      "actuationTime": "2025-02-06T20:06:57.487786873Z",
      "targetRef": {
        "name": "kube-state-metrics",
        "kind": "StatefulSet",
        "apiVersion": "apps/v1"
      },
      "topLevelLimit": "none",
      "hpa": "gke-managed-cim/kube-state-metrics",
      "topLevelOverride": "noRecommendation",
      "replicas": 1,
      "configuredSize": 1,
      "actuationLatencySeconds": 0.003722451,
      "startTime": "2025-02-06T20:06:57.484064422Z"
    },
    "instance": {
      "vm_name": "my-unique-vm-identifier",
      "zone": "us-central1-a"
    }
  },
  "resource": {
    "type": "k8s_control_plane_component",
    "labels": {
      "cluster_name": "my-cluster",
      "component_location": "us-central1-a",
      "component_name": "hpa-controller",
      "location": "us-central1-a",
      "project_id": "my-project-id"
    }
  },
  "timestamp": "2025-02-06T20:06:57.488193527Z",
  "severity": "INFO",
  "labels": {
    "compute.googleapis.com/resource_name": "my-unique-vm-identifier"
  },
  "logName": "projects/my-project-id/logs/container.googleapis.com%2Fhpa-controller",
  "sourceLocation": {
    "file": "event_logger.go",
    "line": "61"
  },
  "receiveTimestamp": "2025-02-06T20:06:57.844898727Z"
}

问题排查

本部分介绍了与 Pod 横向自动扩缩器事件相关的问题和解决步骤。

没有事件

如果您没有看到任何 Pod 横向自动扩缩器决策事件,请确保您已完成以下所有操作:

  • 您已为集群启用 Cloud Logging。
  • 您已为集群启用 KCP_HPA 日志。
  • 您已至少将一个正确配置的 hpa 对象部署到集群。

如需查看 hpa 对象配置,请运行以下命令:

  kubectl describe hpa $HPA_NAME

如果您仍然没有看到任何 KCP_HPA 日志,请与Google Cloud 支持团队联系。

后续步骤