如何在Kubernetes中的n个豆荚之间划分空间



我们使用的是kubernetes,我们需要对数据进行"智能分区"。我们想在n个运行吊舱之间将空间分开1至1000,每个豆荚都应该知道他要处理的空间的哪一部分(用于汇总分区任务(。

因此,例如,如果我们有1个吊舱,他将从1-1000处处理整个空间。

当我们扩展到3个豆荚时,每个豆荚都会获得相同的份额。

POD 1-将处理1-333

POD 2-334-667

POD 3 667-1000

现在,我们找到解决此问题的最佳方法是创建一个状态集,该设置汇总运行POD的数量及其实例号,并确定他需要处理的空间的哪一部分。Kubernetes中是否有一种更聪明/内置的方式可以以这种方式分区节点之间的空间?

服务面料具有此功能内置。

no 本机工具在K8S中的分区级别缩放。

仅与您在原始帖子中提出的类似的自定义解决方案。

提供另一种自定义方法以供您参考。基于此Airbnb的技术博客

给出了豆荚及其名称的列表,每个POD都能确定性地计算其应起作用的分区列表在。当我们从复制集中添加或删除POD时,POD将只需拿起更改,并处理新的分区集而是

他们如何做的是基于他们的回购。我在此处概述了关键组件(注意:存储库是用Java编写的(。

  1. 获取在K8S名称空间中运行多少个POD,然后按POD名称(代码(进行排序。代码段
String podName = System.getenv("K8S_POD_NAME");
String namespace = System.getenv("K8S_NAMESPACE");
NamespacedKubernetesClient namespacedClient = kubernetesClient.inNamespace(namespace);
ReplicaSet replicaSet;
// see above code link to know how to get activePods, remove it here because it is too long
int podIndex = activePods.indexOf(podName);
int numPods = activePods.size();
  1. 每次调用上述代码时,您都会有podIndexnumPods的确定性列表。然后,使用此信息来计算此POD负责
  2. 的范围
List<Integer> partitions = new ArrayList<>();
int split = spaceRange / numPods;
int start = podIndex * split;
int end = (podIndex == numPods - 1) ? spaceRange - 1 : ((podIndex + 1) * split) - 1;
for (int i = start; i <= end; i++) {
  partitions.add(i);
}
  1. 由于将随时更改POD的数量,因此您可能需要executorService.scheduleWithFixedDelay才能定期更新列表
executorService.scheduleWithFixedDelay(this::updatePartitions, 0, 30, TimeUnit.SECONDS);

这种方法不是最好的,因为如果您设置了30秒的ScheduleWithFixedDelay,则不会在30秒内捕获任何POD更改。此外,在短时间内,可能有两个POD负责同一空间,并且您需要像Airbnb Tech Blog一样在业务逻辑中处理此特殊情况。

最新更新