首页 > 解决方案 > Kubernetes:自定义 Pod 调度和 Volume 调度

问题描述

我正在尝试使用 Kubernetes 来管理需要运行多个应用程序实例(即多个 Pod)的场景。这些是我的要求:

  1. 当我需要扩展我的应用程序时,我想在特定节点(不是随机节点)上部署一个 Pod。
  2. 当我需要缩减我的应用程序时,我想从特定节点(不是随机节点)中删除特定 Pod。
  3. 部署新 Pod 时,我希望它挂载我手动配置的特定 PersistentVolume(不是随机的)。
  4. 删除 Pod 后,我希望它的 PersistentVolume 可以被不同的 Pod 重用。

到目前为止,我使用这个简单的解决方案来完成上述所有工作:每次我需要创建应用程序的新实例时,我都会创建一个新的 Deployment(只有一个副本)和一个 PersistentVolumeClaim。例如,如果我需要五个应用程序实例,那么我需要五个部署。不过,这个解决方案的可扩展性不是很好,也没有充分发挥 Kubernetes 的潜力。

我认为为所有 Pod 使用一个模板会更聪明,但我不确定我应该使用 Deployment 还是 Statefulset。

我一直在试验标签和节点亲和力,我发现我可以满足要求 1,但我无法通过这种方式满足要求 2。为了满足要求 2,是否可以通过编写我自己的自定义调度程序来删除特定的 Pod?

我不明白 Kubernetes 是如何决定将特定的 PersistentVolume 绑定到特定的 PersistentVolumeClaim 的。有没有一种卷调度器?我可以以某种方式自定义它吗?这样,每次创建新 Pod 时,我都可以将其绑定到特定卷。

标签: kubernetesschedulingvolumepersistent

解决方案


这些要求可能有充分的理由,所以我不会试图说服你使用 Kubernetes 可能不是一个好主意......

是的 - 通过使用标签、节点亲和性反亲和性规则的 nodeSelector,可以在“适当的”节点上调度 Pod。

静态 Pod可能与您正在寻找的东西相近。我从来没有在 Kubernetes 上使用过静态 pods/bare pods ......他们有点不(引用问题中的一句话)“......充分利用 Kubernetes 的潜力”;-)

否则,我认为以下是针对四个要求的开箱即用构造:

像您一样使用部署 - 这将为您提供要求 #1 和 #2。我不相信 StatefulSet 可以满足要求 #2(实际上也不是 #1)。没有ReplicaSet

使用静态配置的 PV 和选择器来(引用)“...将特定的 PersistentVolume 绑定到特定的 PersistentVolumeClaim”以满足需求 #3。

然后要求 #4 将成为可能 - 只需确保 PV 使用正确的回收策略


推荐阅读