Kubernetes - StatfulSets,如何将有状态实例挂接到节点?

Kubernetes - StatfulSets, how to peg stateful instances to nodes?

我正在打包要部署的应用程序并 运行 在本地 Kubernetes 集群上。到目前为止一切都很好,但我在一个本质上是数据库的组件上苦苦挣扎。该组件需要 3 个主节点和 2 个副本。有趣的是主节点本身算作一个副本,需要这样配置(这是为了分片)。由于这是本地部署,我需要在 3 个物理主机上平衡主节点和副本对,每个主机上都有唯一的节点和副本对 运行ning。

这是布局的示例,其中 N == 主节点,R == 副本。

Host1  Host2  Host3
 N1R1   N2R1   N3R1
 N3R2   N1R2   N2R2

我可以使用 StatefulSets 和 init 容器序号的一些 helm magic 生成所需的配置,但我正在努力将 N1R1 和 N3R2 固定到主机 1,将 N2R1 和 N1R2 实例固定到主机 2,以及 N3R1 和 N2R2实例到主机 3。我需要这样做以确保数据完整性。我是否遗漏了持久音量控制器的某些内容?或者 StatefulSets 中的一些设置让我可以访问底层 Kubernetes 节点以定义哪个节点和副本对 运行 where?

Affinity 和 AntiAffinity 呢?我能否利用这些来强制辅助副本实例永远不会与其主实例位于同一节点上?

您正在寻找反亲和力。为避免在同一节点上安排 2 Pods,您需要在资源描述中使用 topologyKey: "kubernetes.io/hostname"

这里是link官方文档中的例子

这里是 link 以便更深入地了解其工作原理。