我想知道是否有办法将特定部署分配给特定节点池。
我打算使用 kubernetes 部署一个大型应用程序。我想知道是否有一种方法可以将部署分配给特定的节点池。换句话说,我们有 3 种类型的服务:
很明显,我们希望最好地将节点分配给特定的部署,这样就不会浪费资源,例如低层服务器节点池 X 将仅由一般服务部署使用,高层服务器节点池 Y 将仅由监控服务,最高层的服务器只会被模块服务使用。
我知道有大量文章讨论了 pod 关联性和其他相关内容,但我似乎无法找到与以下内容匹配的任何内容:
How to assign Deployment to specific node pool
提前致谢!
答案 0 :(得分:3)
另一种方式(除了 Yayotrón 提议的)是使用 NodeAffinity 和 AntiAffinity。有关更多信息,请查看此处的官方文档:https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/
污点和容忍非常严格,并且根本不可能在其他节点上进行调度。 使用 Affinity 和 Antiaffinity,您可以指定是严格限制 (RequiredDuringSchedulingIgnoredDuringExecution) 还是软限制 (PreferredDuring....)
答案 1 :(得分:2)
这可以使用 Taints and Tolerations 来实现。它们是什么的快速摘要(来自他们的文档):
<块引用>节点亲和性,是 Pod 的一个属性,它将它们吸引到一组节点(作为偏好或硬性要求)。污点则相反——它们允许一个节点排斥一组 Pod。
容忍应用于 Pod,并允许(但不要求) 将 pod 调度到具有匹配污点的节点上。
污点和容忍度协同工作以确保 Pod 不被 调度到不适当的节点上。一种或多种污点应用于 一个节点;这标志着节点不应该接受任何这样做的 pod 不能容忍污点。
或者简单地使用 NodeSelector
当您注册一个节点加入 kubernetes 集群时,您可以使用 kubelet --register-with-taints label=value --node-labels=label2=value2
指定污点和标签。
或者您可以将 kubectl taint 用于已注册的节点。
然后当你要部署一个 pod/deployment/statefulset 时,你可以指定它的 nodeSelector
和 Tolerations
spec:
nodeSelector:
label2: value2
tolerations:
- key: "label"
operator: "Equal"
value: "value"
effect: "NoSchedule"