在k8s集群中通过添加新节点来动态扩展Pod

时间:2020-10-20 07:43:56

标签: kubernetes affinity kubernetes-statefulset openebs

我正在k8s中构建一个应用程序,在该应用程序中,我希望部署/状态集的副本能够根据添加的节点数量进行扩展。

创建第一个节点时,最初的部署应该带有1个副本,并且随着我们向其添加更多的工作人员/主节点而增长,并且一旦达到最大数量,它就应该停止增长。我正在使用本地存储,并且我不希望在单个节点中安排状态集。

假设我有一个部署,我希望可以运行2个副本。启动第一个节点时,只能出现一个。最后,当我有一个3节点主服务器时,它应该在2个节点中运行2个副本。

无论如何,我可以实现这一目标。 TIA

1 个答案:

答案 0 :(得分:3)

有多种选择。

DaemonSet

如果您希望在每个工作程序节点上仅拥有一个应用程序副本,则可以使用DaemonSet(尽管我想您只希望具有一定数量的副本,所以在这种情况下,这是“为您的用例提供解决方案)。

Pod反亲和力

您可以使用requiredDuringSchedulingIgnoredDuringExecution类型和topologyKey为部署的Pod定义一个Pod anti-affinity,引用每个节点上不同的标签。这样,您的部署中不会有两个Pod被调度到同一节点。

例如,如果您在Deployment中定义了三个副本,并且只有两个工作节点可用,那么将在这两个工作节点上计划两个副本,并且第三个副本将保持待处理状态,直到创建第三个工作节点为止,在这种情况下,它将被安排到该节点。

操作员

最灵活的解决方案是创建一个operator。在这种情况下,您将创建一个新的custom resource,该编码将对所需的部署行为(例如,所需的最大副本数)进行编码。您可以通过定义自定义资源定义(CRD)来实现。然后,您创建一个运算符,该运算符是与Kubernetes API交互并执行此行为的应用程序。

在运行时,它可能如下所示:

  • 您创建自定义资源的实例→操作员变为活动状态,检查自定义资源中声明的副本数,检查可用工作节点的数量,并创建适当的副本数。
  • 您在集群中添加了一个附加节点→操作员变为活动状态,检查您的自定义资源实例中是否有任何待处理的副本,如果是,则将其中的一个调度到新节点。
  • 您从集群中删除一个节点→操作员变为活动状态,并确保未将已删除节点上的副本计划到另一个节点,而只是待定,直到创建新节点为止。

您可以以所需的任何方式扩展此逻辑,因为您可以在运算符中实现所需的任何逻辑。