标准答案
- 普通 Service 适合客户端只需要一个稳定服务地址并由平台选择后端的场景。
- Headless Service 不分配普通 ClusterIP,可让客户端发现具体 Pod 地址,常用于有状态集群的成员发现。
- StatefulSet 提供稳定的 ordinal 身份、网络名称和 PVC 关联,但不自动提供数据库共识或备份。
- DNS 缓存、TTL、Pod 就绪和客户端重连策略必须一起测试。
题目解析
普通 Service 提供一个虚拟入口,Headless Service 不分配普通 ClusterIP,DNS 可以返回具体后端地址;StatefulSet 则提供稳定的 ordinal、hostname 和 PVC 关联。它们组合后能帮助成员发现,但不会替应用实现选主、复制、仲裁、数据一致性和故障恢复。
客户端应尊重 DNS TTL 和连接失败,处理 Pod 重建、就绪变化和地址更新;有状态协议还要根据角色和拓扑选择正确成员。验证要覆盖单 Pod 重启、节点/可用区故障、数据恢复和网络分区,不能只看 DNS 能返回记录。
常见误区
- 误区:用 StatefulSet 就认为数据库自动高可用。改正:另外设计数据库复制、选主、备份、恢复和故障域策略。
- 误区:永久缓存 Headless Service 返回的 Pod IP。改正:按 TTL 和连接失败刷新发现结果,并处理成员角色变化。