我正在 k8s 中构建一个应用程序,我希望部署/状态集的副本根据添加的节点数量进行扩展。
最初部署应该在创建第一个节点时提供 1 个副本,并且随着我们向其添加更多工作/主节点而增长,一旦达到最大值,它应该停止增长。我正在使用本地存储,我不希望在单个节点中安排有状态集。
假设我有一个预计运行 2 个副本的部署。当第一个节点启动时,应该只有一个。最后,当我有一个 3 节点主机时,它应该有 2 个副本在 2 个节点中运行。
无论如何,我可以做到这一点。TIA
我正在 k8s 中构建一个应用程序,我希望部署/状态集的副本根据添加的节点数量进行扩展。
最初部署应该在创建第一个节点时提供 1 个副本,并且随着我们向其添加更多工作/主节点而增长,一旦达到最大值,它应该停止增长。我正在使用本地存储,我不希望在单个节点中安排有状态集。
假设我有一个预计运行 2 个副本的部署。当第一个节点启动时,应该只有一个。最后,当我有一个 3 节点主机时,它应该有 2 个副本在 2 个节点中运行。
无论如何,我可以做到这一点。TIA
有多种选择。
如果您想在每个工作节点上准确地复制您的应用程序,您可以使用DaemonSet(虽然我猜您只想拥有一定数量的副本,所以在这种情况下,这不是您的用例的解决方案)。
您可以为 Deployment的 Pod定义一个Pod 反亲和性requiredDuringSchedulingIgnoredDuringExecution
,其中包含一个类型和一个topologyKey
引用每个节点上不同的标签的标签。这样,您的 Deployment 不会有两个 Pod 被调度到同一个节点。
例如,如果您在 Deployment 中定义了三个副本,并且只有两个可用的工作节点,那么将在这两个工作节点上调度两个副本,第三个副本将保持挂起状态,直到创建第三个工作节点,在这种情况下它将被安排到这个节点。
最灵活的解决方案是创建一个operator。在这种情况下,您创建一个新的自定义资源,该资源对您所需的部署行为进行编码(例如,所需的最大副本数)。您可以通过定义自定义资源定义 (CRD) 来做到这一点。然后,您创建一个运算符,它是一个与 Kubernetes API 交互并强制执行此行为的应用程序。
在运行时,这可能如下所示:
您可以以任何您想要的方式扩展此逻辑,因为您可以在运算符中实现您想要的任何逻辑。