0

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

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

假设我有一个预计运行 2 个副本的部署。当第一个节点启动时,应该只有一个。最后,当我有一个 3 节点主机时,它应该有 2 个副本在 2 个节点中运行。

无论如何,我可以做到这一点。TIA

4

1 回答 1

3

有多种选择。

守护程序集

如果您想在每个工作节点上准确地复制您的应用程序,您可以使用DaemonSet(虽然我猜您只想拥有一定数量的副本,所以在这种情况下,这不是您的用例的解决方案)。

Pod 反亲和性

您可以为 Deployment的 Pod定义一个Pod 反亲和性requiredDuringSchedulingIgnoredDuringExecution,其中包含一个类型和一个topologyKey引用每个节点上不同的标签的标签。这样,您的 Deployment 不会有两个 Pod 被调度到同一个节点。

例如,如果您在 Deployment 中定义了三个副本,并且只有两个可用的工作节点,那么将在这两个工作节点上调度两个副本,第三个副本将保持挂起状态,直到创建第三个工作节点,在这种情况下它将被安排到这个节点。

操作员

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

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

  • 您创建自定义资源的实例 → 操作员变为活动状态,检查自定义资源中声明的副本数量,检查可用工作节点的数量,并创建适当数量的副本。
  • 您向集群添加一个额外的节点 → 操作员变为活动状态,检查您的自定义资源实例中是否有任何挂起的副本,如果有,将其中一个调度到新节点。
  • 您从集群中删除一个节点 → 操作员变为活动状态,并确保已删除节点上的副本不会被调度到另一个节点,而只是在创建新节点之前处于挂起状态。

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

于 2020-10-20T08:20:18.143 回答