解释“/_up”端点为何适合作为 K8s 探针而非“/”根路径。
解读
在国内云原生面试中,“探针设计”常被用来考察候选人是否真正理解“最小可用”与“最小权限”原则。CouchDB 的“/”根路径返回的是欢迎页或 Fauxton 控制台,不仅数据量大(几十 KB 到上百 KB),而且内部可能触发集群状态聚合、session 检查等逻辑;而“/_up”是 3.x 版本专为健康检查新增的内建端点,只返回 2 字节纯文本“ok”,响应时间稳定在亚毫秒级。K8s 的 kubelet 每 10 秒(可配)并发对所有容器的探针发起检测,高频、高并发、低容忍是典型特征,因此端点的“轻量”与“语义准确”直接决定集群弹性与荷包大小。
知识点
-
探针类型与行为
- Liveness:失败即重启 Pod,必须零副作用。
- Readiness:失败即摘除 Service Endpoints,必须精准表达流量准入。
- Startup:启动窗口内替代前两者,必须快速收敛。
-
CouchDB 端点语义
- “/”:返回 HTML,状态码恒为 200,无法区分“服务可用”与“仅进程存活”。
- “/_up”:返回 200 + “ok” 表示** Erlang VM 与 OTP 应用已完全初始化**;返回 503 表示仍在启动或已僵死,语义与探针需求 1:1 映射。
-
性能与资源
- “/” 可能触发集群内部 /_membership、/_stats 聚合,在大型集群中一次请求背后产生数十次内部 RPC,CPU、BEAM 堆内存、ETS 表锁都会被波及。
- “/_up” 走独立的 couch_up 模块,直接读 ETS 缓存位,无落盘、无复制、无聚合,QPS 可十万级。
-
安全与 RBAC
- “/” 需要读取权限才能返回 200,若管理员误关匿名读,探针会被 401 误杀。
- “/_up” 默认匿名可访问,且国内金融、政务云等保测评里明确把“健康检查接口必须独立于业务权限”写进基线,用“/_up”可直接过等保 2.0 三级测评。
-
版本与运维现状
- 国内主流生产镜像(阿里云 ACR、华为 SWR 官方 CouchDB 3.3+)已内置 /_up,而 2.x 老版本无此端点,面试时如能指出“需 3.2+”可体现版本感知。
答案
“/_up”端点专为健康检查设计,200 表示 CouchDB 的 Erlang 节点与 OTP 应用已完全初始化,503 表示未就绪,语义精确;返回体仅 2 字节,无 HTML、无内部聚合、无权限校验,资源消耗极低,符合 K8s 探针高频、低延迟、零副作用的要求。而“/”根路径返回大量 HTML,可能触发内部 RPC 与权限校验,既浪费带宽又可能因 401 误杀 Pod,因此“/_up”是 K8s liveness/readiness 探针的最佳实践。
拓展思考
- 双端点探针策略:在跨可用区联邦集群中,可给 readiness 配置“/_up”保活,给自定义业务探针再调用“/_cluster_setup”确认集群均衡,实现“进程-集群”两级水位。
- 指标关联:结合“/_up”与 Prometheus exporter 的 chttpd_httpd_status 指标,把探针失败事件与 BEAM 内存泄漏曲线关联,可提前 10 分钟预警 OOM。
- 国产化改造:在信创 ARM 环境,Erlang 的 HiPE 关闭后启动变慢,适当拉长 initialDelaySeconds 并仅用“/_up”,可避免启动期连环重启导致节点名冲突(国内常见踩坑)。