跳到主要内容
约 4 分钟2 张卡

服务发现

服务发现将稳定服务名映射到实例地址。本文负责实例注册、健康检查和上下线。

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 发现与长连接​

11 · 面试题卡片​

11.1 注册中心短暂不可用时,客户端应该如何处理实例列表​

出现公司:美团、阿里巴巴

考察重点

  • 理解控制面更新与数据面转发的分离。
  • 理解本地快照、版本和被动健康检查。
  • 理解实例摘流、连接排空与陈旧数据边界。

相关内容:liveness 与 readiness至版本化快照。

参考回答

客户端应保留有效本地实例快照,并继续检查实际目标健康。

注册中心短暂不可用时,健康实例仍可提供服务。失效地址临时摘除,快照年龄持续告警。

重连按协议恢复订阅,历史过期时重新拉取列表。新实例预热后就绪,旧实例留足摘流与排空时间。陈旧快照超过约定期限后,按业务风险降级。

11.2 Kubernetes watch 返回 410 Gone 时怎样恢复实例列表?​

出现公司:暂无已核验的公开来源(本站自测)

考察重点:历史过期、重新列举与路由快照。

相关内容:list 与 watch 恢复。

参考回答

同步缓存需重新 list,再从新版本开始 watch。

410 Gone 表示请求版本的历史已不可用。resourceVersion 作为不透明标识传回服务端。

路由可暂用独立的有效快照,等待重建完成后替换。期间仍需执行健康检查和陈旧期限策略。

12. 参考资料​