查看 Pod 横向自动扩缩器事件


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

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

准备工作

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

选择或创建项目

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

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure 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.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

启用 API

Enable the GKE, and Cloud Logging APIs.

Enable the APIs

设置 Cloud Shell

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

In the Google Cloud console, activate Cloud Shell.

Activate 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 和 Log Analytics:Logs Viewer (roles/logging.viewer)

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

要求

  • 您的 GKE 集群必须运行 1.31.5-gke.1090000 版或更高版本,或者运行 1.32.1-gke.1260000 版或更高版本。
  • 在 GKE 集群中启用 Cloud Logging。您需要按 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

停用 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 支持团队联系。

后续步骤