查看 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)
  • 如需访问日志并使用日志浏览器和 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 中,位于与 GKE 集群在同一项目中的 _Default 存储分区中的 logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fhpa-controller" 位置。所有记录的事件都采用 JSON 格式,并且可以在日志条目的 jsonPayload 字段中找到。

除了任何性能或成本影响之外,请务必了解可能的日志卷的存储需求。以下示例说明了 Pod 横向自动扩缩器生成每种类型的决策事件的频率:

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

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

假设有 2 个 HPA 对象,每个对象监控 3 个指标,那么您的 KCP_HPA 日志将每 15 秒收到 总计 8 个决策事件条目。

原子建议

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

原子日志包含以下字段:

字段 说明
start_time 表示 HPA 何时开始计算建议。
hpa 与推荐关联的 HPA 对象的名称。
pod_count 表示在提供建议时与 HPA 关联的 Pod 总数。此数量还包括就绪、未就绪和被忽略的 Pod。
metric 提供有关用于推荐的指标规范和状态的信息。metric 字段包含以下子字段:
  • indexSpec metrics 数组中指标的索引。
  • type:指标类型,值来自 MetricSourceType(例如“资源”“外部”)。
  • 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 会指示部署调整副本数量,以匹配建议的值。如果最终建议的 Pod 数量与正在运行的 Pod 数量不同,横向 Pod 自动扩缩器会触发扩容或缩容事件,以相应地调整部署。

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

字段 说明
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 支持团队联系。

后续步骤