服务发现
服务发现将稳定服务名映射到实例地址。本文负责实例注册、健康检查和上下线。
1. 面试核心
先记住这几条,再读正文- 发现方式。 客户端发现由调用方选实例,服务端发现由代理选实例。
- 健康与就绪。 readiness 决定就绪,liveness 按重启策略处理探测失败。
- 断连期间的调用。 本地实例快照与健康检查可支撑注册中心短暂断连。卡 · liveness 与 readiness
- 实例下线。 下线需同时覆盖端点传播、在途请求和长连接排空。
- 订阅恢复。 Kubernetes watch 历史过期后需重新 list 并建立订阅。卡 · list 与 watch 恢复
2. 服务注册
实例可以主动登记地址、版本和区域。也可由部署平台根据工作负载维护端点。
主动注册使用心跳或租约管理生命周期。Kubernetes 控制器按 Pod 与 Service 维护 EndpointSlice。注册地址还需验证调用方实际可达。
3. 客户端发现与服务端发现
客户端发现由调用方订阅实例,并在本地负载均衡。各语言客户端需具备一致的健康与更新能力。
服务端发现通过稳定入口转发请求。代理集中处理路由,但也增加容量与故障边界。两者可使用同一个实例数据源。
4. liveness 与 readiness
本节按 Service 默认 publishNotReadyAddresses=false 讨论。Kubernetes 探针分工如下:
| 探针 | 作用 |
|---|---|
| startup | 启动成功前延后 liveness 与 readiness |
| readiness | 判断是否就绪,失败时停止常规 Service 流量 |
| liveness | 检测容器活性,连续失败达到阈值后按重启策略处理 |
默认 restartPolicy=Always 时,连续失败达到阈值会触发重启。共享数据库故障不宜直接触发全体 liveness 失败。集中重启会增加恢复压力。readiness 需聚焦核心能力,避免非关键依赖导致全体摘流。
5. 主动与被动健康检查
主动探针定期访问健康接口。被动检查根据真实请求的错误与超时发现异常。
主动检查有探测间隔,被动检查受流量样本影响。连续失败阈值和恢复探测可减少误摘除。限制最多摘除比例,以免剩余实例过载。
6. 注册中心不可用
已有调用使用本地实例表,短暂断连时保留有效快照。完整故障边界见控制平面与数据平面。
服务发现还需对失效地址临时摘除或降权。持续记录快照年龄,并尝试恢复订阅。地址回收后,旧快照需依靠建连结果及时纠正。
7. 上下线与连接排空
新实例完成启动、配置加载和预热后再就绪。旧实例停止接收新工作,并排空已有请求。
端点更新与进程终止存在传播竞争。Kubernetes 的终止宽限期包含 preStop 执行时间。preStop 完成后才向容器主进程发送终止信号。
应用需要处理 SIGTERM,并限制排空时间。长连接上的新请求也需停止或引导重连。仅从端点移除实例,已有连接仍然存在。
8. 版本化快照
客户端按订阅协议维护实例快照。更新准备完成后,一次替换供路由读取的视图。
版本缺口的判断需遵循协议。Kubernetes 的 resourceVersion 是不透明标识。客户端传回服务端使用,避免自行做数值加减。
9. list 与 watch 恢复
传统 list/watch 流程先读取完整列表。随后从列表的 resourceVersion 开始 watch。
watch 断开时可用已知版本重新订阅。服务端只保留有限历史,过期请求会返回 410 Gone。此时重建同步缓存,重新 list 后再 watch。
若要继续转发,可将路由快照与同步缓存分开。同步缓存重建后再替换路由快照。陈旧快照仍需遵守期限与健康检查策略。
10. 常见问题
10.1 心跳与业务健康
心跳确认注册进程仍在续约。线程池或连接池耗尽时,心跳仍能成功。真实业务健康需结合核心探测、错误率和延迟。
10.2 DNS 发现与长连接
DNS 可用名称返回服务端点。调用方还需处理缓存 TTL 与重新解析。已经建立的长连接会继续连接原地址。
11 · 面试题卡片
11.1 注册中心短暂不可用时,客户端应该如何处理实例列表
出现公司:美团、阿里巴巴
考察重点
- 理解控制面更新与数据面转发的分离。
- 理解本地快照、版本和被动健康检查。
- 理解实例摘流、连接排空与陈旧数据边界。
相关内容:liveness 与 readiness至版本化快照。
参考回答
客户端应保留有效本地实例快照,并继续检查实际目标健康。
注册中心短暂不可用时,健康实例仍可提供服务。失效地址临时摘除,快照年龄持续告警。
重连按协议恢复订阅,历史过期时重新拉取列表。新实例预热后就绪,旧实例留足摘流与排空时间。陈旧快照超过约定期限后,按业务风险降级。
11.2 Kubernetes watch 返回 410 Gone 时怎样恢复实例列表?
出现公司:暂无已核验的公开来源(本站自测)
考察重点:历史过期、重新列举与路由快照。
相关内容:list 与 watch 恢复。
参考回答
同步缓存需重新 list,再从新版本开始 watch。
410 Gone 表示请求版本的历史已不可用。resourceVersion 作为不透明标识传回服务端。
路由可暂用独立的有效快照,等待重建完成后替换。期间仍需执行健康检查和陈旧期限策略。