OpenShift 基础设施组件监控插桩最佳实践:healthz / metrics / pprof 端点规范与实现验证
测试云原生质量保障【免费下载链接】originConformance test suite for OpenShift项目地址https://gitcode.com/gh_mirrors/or/origin点击查看免费下载导读本文基于 OpenShift Originopenshift/origin仓库中的官方提案文档 instrumentation-of-services.md系统讲解 OpenShift 集群中所有基础设施组件路由器、API Server、OAuth 服务器、监控组件等必须遵循的服务插桩instrumentation规范如何通过统一的/healthz、/metrics、/healthz/ready与/debug/pprof/*端点暴露存活状态、就绪状态、业务指标与性能画像并给出 Prometheus 指标命名、安全认证与异常豁免的完整要求。读完本文你将掌握为 OpenShift 组件接入健康检查、监控指标与性能剖析的标准接口约定并能在本仓库的 e2e 测试与监控测试源码中找到对应的可验证实现。一、统一端点约定所有 OpenShift 组件必须暴露的接口提案文档首先给出了一个硬性要求所有 OpenShift 组件 MUST 在其公共 HTTPS 端口若无 HTTPS 端口则用公共 HTTP 端口上暴露以下两个端点端点响应约定语义/healthz返回 HTTP 200 与文本ok表示实例进程存活liveness/metrics以 Prometheus 文本格式返回一组合理的指标用于刻画该服务器的健康与性能状态通过 Service 或 Route 暴露的组件MUST 额外暴露以下端点端点响应约定语义/healthz/ready返回 HTTP 200 与文本ok表示实例已就绪可以开始接收网络流量readiness此外还有两条补充规则仅提供 TCP 端点的组件应监听一个独立的端口并在该端口上暴露上述对应的检查端点即把 HTTP 健康检查挂在独立端口上避免与业务 TCP 端口冲突。已有社区等价端点的组件若组件从上游社区原样as-is采用了与上述端点等价的现有端点例如 kube-apiserver 的/readyz则 MAY 直接沿用不必重复实现一套。从本仓库的测试代码可以印证这些约定在真实组件中的落地情况。以集群路由器HAProxy router为例test/extended/router/metrics.go 中的 e2e 测试明确断言路由器必须在 metrics 端口上暴露健康检查测试通过http://host:metricsPort/healthz期望返回 200。测试在BeforeEach中从openshift-ingress命名空间的router-internal-defaultEndpoints 里按端口名metrics提取 metrics 端口号// 从 Endpoints 中按名称提取 metrics 端口 for _, port : range subset.Ports { if port.Name metrics { metricsPort port.Port break } } o.Expect(metricsPort).NotTo(o.BeZero())而test/extended/router/certs.go、test/extended/router/scoped.go、test/extended/router/stress.go等多处 e2e 测试如 certs.go则将Path: /healthz/ready配置为后端 Pod 的 HTTP 就绪探针readinessProbe这正是“通过 Service/Route 暴露的组件必须提供/healthz/ready”这一规则在探针场景中的直接应用。对于“社区等价端点”的例外条款kube-apiserver 是最典型的例子上游 Kubernetes 的 apiserver 提供的是/readyz而非/healthz/ready本仓库的 test/extended/apiserver/health_endpoints.go 即通过readyz?verbosetrue来验证 apiserver 各子检查项的就绪状态并配合 test/extended/apiserver/graceful_termination.go 断言 API 负载均衡器会跟随/readyz停止/恢复向 apiserver 发送请求。二、Metrics 指标为什么选 Prometheus 格式文档明确说明选用 Prometheus 格式的两点理由与上游 Kubernetes 社区保持一致它是 Go 生态系统的天然契合格式Go 官方指标库即输出 Prometheus 文本格式。因此对于不原生提供 Prometheus 端点的 COTS商用现货软件规范要求使用适配器adapter来暴露 Prometheus 指标——适配器既可以打进其进程内也可以作为sidecar 容器伴随运行Java 组件虽然可以使用 JMX但仍然推荐适配到 Prometheus 格式。指标内容度量业务而非进程琐碎文档强调要暴露的指标应代表服务本身的业务度量business measurements并引用了 Prometheus 官方 instrumentation 实践指南如果组件的职责是处理请求就捕获请求的计数count、耗时duration与类型types如果组件内部有队列就报告队列深度queue depth与队列吞吐throughput标签与命名遵循 Prometheus 官方 naming 实践如_total后缀用于计数器、单位嵌入名称等。若指标值或标签包含敏感信息应考虑匿名化anonymizing或归类categorizing若信息本质上是多租户multi-tenant的则继续阅读下文安全一节。Go 程序的落地路径Go 程序应通过现有 Prometheus 客户端库轻松集成例如github.com/prometheus/client_golang/prometheus优先使用现成的 Prometheus exporter只有在特定框架下适配指标成本过高、或无法合入上游时才考虑自行适配。本仓库 e2e 测试对路由器 metrics 端点的断言可以作为“业务度量”的极佳范例test/extended/router/metrics.go 验证了以下指标族路由/后端维度haproxy_backend_connections_total、haproxy_server_http_responses_total带code标签区分 2xx/5xx、haproxy_server_connections_total、haproxy_server_bytes_in_total/haproxy_server_bytes_out_total通用 exporter 指标haproxy_up、haproxy_exporter_scrape_interval、haproxy_exporter_total_scrapes、haproxy_exporter_csv_parse_failures进程维度haproxy_process_resident_memory_bytes、haproxy_process_max_fds路由器自身模板渲染耗时template_router_reload_seconds、template_router_write_config_seconds。测试还使用 Prometheus 官方expfmt解析器p.TextToMetricFamilies将抓取到的文本转换为 MetricFamily 结构再逐项断言这正是文档“用 Prometheus 格式暴露业务指标”约定的端到端验证——从端点抓取、格式解析到语义断言一条链路全部覆盖。三、Profiling 性能剖析/debug/pprof/*的使用边界对于高流量high traffic或已知性能瓶颈且使用 Go 编写的组件文档要求SHOULD暴露/debug/pprof/*系列端点。同时有一个不可妥协的前提这些端点 MUST 通过认证与授权保护因为性能剖析数据可能导致信息泄露information disclosure——例如 goroutine 栈中的变量、堆内存中的字符串等都可能泄漏内部状态。路由器再次提供了完整实现样板test/extended/router/metrics.go 中的 e2e 测试断言未提供用户名密码访问http://host:metricsPort/debug/pprof/heap必须返回401 或 403使用认证凭据访问/debug/pprof/heap?debug1时响应内容必须包含# runtime.MemStats标记即 Go 运行时堆剖析输出的标准头。g.By(preventing access without a username and password) err : expectURLStatusCodeExec(ns, execPodName, fmt.Sprintf(http://%s/debug/pprof/heap, net.JoinHostPort(host, strconv.Itoa(int(metricsPort)))), 401, 403) o.Expect(err).NotTo(o.HaveOccurred()) g.By(at /debug/pprof) results, err : getAuthenticatedURLViaPod(ns, execPodName, fmt.Sprintf(http://%s/debug/pprof/heap?debug1, net.JoinHostPort(host, strconv.Itoa(int(metricsPort)))), username, password) o.Expect(err).NotTo(o.HaveOccurred()) o.Expect(results).To(o.ContainSubstring(# runtime.MemStats))这一测试完整落地了“pprof 必须认证 认证后可读取剖析数据”的双重要求。四、安全健康检查与指标端点的访问控制文档在安全一节给出了三条明确原则1. 健康检查本地可达即可健康检查/healthz、/healthz/ready必须能在 Pod 或本地网络上被访问这样远端探针代理如 kubelet、监控 Agent才能访问它们。对于更复杂、可能泄露密码、磁盘路径、用户身份信息等敏感数据的检查则 MAY 引入认证与授权。2. Metrics 端点泄露租户信息时 MUST 认证如果 metrics 端点会泄露租户信息pod 名、service 名、namespace 名或用户身份信息则SHOULD 使用认证保护。文档给出的推荐做法是使用BASIC 认证密码通过环境变量或 Secret提供——并明确点名“参考路由器的实现”对于系统级组件如 controller manager、scheduler、kubelet、router可以可选地利用集群内生的授权能力如 kubelet 的 authn/authz、apiserver 的 RBAC。路由器的实现恰好是本仓库中可以直接引用的范例test/extended/router/metrics.go 展示了凭据的来源——从openshift-ingress命名空间读取名为router-stats-default的 Secret其中包含statsUsername与statsPassword两个字段同时测试还创建一个prometheus-k8sServiceAccount 的 bearer token 用于抓取。随后测试断言未认证访问/metrics返回401 或 403见 metrics.go用router-stats-default提供的用户名密码认证后可以读取指标metrics.go。OAuth 服务器同样验证了这一安全模型test/extended/oauth/requestheaders.go 断言/metrics端点“匿名不可见”“未认证用户不应能访问”而 requestheaders.go 进一步验证/metrics需要“有权访问该端点的用户”的 token。3. 泄露租户信息的 metrics 必须走 TLS文档特别强调暴露租户信息并使用认证的组件MUST 使用 HTTPS 提供 metrics——这是一条通用基础设施要求所有用户信息都必须经 TLS 传输。本仓库中与之呼应的佐证监控系统对路由器 metrics 的抓取目标 URL 即为https://.*/metricstest/extended/router/metrics.go由router-internal-default这个 Prometheus job 以 HTTPS 抓取同时 test/extended/apiserverauth/apiserver_util.go 中 apiserver 的/healthz也是通过https://地址访问的。五、Push Metrics为什么应作为最后手段部分组件可能需要向远端 Agent推送较大量的指标。文档对此的态度非常明确这在技术上是允许的但 SHOULD 作为最后手段last resort。理由如下设计良好的 Prometheus 端点应能干净地扩展到约 1k–10k 个租户这已经覆盖当前集群规模的边界within our cluster size bounds today**推送指标需要申请例外exception**才能实施。也就是说Pull 模型Prometheus 主动抓取是默认且推荐的方式Push 模型只有在 Pull 确实无法满足例如指标量极大、组件生命周期过短等时才允许并且必须走例外审批流程。本仓库对“Pull 抓取”的验证同样充分should enable openshift-monitoring to pull metrics测试test/extended/router/metrics.go调用 Prometheus 的/api/v1/targets?stateactive接口断言router-internal-default这个 job 存在一个 health 为up、抓取 URL 匹配^https://.*/metrics$的活动 target——即集群监控系统确实通过 Pull 方式从路由器拉取指标。六、Exceptions 例外可被豁免但缺失即 Bug最后文档给出了一个务实而强硬的收尾条款可以对这些要求授予例外exceptions但无法暴露这些信息的组件就无法被监控。请把这类信息的缺失视为一个 Bug。这意味着例外申请是存在且允许的尤其针对 Push Metrics 场景但任何无法提供健康检查、就绪检查或指标端点的组件本质上都会变成监控盲区因此团队应当把“组件缺少可观测信息”当作缺陷来处理而不是长期接受。七、规范落地全景从提案到测试的印证路径为了帮助读者在本仓库中继续深挖下表汇总了本文所有关键规则对应的源码/测试证据位置规范条款仓库中的验证/实现位置组件须暴露/healthztest/extended/router/metrics.go路由器 metrics 端口/healthz返回 200test/extended/apiserverauth/apiserver_util.goapiserver HTTPS/healthzService/Route 暴露组件须有/healthz/readytest/extended/router/certs.go、scoped.go、stress.go作为后端 readinessProbe 路径社区等价端点可直接沿用/readyztest/extended/apiserver/health_endpoints.go、graceful_termination.go/metrics业务度量 Prometheus 格式test/extended/router/metrics.gohaproxy_*、template_router_*等指标族断言/debug/pprof/*必须认证test/extended/router/metrics.go未认证 401/403认证后返回# runtime.MemStatsmetrics 泄露租户信息须 BASIC 认证Secret 提供密码test/extended/router/metrics.gorouter-stats-defaultSecret 的statsUsername/statsPassword未认证访问/metrics被拒绝test/extended/router/metrics.gotest/extended/oauth/requestheaders.go监控系统 Pull 抓取 HTTPS metricstest/extended/router/metrics.gotarget URL 匹配^https://.*/metrics$组件健康端点的持续监控disruption 场景pkg/monitortests/network/disruptioningress/monitortest.go对 oauth/console 等 route 的/healthz做可用性监控结语给组件开发者的检查清单把提案文档浓缩成一份可直接对照的验收清单组件是否在公共 HTTPS或 HTTP端口上暴露了/healthz返回 200 ok与/metricsPrometheus 格式若组件通过 Service/Route 暴露是否额外提供了/healthz/ready仅 TCP 端点的组件是否在独立端口上挂出了上述 HTTP 检查指标是否刻画了业务度量请求计数/耗时/类型、队列深度/吞吐而非仅仅进程琐碎指标或标签中是否含敏感信息是否已匿名化/归类指标是否泄露租户信息若是是否已用 BASIC 认证密码来自环境变量或 Secret保护且通过 HTTPS 提供服务Go 高流量/瓶颈组件是否暴露了经认证的/debug/pprof/*若无法满足上述任何一项是否已申请例外——如果既无法暴露信息也没有例外请把它当作 Bug 修复因为无法被监控的组件等于运行在黑盒里。遵循这套插桩规范OpenShift 中的每一个基础设施组件都能被 kubelet 探针、Prometheus 抓取与集群监控链路完整覆盖这也是整个 OpenShift 集群可观测性体系能够运转的地基。赞分享测试云原生质量保障【免费下载链接】originConformance test suite for OpenShift项目地址https://gitcode.com/gh_mirrors/or/origin点击查看免费下载相关推荐如何在5分钟内上手Lawnchair从安装到数据持久化的快速入门教程如何在5分钟内上手Lawnchair从安装到数据持久化的快速入门教程 Lawnchair是一款轻量级客户端JSON文档存储工具专为HTML5移动应用设计提Dante Cloud设施Starter基础设施切换依赖的最佳实践Dante Cloud设施Starter基础设施切换依赖的最佳实践 引言微服务架构中的基础设施挑战 在微服务架构演进过程中基础设施组件的选择和切换往往成为Lecture_Notes微服务监控Metrics与Logging最佳实践Lecture_Notes微服务监控Metrics与Logging最佳实践 在微服务架构中服务数量的激增使得监控成为保障系统稳定性的核心环节。本文将结合上一篇告别夜间护眼烦恼awesome-shadcn-ui暗黑模式实现全解析下一篇ComfyUI极速出图三步走Boogu-Image Turbo模型新手友好实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考