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

2023-11-26

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

到目前为止,我已经了解到 Kubernetes 提供的“服务”可以为隐藏在其后面的 Pod 进行负载平衡,但这只能以更简单的方式实现。

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

我有这个界面:

public interface IEndpointSelector
{
    int HashableIdentifier { get; }
}

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

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

现在,我该如何在 Kubernetes 中做到这一点呢?

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

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


有状态集

有状态集 is a 积木用于 Kubernetes 上的有状态工作负载,并具有一定的保证。

稳定且唯一的网络身份

StatefulSet Pod 具有唯一的身份,由序数、稳定的网络身份和稳定的存储组成。

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

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

你有例如3 个副本,这些副本将被命名为<name>-<ordinal> where 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

鉴于你的无头服务被命名sharded-svc然后将其部署在命名空间中your-namespace.

分片或分区

给定前端 -> 后端调用的目标服务的多个副本,我可以可靠地将某个帐户的流量路由到某个端点实例。

你这里描述的是你的有状态服务就是所谓的sharded or 分区的。这并不是 Kubernetes 开箱即用的,但您拥有所需的一切建筑模块对于这种服务。可能存在提供此功能的第三方服务,您可以部署或开发该功能。

分片代理

您可以创建一个服务sharding-proxy由多个 pod 之一组成(可能来自部署因为它可以是无状态的)。这个应用程序需要监视 pod/service/端点在你的sharded-svc了解它可以将流量路由到哪里。这可以使用开发客户去或其他替代方案。

该服务实现了您在分片中想要的逻辑,例如帐户号码模3被路由到对应的podordinal

Update:有 3rd 方代理sharding功能,例如韦弗代理

基于 headers/path/body 字段的分片请求

推荐阅读:Weaver:简单的分片

消费分片服务

要使用您的分片服务,客户端将请求发送到您的sharding-proxy然后应用你的routing or 分片逻辑(例如请求帐户号码模3被路由到对应的podordinal)并将请求转发至复制品 of sharded-svc符合你的逻辑。

替代解决方案

目录服务:可能更容易实现sharded-proxy as a 目录服务但这取决于您的要求。客户可以询问您的目录服务我应该发送到哪个 statefulSet 副本帐户号码 X您的服务回复例如sharded-svc-2

客户端的路由逻辑:可能最简单的解决方案是让您的路由逻辑在客户端中,让这个逻辑计算向哪个 statefulSet 副本发送请求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kubernetes 中的有状态服务的分片负载均衡 的相关文章

随机推荐

  • Java是“按引用传递”还是“按值传递”?

    我一直认为Java使用引用传递 然而 我读到一篇博文它声称 Java 使用值传递 我认为我不明白作者所做的区分 解释是什么 术语 按值传递 和 按引用传递 有特殊之处 精确定义计算机科学中的含义 这些含义与许多人第一次听到这些术语时的直觉不
  • 在“/kafka/kafka_2.12-2.3.0/config/zookeeper_jaas.conf”中找不到名为“Server”的 JAAS 配置节

    当我从 kakfa 2 12 2 3 0 中的包运行 Zookeeper 时 出现以下错误 export KAFKA OPTS Djava security auth login config kafka kafka 2 12 2 3 0
  • 在 AngularJS 中使用 ngInfiniteScroll 指令实现反向无限滚动

    我想使用ngInfiniteScroll来自这里的指令 http binarymuse github io ngInfiniteScroll 在我的 Angular js 应用程序中实现反向无限滚动 就像在聊天小部件中一样 然而 该指令的文
  • Prism中如何控制模块初始化的顺序

    我将 Prism V2 与 DirectoryModuleCatalog 结合使用 并且需要按特定顺序初始化模块 所需的顺序由每个 IModule 实现上的属性指定 这样 当每个模块初始化时 它们会将其视图添加到 TabControl 区域
  • 图像顶部的波纹效果 - Android

    我一直在我最新的业余项目中尝试波纹动画 我在寻找 优雅 的解决方案来在某些情况下使用它来处理触摸事件时遇到了一些麻烦 即图像 尤其是列表 网格和回收视图中的图像 动画几乎总是在视图后面动画 而不是在视图之上 这在按钮和 TextView 中
  • iOS:向上滚动刷新

    许多 iOS 应用程序都有 向上滚动刷新 功能 例如 Twitter 应用程序 如果向上滚动超出页面或表格的开头 您将收到一条消息 解释如何使用该功能 该控制器不是来自苹果 但许多应用程序似乎都使用它 有人告诉我它是由程序员发布供公众使用的
  • Python:选择一个元素而不进行替换

    我想从字符串中随机切片字母 给定 s 你好 我想从 s 中选取元素而不进行替换 但保留索引号 例如 gt gt gt random sample s len s w h o d y 接近我想要的 但我实际上更喜欢类似的东西 w 2 h 0
  • JavaFX:如何检测是否按下了某个键?

    我正在与Timelines并希望能联系到一些KeyPress舞台上的事件可能会改变时间线在其运行过程中更改属性的方式 我知道如何区分按下的键和我想听的键 但需要知道如何确定某个键是否刚刚被按下一次 例如打字 或者某个键是否被按住较长时间一段
  • 创建松耦合/可扩展的软件架构

    我已经研究这个好几个星期了 我目前正在设计一个松耦合架构设计采用n层 3层 方法和工厂设计方法 我的目标是将每个客户端的业务逻辑 ClientA DLL ClientB DLL 放在单独的命名空间中 以便项目横向扩展 这意味着我可以修改 删
  • jQuery UI 多选小部件清除所有复选框

    希望能快一点 我需要在页面上单独按钮的单击事件中触发 uncheckAll 事件 我尝试了以下操作 masterProviderOrgsListBox multiselect uncheckAll 但这不是公认的方法 我基本上想触发与单击标
  • 无法编译 Eigen SVD 的示例

    我正在尝试编译提供的示例本征 雅可比SVD我收到以下错误 usr local include eigen3 Eigen src SVD JacobiSVD h In instantiation of Eigen JacobiSVD
  • 等待每个 jQuery

    我正在尝试使 div 淡入 淡出 该 div 位于each 语句中 问题是在淡入 淡出完成之前调用下一个项目 div one div div two div div three div
  • 如何向轮子添加额外的文件?

    如何控制轮子中包含哪些文件 它出现MANIFEST in不被使用python setup py bdist wheel UPDATE 我对从源代码包安装与从轮子安装之间的区别是错误的 源发行版包括中指定的文件MANIFEST in 但是安装
  • 如何将 JavaScript 变量传递给 PHP?

    我想使用表单中的隐藏输入将 JavaScript 变量传递给 PHP 但我无法获得的值 POST hidden1 into salarieid 有什么不对 这是代码
  • 如何将字符串拆分为标记?

    如果我有一个字符串 x 13 5 10x 4e1 我怎样才能将它分成以下令牌列表 x 13 5 10 x 4 e 1 目前我正在使用 shlex 模块 str x 13 5 10x 4e1 lexer shlex shlex str tok
  • 有什么方法可以专注于日期时间本地输入控件中的特定单元

    我需要能够将焦点设置在日期时间本地输入控件的小时部分上
  • Unity 中的 Android 互联网权限

    似乎默认情况下 Unity 不会放置
  • 使用Highlight.js 在 Jekyll Github 页面中显示 C# 标签

    To show 使用简单的 HTML 成功编码 我已经添加了高亮 js in my 基于 Jekyll 的博客正在运行Github 页面
  • Graphics.DrawString 与 TextRenderer.DrawText?哪个可以提供更好的质量

    TextRenderer 基于 GDI 和 Graphics DrawString 基于 GDI 在图像上绘制文本时 这些函数中的哪一个可以提供更好质量的文本 我将交叉发布我的答案here 只是为了让信息传播出去 在 NET 中绘制文本有两
  • Kubernetes 中的有状态服务的分片负载均衡

    我目前正在从 Service Fabric 切换到 Kubernetes 想知道如何进行自定义和更复杂的负载平衡 到目前为止 我已经了解到 Kubernetes 提供的 服务 可以为隐藏在其后面的 Pod 进行负载平衡 但这只能以更简单的方