单例服务与无状态服务实践指南
1. 单例服务相关技术
在某些场景下,单例服务是必要的,有多种技术可以实现单例服务的控制。
1.1 StatefulSet 与无头服务
当 StatefulSet 只有一个 Pod 且需要稳定的网络标识时,创建无头服务是个不错的选择。无头服务没有虚拟 IP 地址,kube - proxy 不处理此类服务,平台也不进行代理。但它会在 API 服务器中创建端点记录,并为匹配的 Pod 生成 DNS A 记录,可通过服务的 DNS 记录直接访问 Pod 的 IP 地址。
例如,创建一个名为 my - singleton
的无头服务,可使用 my - singleton.default.svc.cluster.local
直接访问 Pod 的 IP 地址。
对于非严格单例且至少需要一个实例的情况,定义一个副本数为 1 的 ReplicaSet 即可,这种配置有利于可用性。而对于严格单例且有 At - Most - One 要求和更好的服务发现性能的情况,建议使用 StatefulSet 和无头服务,它更注重一致性。
1.2 应用内锁定
在分布式环境中,可通过分布式锁控制服务实例数量。当服务实例或其内部组件激活时,会尝试获取锁,成功则服务变为活跃状态,失败的实例会等待并持续尝试获取锁。
许多分布式框架都采用这种机制来实现高可用性和弹性。例如,消息代理 Apache ActiveMQ 可以在高可用的主动 - 被动拓扑中运行,数据源提供共享锁,第一个启动的代理实例获取锁并变为活跃状态,其他实例则变为