gpt4 book ai didi

kubernetes - Kubernetes 中有状态服务的分片负载均衡

转载 作者:行者123 更新时间:2023-12-02 11:29:22 25 4
gpt4 key购买 nike

我目前正在从 Service Fabric 切换到 Kubernetes,并且想知道如何进行自定义和更复杂的负载平衡。

到目前为止,我已经阅读了 Kubernetes 提供的“服务”,它为隐藏在它们后面的 pod 做负载平衡,但这只能以更简单的方式使用。

我现在想重写的内容在 Service Fabric 中如下所示:

我有这个界面:

public interface IEndpointSelector
{
int HashableIdentifier { get; }
}

在我的 ASP.Net 应用程序中跟踪帐户的上下文,例如继承了这个。然后,我编写了一些代码,这些代码现在将通过服务结构集群 API 进行服务发现并跟踪所有服务,在任何实例死亡或重新生成时更新它们。

然后,基于此标识符的确定性性质(由于上下文被缓存等)并给定前端 -> 后端调用的目标服务的多个副本,我可以可靠地将某个帐户的流量路由到某个端点实例.

现在,我将如何在 Kubernetes 中执行此操作?

正如我已经提到的,我找到了“服务”,但它们的负载平衡似乎不支持自定义逻辑,并且仅在处理无状态实例时才有用。

是否还有一种方法可以在 Kubernetes 中进行服务发现,我可以在这里使用它在某些时候替换我现有的代码?

最佳答案

状态集

StatefulSet是 Kubernetes 上有状态工作负载的构建块,具有一定的保证。

稳定独特的网络身份

StatefulSet Pods have a unique identity that is comprised of an ordinal, a stable network identity, and stable storage.



例如,如果您的 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

并且可以使用 dns-name 访问这些 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 服务名为 sharded-svc然后将其部署在命名空间 your-namespace 中.

分片或分区

given multiple replicas of the target service of a frontend -> backend call, I can reliably route traffic for a certain account to a certain endpoint instance.



您在这里描述的是您的有状态服务是所谓的分片或分区。这不是 Kubernetes 开箱即用的,但您拥有此类服务所需的所有构建块。它可能存在提供此功能的 3rd 方服务,您可以部署或开发它。

分片代理

您可以创建服务 sharding-proxy由多个 pod 中的一个组成(可能来自 Deployment,因为它可以是无状态的)。此应用程序需要观看 pods/service/ endpoints在您的 sharded-svc知道它可以在哪里路由流量。这可以使用 client-go 开发或其他替代方案。

该服务实现了您在分片中所需的逻辑,例如account-nr 模数 3 路由到对应的 pod 序号

更新: 的第 3 方代理分片 功能性,例如 Weaver Proxy

Sharding request based on headers/path/body fields



推荐阅读: Weaver: Sharding with simplicity

使用分片服务

为了使用您的分片服务,客户端将请求发送到您的 sharding-proxy然后应用您的路由或分片逻辑(例如,将 account-nr 模数为 3 的请求路由到相应的 pod 序号)并将请求转发到 sharded-svc 的副本符合你的逻辑。

替代解决方案

目录服务:可能更容易实现 sharded-proxy作为目录服务,但这取决于您的要求。客户端可以向您的目录服务询问我应该向哪个 statefulSet 副本发送 account-nr X 和您的服务回复,例如 sharded-svc-2
客户端路由逻辑:可能最简单的解决方案是在客户端中设置路由逻辑,并让该逻辑计算发送请求的 statefulSet 副本。

关于kubernetes - Kubernetes 中有状态服务的分片负载均衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58675990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com