本页介绍了 Google Kubernetes Engine (GKE) 中 Pod 横向自动扩缩器发出的决策事件。通过分析这些事件,您可以深入了解 Pod 横向自动扩缩程序控制器如何管理工作负载扩缩,以及了解其操作背后的决策过程。
Pod 横向自动扩缩器会发出决策事件,这些事件会存储为 Cloud Logging 中的日志条目。
准备工作
请务必满足以下前提条件:
选择或创建项目
您可以使用现有项目,也可以为本教程创建一个新项目。
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
启用 API
Enable the GKE, and Cloud Logging APIs.
设置 Cloud Shell
在本教程中,您将使用 Cloud Shell 运行 gcloud
和 kubectl
命令。Cloud Shell 是一种 shell 环境,用于管理在 Google Cloud上托管的资源。它预安装有 Google Cloud CLI 和 kubectl 命令行工具。
In the Google Cloud console, 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 字段包含以下子字段:
|
summary |
摘要字段包含与建议结果相关的信息,包括建议的副本数量。如果无法提出建议,系统会显示一条错误消息。summary 字段包含以下子字段:
|
原子建议日志示例:
{
"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 规范中的 MinReplicas 或 MaxReplicas 字段定义的副本数量)。 |
leading_metric_index |
Spec metrics 数组中的首个指标索引是指其关联的原子推荐被用作最终推荐的指标。 |
normalization |
提供稳定性和限制摘要(如果有),如下所示:
|
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 支持团队联系。
后续步骤
- 请参阅 GKE 日志简介。
- 了解 GKE 日志。
- 了解如何使用示例查询查找特定 GKE 日志。
- 了解如何根据指标优化 Pod 自动扩缩。