Kubernetes v1.36 [alpha](默认禁用)Kubernetes 组件除了传统的直方图格式外,还可以以 Prometheus 原生直方图格式公开直方图指标。原生直方图使用指数桶边界代替固定边界,从而提供了显著的存储效率、改进的查询性能以及对分布更细粒度的可见性。
要使用原生直方图,你需要
NativeHistograms 特性门控。传统的 Prometheus 直方图使用固定桶边界(例如,[0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10] 秒)。每个桶都会创建一个单独的时间序列(_bucket、_count、_sum),这可能导致
le="0.005" 桶中。原生直方图通过使用能够自动适应数据分布的指数桶边界解决了这些限制。其优点包括
当 NativeHistograms 特性门控启用时,Kubernetes 组件会同时以传统格式和原生格式公开直方图指标(双重导出)。返回的格式取决于 HTTP 请求中的 Accept 头部(Prometheus 内容协商)。Prometheus 会根据你的抓取配置自动设置此头部;仅在直接查询 /metrics 端点时才需要注意这一点。
文本格式(Accept: text/plain,OpenMetrics 1.0):仅返回传统直方图桶。与所有现有工具向后兼容。
# Classic histogram buckets (always present)
apiserver_request_duration_seconds_bucket{le="0.005"} 1000
apiserver_request_duration_seconds_bucket{le="0.01"} 2000
...
apiserver_request_duration_seconds_bucket{le="+Inf"} 10000
apiserver_request_duration_seconds_count 10000
apiserver_request_duration_seconds_sum 450.5
Protobuf 格式(Accept: application/vnd.google.protobuf):同时包含传统桶和原生直方图数据。当在Prometheus 抓取配置中为相应的抓取作业设置了 scrape_native_histograms: true 时,Prometheus 会自动请求此格式。
这种双重导出策略确保了
启用原生直方图是一个两步过程:在 Kubernetes 组件上启用特性门控,并配置 Prometheus 以抓取原生直方图。
在希望公开原生直方图的 Kubernetes 组件上启用 NativeHistograms 特性门控
--feature-gates=NativeHistograms=true
此特性门控适用于以下组件
每个组件的指标都是独立的;你可以针对每个组件启用或禁用该特性门控。
Prometheus 的配置取决于你的 Prometheus 版本。
| Prometheus 版本 | 原生直方图支持 | 配置 | 备注 |
|---|---|---|---|
| < 2.40 | 无 | 不适用 | 仅传统直方图。启用 Kubernetes 特性门控没有效果。 |
| 2.40 – 2.x | 实验性 | --enable-feature=native-histograms (全局) | 全有或全无;无按作业控制。 |
| 3.0 – 3.7 | 稳定 (Stable) | 按作业配置 scrape_native_histograms 和 always_scrape_classic_histograms | 推荐使用按作业配置。仍然支持全局标志。 |
| 3.8 | 稳定 (Stable) | 按作业配置(细粒度控制所必需) | 全局标志仅更改所有作业的默认值。 |
| 3.9+ | 稳定 (Stable) | 仅按作业配置 scrape_native_histograms | 全局标志已移除。必须使用按作业配置。 |
对于 Prometheus 3.x,请使用按作业配置以获得细粒度控制
scrape_configs:
- job_name: 'kubernetes-apiservers'
scrape_native_histograms: true # Ingest native histograms
always_scrape_classic_histograms: true # Keep classic format during migration
在迁移期间将这两个选项均设置为 true。这允许你在摄取原生直方图的同时,为现有的仪表板保留传统直方图。
scrape_protocols,请确保列表中包含了 PrometheusProto。scrape_native_histograms: true 但 always_scrape_classic_histograms: false(默认值),Prometheus 将仅摄取原生直方图。使用传统直方图查询(例如 histogram_quantile(..._bucket...))的现有仪表板将显示无数据。在迁移期间,请务必设置 always_scrape_classic_histograms: true。从传统直方图查询迁移到原生直方图查询时,请遵循以下工作流程
同时启用两种格式:在你的 Prometheus 抓取配置中设置 scrape_native_histograms: true 和 always_scrape_classic_histograms: true。
迁移查询:将仪表板查询和告警表达式从传统直方图函数更新为原生直方图等效函数。
传统查询
histogram_quantile(0.99, rate(apiserver_request_duration_seconds_bucket[5m]))
原生直方图查询
histogram_quantile(0.99, rate(apiserver_request_duration_seconds[5m]))
在预生产环境验证:在推送到生产环境之前,使用原生直方图查询测试所有仪表板和告警。
禁用传统抓取:一旦迁移完成并经过验证,设置 always_scrape_classic_histograms: false 以减少存储开销。
你可以随时使用以下两种方法之一禁用原生直方图
Prometheus 侧(最快,无需重启 Kubernetes;仅限 Prometheus 3.x):按抓取作业设置 scrape_native_histograms: false。Prometheus 将在下一个抓取间隔恢复抓取传统格式。
Kubernetes 特性门控:使用 --feature-gates=NativeHistograms=false 重启组件。重启后仅公开传统直方图格式。
当禁用原生直方图时,指标端点将仅恢复为传统直方图格式。Prometheus 中的历史原生直方图数据仍然可以查询。
启用原生直方图后仪表板显示无数据:这发生在 Prometheus 配置了 scrape_native_histograms: true 但 always_scrape_classic_histograms: false(默认值),且你的仪表板仍使用传统直方图查询(例如 histogram_quantile(..._bucket...))时。
修复:设置 always_scrape_classic_histograms: true 以在迁移仪表板的同时恢复对传统格式的摄取。
启用原生直方图后内存使用量增加:原生直方图桶的存储会导致内存略微增加,每个直方图最多限制为 160 个桶。请监控 process_resident_memory_bytes 是否有意外的增加。
修复:如果内存压力严重,请禁用 Prometheus 中的原生直方图摄取(scrape_native_histograms: false)或禁用 Kubernetes 特性门控。
Prometheus 记录关于未知指标格式的错误:你的 Prometheus 版本太旧,无法理解原生直方图。
修复:将 Prometheus 升级到 2.40+ 或在 Kubernetes 中禁用原生直方图。
不确定是否正在公开原生直方图:通过在 Prometheus 中查询 kubernetes_feature_enabled{name="NativeHistograms"} 来检查特性门控状态。值为 1 表示该特性已启用。你也可以使用 protobuf 格式直接查询指标端点
curl -H "Accept: application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited" \
https://<component-address>/metrics
响应应包含直方图指标的原生直方图编码。