有状态集
StatefulSet 是 Kubernetes 上的有状态工作负载的构建块,具有一定的保证。
稳定且唯一的网络身份
StatefulSet Pod 具有由序数、稳定的网络身份和稳定的存储组成的唯一身份。
例如,如果您的 StatefulSet 的名称为 sharded-svc
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: sharded-svc
你有例如3 个副本,它们将由 <name>-<ordinal> 命名,其中 ordinal 从 0 开始直到 replicas-1。
您的 pod 的名称将是:
sharded-svc-0
sharded-svc-1
sharded-svc-2
这些 pod 可以通过 dns-name 访问:
sharded-svc-0.sharded-svc.your-namespace.svc.cluster.local
sharded-svc-1.sharded-svc.your-namespace.svc.cluster.local
sharded-svc-2.sharded-svc.your-namespace.svc.cluster.local
假设您的 Headless Service 被命名为 sharded-svc 并且您将其部署在命名空间 your-namespace 中。
分片或分区
鉴于前端 -> 后端调用的目标服务的多个副本,我可以可靠地将某个帐户的流量路由到某个端点实例。
您在这里描述的是您的有状态服务是所谓的 sharded 或 partitioned。这不是 Kubernetes 开箱即用的,但您拥有此类服务所需的所有构建块。 它可能存在提供此功能的第 3 方服务,您可以部署或开发它。
分片代理
您可以创建一个由多个 pod 之一组成的服务 sharding-proxy(可能来自 Deployment,因为它可以是无状态的)。此应用需要查看您的sharded-svc 中的 pods/service/endpoints 以了解它可以将流量路由到哪里。这可以使用client-go 或其他替代方法开发。
此服务实现了您想要在分片中使用的逻辑,例如account-nr 模数3被路由到对应的podordinal
更新:有具有分片功能的 3rd 方代理,例如Weaver Proxy
基于 headers/path/body 字段的分片请求
推荐阅读:Weaver: Sharding with simplicity
使用分片服务
为了使用您的分片服务,客户端向您的 sharding-proxy 发送请求,然后应用您的 路由 或 分片逻辑(例如,使用 account-nr 请求 模数 3 被路由到相应的 pod ordinal)并将请求转发到与您的逻辑匹配的sharded-svc 的副本。
替代解决方案
目录服务:将sharded-proxy 实现为目录服务 可能更容易,但这取决于您的要求。客户可以询问您的 目录服务 我应该发送什么 statefulSet 副本 account-nr X 以及您的服务回复,例如sharded-svc-2
客户端中的路由逻辑:可能最简单的解决方案是让您的路由逻辑在客户端中,并让此逻辑计算向哪个 statefulSet 副本发送请求.