如何指定pod的运行节点?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何指定pod的运行节点?相关的知识,希望对你有一定的参考价值。

参考技术A

一般情况下kubernets可以通过kube-scheduler默认的调度策略合理的将pod分配到可用的节点上, 但是随着pod数量的增加以及不同pod对资源的使用情况不同我们需要更加合理的分配集群中的资源, 所以对一些pod运行节点的控制是由必要的。

源于硬件和软件层多样性,我们需要将某个 pod 调度到某些特定的节点上,例如指定机房,存储类型,网络类型等等:

有两种方法 nodeSelector 以及 affinity 可以实现对应的需求

K8S中pod的调度都是通过节点label实现的 , 所以对于除必要的节点label外对于其它用途也要做一些规划

设置参数

为 node 设置 taint 与 label:

or

删除taint:

删除node的label

查看 node上的 taint:

查看node1的label

kubernetes中是通过label-selector机制进行节点选择,由scheduler调度策略 MatchNodeSelector 进行label匹配,调度pod到目标节点,该匹配规则是强制约束。

类型包括:

限制方式:

匹配逻辑label

如果nodeAffinity中nodeSelector有多个选项,节点满足任何一个条件即可;如果matchExpressions有多个选项,则节点必须同时满足这些选项才能运行pod 。需要说明的是,node并没有anti-affinity这种东西,因为NotIn和DoesNotExist能提供类似的功能。

这个 pod 同时定义了 requiredDuringSchedulingIgnoredDuringExecution 和 preferredDuringSchedulingIgnoredDuringExecution 两种nodeAffinity。第一个要求 pod 运行在特定 devops 的节点上,第二个希望节点最好有对应的department:model和dedicated:app标签, 根据权重决定了顺序 NodeSelectorTerms 可以有多个,之间是或的关系,满足任意一个既满足, MatchExpressions 也可以有多个,他们之间是且的关系 必须都满足
preferredDuringSchedulingIgnoredDuringExecution 值为列表,根据权重决定顺序 MatchExpressions 值为列表 关系为且,必须都满足

PodAffinit是根据通过已运行在节点上的pod的标签而不是node的标签来决定被调度pod的运行节点,因为pod运行在指定的namespace所以需要自己指定运行pod的namesapce

上面这个例子中的 POD 需要调度到某个指定的主机上,至少有一个节点上运行了这样的 POD:这个 POD 有一个app=busybox-pod的 label。podAntiAffinity则是希望最好不要调度到这样的节点:这个节点上运行了某个 POD,而这个 POD 有app=node-affinity-pod的 label。根据前面两个 POD 的定义,我们可以预见上面这个 POD 应该会被调度到一个busybox-pod被调度的节点上,而node-affinity-pod被调度到了该节点以外的节点

对于nodeAffinity无论是硬策略还是软策略方式,都是调度 POD 到预期节点上,而Taints恰好与之相反,如果一个节点标记为 Taints ,除非 POD 也被标识为可以容忍污点节点,否则该 Taints 节点不会被调度pod。

比如用户希望把 Master 节点保留给 Kubernetes 系统组件使用,或者把一组具有特殊资源预留给某些 POD,则污点就很有用了,POD 不会再被调度到 taint 标记过的节点。taint 标记节点举例如下:

如果仍然希望某个 POD 调度到 taint 节点上,则必须在 Spec 中做出Toleration定义,才能调度到该节点,举例如下:

effect 共有三个可选项,可按实际需求进行设置:

设置label 和 taint, edgenode为特殊属性的节点所以需要设置taint

资源文件

运维服务部署在固定的几台主机上, 每个主机设置 department 的label, 部署服务时指定该label

设置label

资源文件

以上是关于如何指定pod的运行节点?的主要内容,如果未能解决你的问题,请参考以下文章

如何优雅的限制 Kubernetes 节点上运行的 Pod 数量

K8s 节点断开连接后,本在运行的 Pod 会如何?

k8s:将pod部署到指定的node运行(pod&node选择部署策略)

如何在 GKE 上调试节点健康错误?

kubernetes pod重新调度,部署到不同的命名空间后会在不同的节点上运行。

Kubernetes Node Affinity