本页面介绍了 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
) -
访问日志并使用 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 字段包含以下子字段:
|
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 会指示 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 规范中的 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 自动扩缩。