Kubernetes v1.37:原生直方图升级为 Beta
内容提要
Kubernetes v1.37 将原生直方图指标支持升级为 Beta 并默认启用。它采用 Prometheus 原生直方图,以动态指数分桶替代静态桶,实现高精度、低基数的延迟观测,并降低存储与抓取开销。组件通过双暴露兼容旧监控栈,Prometheus 需配置抓取原生直方图,同时保留经典直方图以便平滑迁移。
延伸解读
原生直方图如何提升观测精度
传统经典直方图依赖预先定义的静态桶边界,如0.005、0.01、0.025等,这会导致分位数计算时出现插值误差。原生直方图采用动态指数分桶,以单个时间序列存储正负跨度、零阈值和指数缩放因子,无需为每个桶边界单独生成时间序列。因此,Kubernetes组件暴露的延迟指标能在不增加基数的情况下获得更高分辨率,同时降低存储和抓取开销。
双暴露机制保障平滑迁移
Kubernetes v1.37默认启用NativeHistograms特性门控,但组件采用双暴露方式,同时输出原生直方图和经典直方图。这意味着现有监控栈不会立即中断。不过,Prometheus抓取原生直方图需要显式配置,例如在scrape_configs中设置scrape_native_histograms: true。迁移期间务必设置always_scrape_classic_histograms: true,否则Prometheus将只摄入原生格式,导致依赖_bucket、_count、_sum的旧仪表盘和告
Prometheus版本与配置差异
不同Prometheus版本对原生直方图的支持方式不同。Prometheus 3.0及以上推荐在scrape_configs中按任务显式启用,全局--enable-feature=native-histograms标志在3.9+已弃用。Prometheus 2.40至2.x则需通过启动参数全局启用,且该设置对所有抓取目标生效,属于全有或全无。此外,标准文本格式仅传输经典桶,启用scrape_native_histograms后Prometheus会自动与Kubernetes端点协商Protobuf格式。
查询方式与迁移步骤
原生直方图在PromQL中可直接对指标名使用histogram_quantile等函数,无需_bucket后缀或按le分组。例如计算P99延迟时,经典方式需rate(apiserver_request_duration_seconds_bucket[5m])并sum by (le),而原生方式只需rate(apiserver_request_duration_seconds[5m])。建议迁移分四步:先启用抓取原生直方图并保留经典直方图,再逐步将仪表盘和告警切换到原生查询,最后在确认无依赖后关闭经典直方图抓取。
Q&A
Kubernetes v1.37 中原生直方图功能处于什么阶段?
原生直方图支持已升级为 Beta,并在 Kubernetes v1.37 中默认启用。
原生直方图相比经典直方图有哪些优势?
原生直方图使用动态指数分桶替代静态桶,提供更高精度、更低基数的延迟观测,并显著降低遥测存储和抓取开销。
Kubernetes 中哪些组件支持原生直方图?
所有主要控制平面和节点组件都自动继承支持,包括 kube-apiserver、kube-scheduler、kubelet、kube-controller-manager 和 kube-proxy。
如何配置 Prometheus 3.0+ 来抓取原生直方图?
在 scrape_configs 中为每个 job 设置 scrape_native_histograms: true,并建议同时设置 always_scrape_classic_histograms: true 以在过渡期间保留经典直方图。
迁移到原生直方图时,如何确保现有仪表板和告警继续工作?
在过渡期间设置 always_scrape_classic_histograms: true,这样 Prometheus 会同时抓取原生和经典直方图,现有基于 _bucket 的查询和告警不受影响。
使用原生直方图后,PromQL 查询有什么变化?
查询时不再需要静态 le 桶标签或 _bucket 后缀,可以直接对指标名称使用 histogram_quantile 等函数,聚合时也无需按 le 分组。