Kubernetes v1.37 原生直方图进入 Beta 后如何核对监控兼容性
来源:17golang原创
时间:2026-09-14 10:12:13 298浏览 收藏
如果 Kubernetes v1.37 升级后监控团队担心“原生直方图会不会让旧面板失效”,先记住结论:NativeHistograms 在 v1.37 已进入 Beta 并默认开启,但 Kubernetes 会继续提供经典直方图;真正决定是否采到原生格式的是 Prometheus 版本和 scrape 配置。迁移期不要直接关闭经典数据,先让两种格式并存。
官方地址:https://kubernetes.io/
- Kubernetes v1.37 默认打开原生直方图,覆盖 apiserver、scheduler、kubelet 等组件的指标子系统。
- Prometheus 3.x 应按 job 设置
scrape_native_histograms: true,同时保留always_scrape_classic_histograms: true。 - 旧查询带
_bucket,原生查询直接使用指标名;验证通过后仍可按 job 回退。
这次 Beta 变化到底改变了什么
经典 Prometheus 直方图预先写死多个 le 桶,每个桶都会形成时间序列。原生直方图改用动态指数桶,把分布信息放进一条更紧凑的直方图序列,适合观察 API 延迟这类长尾数据。Kubernetes 官方说明它在 v1.37 进入 Beta,且 NativeHistograms 默认开启;这一变化发生在组件指标子系统,不等于你的 Prometheus 已经开始存储原生数据。
支持的组件包括 kube-apiserver、kube-controller-manager、kube-scheduler、kubelet 和 kube-proxy。如果某个组件显式关闭了 feature gate,它仍只暴露经典格式。

先看 Prometheus 版本,再决定配置写法
兼容性核对的第一项不是改 Kubernetes 参数,而是确认 Prometheus。官方文档给出的边界可以压缩成下面这张表:
| Prometheus | 原生直方图 | 迁移动作 |
|---|---|---|
| 低于 2.40 | 不支持 | 升级或只保留经典格式 |
| 2.40 到 2.x | 实验性,全局开关 | 使用 --enable-feature=native-histograms |
| 3.0 到 3.8 | 稳定,推荐按 job | 同时打开原生与经典抓取 |
| 3.9+ | 稳定,按 job 控制 | 不要再依赖旧的全局开关 |
Prometheus 3.x 的迁移配置可以先这样写。注释保留在配置块里,便于和变更单一起评审:
scrape_configs:
- job_name: kubernetes-apiservers
# 允许 Prometheus 请求并存储原生直方图
scrape_native_histograms: true
# 迁移期间保留 _bucket、_count、_sum,保护旧面板和告警
always_scrape_classic_histograms: true
static_configs:
- targets: ["kube-apiserver.monitoring.svc:443"]
如果自定义了 scrape_protocols,还要确认其中包含 PrometheusProto。原生直方图依赖 Protobuf 协议;直接用普通文本方式访问 /metrics,看到经典桶并不能证明原生数据没有暴露。
用三层证据核对采集是否真的兼容
- 组件层:在 Prometheus 中查询
kubernetes_feature_enabled{name="NativeHistograms"},返回 1 只能说明该组件的 feature gate 已启用。 - 协议层:对测试环境的指标端点请求 Prometheus Protobuf,检查直方图消息是否同时出现 classic bucket 与
schema/positive_span字段。示例只作操作示意,不要把令牌写进脚本:
# 仅在已完成认证的测试环境检查 Protobuf 内容协商 curl -H 'Accept: application/vnd.google.protobuf;proto=io.prometheus.client.MetricFamily;encoding=delimited' \ https:///metrics # 返回内容应交给 Prometheus 解码器或抓取链路检查,不要把二进制响应当文本阅读
- 查询层:在保留经典数据的前提下,对同一时间窗口分别运行两类 P99 查询:
# 经典直方图:必须保留 le 桶标签 histogram_quantile(0.99, sum by (le) (rate(apiserver_request_duration_seconds_bucket[5m]))) # 原生直方图:直接对指标序列聚合,不再写 _bucket 和 le histogram_quantile(0.99, sum(rate(apiserver_request_duration_seconds[5m])))
两条查询的数值不必逐点完全相同,但都应有数据且趋势可解释。若打开原生抓取后旧面板突然空白,优先检查 always_scrape_classic_histograms 是否仍为 true,不要先修改 Grafana 表达式。

面板迁移不要一步切断经典数据
建议把迁移拆成四个小动作:先在一个 scrape job 灰度打开两种格式;再把 P99 等查询从 ..._bucket 改为原生直方图写法;随后在预发布环境检查 Grafana 面板和告警;最后确认没有旧查询依赖,再将 always_scrape_classic_histograms 设为 false,换取更低的存储开销。
回滚也分两层。最快三秒级的动作是在 Prometheus job 上设 scrape_native_histograms: false,不需要重启 Kubernetes;如果组件本身不希望暴露原生格式,再将对应组件的 --feature-gates=NativeHistograms=false 改回去并重启。Beta 的价值是可渐进采用,不是要求所有仪表盘同一天完成改写。
| 检查项 | 通过信号 | 不通过时先做什么 |
|---|---|---|
| 版本 | Prometheus ≥ 2.40 | 先升级采集端 |
| 协议 | 包含 PrometheusProto | 检查自定义协议列表 |
| 旧面板 | _bucket 查询仍有数据 | 打开经典格式保留 |
| 回退 | 单个 job 可关闭原生抓取 | 先验证灰度范围和变更权限 |
常见问题
升级 Kubernetes v1.37 后必须立刻改所有 PromQL 吗?
不必。组件默认双格式暴露,先保留经典抓取即可;等原生查询在预发布验证通过,再按面板和告警逐项迁移。
为什么直接访问 /metrics 只看到了 _bucket?
普通文本协议只展示经典桶。Prometheus 在启用原生抓取时会通过内容协商请求 Protobuf,直接检查时必须带对应的 Accept 头。
Prometheus 低于 2.40 能否只升级 Kubernetes?
不能获得原生直方图存储能力。Kubernetes 仍可暴露经典格式,但采集端需要升级到 2.40 或更高版本,3.x 更适合按 job 渐进迁移。
上线前结论:把“feature gate 已开启”“Prometheus 能请求 PrometheusProto”“旧查询仍有数据”“原生查询已在预发布验证”当作四个独立勾选项。四项都通过后,再考虑关闭经典抓取;任何一项不清楚,都先保持双格式。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
科技周边 · 业界新闻 | 24分钟前 | kubernetes · 故障排查 · job · 业界新闻 · 容器编排 · Kubernetes v1.37 PodFailurePolicy Job FailureTarget Pod失败策略249 收藏
-
科技周边 · 业界新闻 | 20小时前 | 云原生 · kubernetes · Gateway API · 网络迁移 · ingress 路由迁移 Gateway API Ingress2Gateway ingress-nginx335 收藏
-
195 收藏
-
291 收藏
-
科技周边 · 业界新闻 | 1天前 | 云原生 · kubernetes · 版本兼容 · Metrics API · Kubernetes metrics.k8s.io Metrics API v1.37 客户端兼容性161 收藏
-
科技周边 · 业界新闻 | 1天前 | 云原生 · Etcd · 性能优化 · kubernetes · 控制面 · Kubernetes v1.37 etcd RangeStream EtcdRangeStream listStream 大列表内存346 收藏
-
139 收藏
-
488 收藏
-
313 收藏
-
427 收藏
-
380 收藏
-
120 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习