当前位置: 首页 > 知识库问答 >
问题:

Kubernetes中有状态服务的分片负载平衡

郎喜
2023-03-14

我目前正在从服务结构切换到Kubernetes,并想知道如何进行定制和更复杂的负载平衡。

到目前为止,我已经读到库伯内特斯提供“服务”,为隐藏在它们后面的豆荚做负载平衡,但这只能以更简单的方式提供。

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

我有这个界面:

public interface IEndpointSelector
{
    int HashableIdentifier { get; }
}

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

然后,基于此标识符的确定性(由于上下文被缓存等)并给定前端目标服务的多个副本-

现在,我该如何在库伯内特斯做到这一点?

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

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

共有2个答案

柯甫
2023-03-14

由于性能原因,服务通常在内核空间中运行代理,因此编写自定义代码很困难。Cillium确实允许为某些网络功能编写eBPF程序,但我不认为服务路由是其中之一。因此,这几乎意味着使用用户空间代理。如果您的服务是基于HTTP的,您可以查看一些现有入口控制器,看看是否有足够接近的入口控制器,或者是否允许您编写自己的自定义会话路由逻辑。否则,您必须自己编写一个守护程序来处理它。

施令秋
2023-03-14

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

StatefulSet Pods具有由序号、稳定网络标识和稳定存储组成的唯一标识。

例如,如果StatefulSet的名称为sharded svc

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sharded-svc

例如,您有3个副本,它们将由命名

您的播客名称为:

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服务名为sharded svc,并且您将其部署在命名空间中。

给定前端目标服务的多个副本-

您在这里描述的是您的有状态服务是所谓的分片或分区服务。这并不是Kubernetes提供的,但您已经具备了此类服务所需的所有构建块。可能存在提供此功能的第三方服务,您可以部署或开发此功能。

您可以创建一个由多个pod之一组成的服务分片代理(可能来自部署,因为它可能是无状态的)。此应用程序需要查看您的shaded-svc中的pod/service/endpoint以知道它可以在哪里路由流量。这可以使用client-go或其他替代方案来开发。

此服务实现您在切分中想要的逻辑,例如,帐户nr模数3被路由到相应的pod序号

更新:有具有切分功能的第三方代理,例如Weaver代理

基于标头/路径/正文字段的分片请求

推荐阅读:Weaver:简单切分

要使用切分服务,客户端将请求发送到您的切分代理,然后应用您的路由或切分逻辑(例如,将帐户nr模数3的请求路由到相应的pod序号),并将请求转发到与您的逻辑匹配的切分svc副本。

目录服务:作为目录服务实现shaded-agent可能更容易,但这取决于您的要求。客户端可以询问您的目录服务,我应该将帐户-nr X发送到哪个statefulSet副本,您的服务回复例如shaded-svc-2

客户端中的路由逻辑:最简单的解决方案可能是将您的路由逻辑放在客户端中,并让此逻辑计算要发送请求的状态集副本。

 类似资料:
  • 我正在寻找一种在创建类型为loadbalancer的k8s服务后设置服务/状态/负载平衡/入口ip的方法(如下一个链接的“类型loadbalancer”部分所示https://kubernetes.io/docs/concepts/services-networking/service/ ). 我的问题与以下链接中描述的问题类似(是否可以在监视服务时更新kubernetes服务的“外部IP”)但找

  • 试图自学如何使用库伯内特斯,但有一些问题。 我的下一步是尝试使用LoadBalancer类型的服务来访问nginx。 我建立了一个新的集群并部署了nginx映像。 然后,我为LoadBalancer设置服务 设置完成后,我尝试使用LoadBalancer入口(我在描述LoadBalancer服务时发现)访问nginx。我收到一个此页面无法工作的错误。 不太确定我哪里出错了。 kubectl获得sv

  • 我想为Kubernetes服务分配一个静态(即非临时)区域IP。目前,该服务属于“LoadBalancer”类型,GCP将其公开为一个区域TCP负载平衡器。默认情况下,转发规则的IP地址是临时的。是否有任何方法可以使用现有的静态ip或按名称分配自己的地址(如使用入口/HTTP负载平衡器可能)? 我还尝试使用该服务的节点端口使用自定义静态区域IP创建自己的转发规则。我只使用实际的节点端口成功地构建了

  • 我已经在AKS上部署了我的kubernetes应用程序,它使用内部负载均衡器,而没有单独的入口控制器。 目前该服务可以使用超文本传输协议访问,我想保护该服务。如何启用https以及应在何处安装证书?

  • 我安装了一个kubernetes集群。我想为我的一个微服务使用外部数据库(在我的集群之外),但这个外部数据库被设置为集群,没有自己的负载均衡器。 有没有办法创建一个内部负载平衡器服务,让kubernetes始终将微服务定向到正在运行的实例? 我看到您可以设置loadbalancer类型的服务,我如何使用它?我尝试创建它,但我看到loadbalancer服务是用NodePort创建的。它可以在没有节

  • 我正在DigitalOcean上使用CoreOs和库伯内特斯构建一个容器集群,我已经看到,为了向世界公开Pod,您必须使用Type: LoadBalancer创建一个服务。我认为这是最佳解决方案,因此您不需要在nginx或haagent等kubernetes之外添加外部负载均衡器。我想知道是否可以使用DO的浮动IP创建它。