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