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

后续步骤