kubernetes - Kubernetes:自定义 Pod 调度和 Volume 调度
问题描述
我正在尝试使用 Kubernetes 来管理需要运行多个应用程序实例(即多个 Pod)的场景。这些是我的要求:
- 当我需要扩展我的应用程序时,我想在特定节点(不是随机节点)上部署一个 Pod。
- 当我需要缩减我的应用程序时,我想从特定节点(不是随机节点)中删除特定 Pod。
- 部署新 Pod 时,我希望它挂载我手动配置的特定 PersistentVolume(不是随机的)。
- 删除 Pod 后,我希望它的 PersistentVolume 可以被不同的 Pod 重用。
到目前为止,我使用这个简单的解决方案来完成上述所有工作:每次我需要创建应用程序的新实例时,我都会创建一个新的 Deployment(只有一个副本)和一个 PersistentVolumeClaim。例如,如果我需要五个应用程序实例,那么我需要五个部署。不过,这个解决方案的可扩展性不是很好,也没有充分发挥 Kubernetes 的潜力。
我认为为所有 Pod 使用一个模板会更聪明,但我不确定我应该使用 Deployment 还是 Statefulset。
我一直在试验标签和节点亲和力,我发现我可以满足要求 1,但我无法通过这种方式满足要求 2。为了满足要求 2,是否可以通过编写我自己的自定义调度程序来删除特定的 Pod?
我不明白 Kubernetes 是如何决定将特定的 PersistentVolume 绑定到特定的 PersistentVolumeClaim 的。有没有一种卷调度器?我可以以某种方式自定义它吗?这样,每次创建新 Pod 时,我都可以将其绑定到特定卷。
解决方案
这些要求可能有充分的理由,所以我不会试图说服你使用 Kubernetes 可能不是一个好主意......
是的 - 通过使用标签、节点亲和性和反亲和性规则的 nodeSelector,可以在“适当的”节点上调度 Pod。
静态 Pod可能与您正在寻找的东西相近。我从来没有在 Kubernetes 上使用过静态 pods/bare pods ......他们有点不(引用问题中的一句话)“......充分利用 Kubernetes 的潜力”;-)
否则,我认为以下是针对四个要求的开箱即用构造:
像您一样使用部署 - 这将为您提供要求 #1 和 #2。我不相信 StatefulSet 可以满足要求 #2(实际上也不是 #1)。没有ReplicaSet。
使用静态配置的 PV 和选择器来(引用)“...将特定的 PersistentVolume 绑定到特定的 PersistentVolumeClaim”以满足需求 #3。
然后要求 #4 将成为可能 - 只需确保 PV 使用正确的回收策略。
推荐阅读
- powershell - 通过运行最多 3 个增量的循环来检查 Windows 服务状态是否正在运行
- php - 尝试使用 ajax 表单而不是表单操作(解决)
- javascript - 可观察或观察者中的错误处理?
- java - 多线程中的 Java 数据库连接共享
- nginx - 单个 NGINX 入口控制器,用于在不同命名空间中具有资源的子域
- iis - 在 IIS 中删除默认网站是一种好习惯吗?
- angular - 如何在 DOM 中使用有限项定义 @input
- java - 如何使用构造函数中传递的数组为数组赋值?
- javascript - 过滤器包含 false 不是函数
- html - Heebo Google Font - 奇怪出现的特殊字符