【问题标题】:Kubernetes: customizing Pod scheduling and Volume schedulingKubernetes:自定义 Pod 调度和 Volume 调度
【发布时间】:2018-11-12 10:05:41
【问题描述】:

我正在尝试使用 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 时,我都可以将其绑定到特定的卷。

【问题讨论】:

    标签: kubernetes scheduling volume persistent


    【解决方案1】:

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

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

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

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

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

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

    那么要求 #4 将成为可能 - 只需确保 PV 使用正确的 reclaim policy。

    【讨论】:

    • 通过使用部署(就像我现在尝试做的那样),我可以通过使用标签和节点亲和度来满足 #1,但这些仅在计划时考虑,而不是在执行时考虑.这意味着如果我从特定节点删除标签,则不会删除在该节点上运行的 Pod(不满足 #2)。或者我在这里错过了什么?我已经尝试过删除标签并将副本数减一,但它没有按预期工作。此外,一个 Deployment 构成了所有 Pod 的单一“模板”。我可以为 Deployment 的每个 Pod 指定一个 PVC 吗?如果有,怎么做?
    • 如果我不清楚,我很抱歉。通过说“......像你[一直]那样使用部署”我的意思是你所描述的“......一个新的部署(只有一个副本)和一个 PersistentVolumeClaim”,用于应用程序的每个新实例。
    • 哦,好的。是的,我已经设法让它以这种方式工作,但我现在仍然想改进我的解决方案:)
    猜你喜欢
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 2020-10-02
    • 2019-09-17
    • 2019-01-01
    • 1970-01-01
    相关资源
    最近更新 更多