nodeName # 直接指定 POD 的运行节点
nodeSelector # 根据 node 上的标签来对 node 进行预选,这就是节点的亲和性
- 其他影响调度的因素
节点亲和性调度:表现为 nodeSelector 字段
POD 间亲和性:POD 更倾向和某些 POD 运行在一起,例如同一个机房、同一个机器
POD 间反亲和性:POD 和某 POD 更倾向不能运行在一起,这叫反亲和性,例如:监听同一个 nodeport,有机密数据的
Taints(污点):给某些 node 打上污点,
Tolerations(污点容忍):一个 POD 能够容忍 node 上的污点,如果运行过程中 node 出现新的污点,那么 POD 可以
驱逐POD:node 给一个限定的时间,让 POD 离开这个节点。
17.4 预选因素
下面的预选条件需要满足所有的预选条件才可以通过预选
- CheckNodeConditionPred
检查节点是否正常复制代码
- GeneralPredicates
子策略 | 作用 |
HostName | 检查主机名称是不是 pod.spec.hostname 指定的 NodeName |
PodFitsHostPorts | 检查 Pod 内每一个容器 pods.spec.containers.ports.hostPort 清单是否已被其它容器占用,如果有所需的 HostPort 不满足需求,那么 Pod 不能调度到这个主机上 |
MatchNodeSelector | 检查 POD 容器上定义了 pods.spec.nodeSelector 查看 node 标签是否能够匹配 |
PodFitsResources | 检查 node 是否有足够的资源运行此 POD 的基本要求 |
- NoDiskConflict(默认没有启用)
检查 pod 定义的存储是否在 node 节点上使用。复制代码
- PodToleratesNodeTaints
检查节点的污点 nodes.spec.taints 是否是 POD 污点容忍清单中 pods.spec.tolerations 的子集复制代码
- PodToleratesNodeNoExecuteTaints
检查 pod 是否容忍节点上有 NoExecute 污点。NoExecute 这个污点是啥意思呢。如果一个 pod 上运行在一个没有污点的节点上后,这个节点又给加上污点了,那么 NoExecute 表示这个新加污点的节点会驱逐其上正在运行的 pod;不加 NoExecute 不会驱逐节点上运行的 pod,表示接受既成事实,这是默认策略。复制代码
- CheckNodeLabelPresence(默认没有启用)
检查节点上指定标签的存在性,如果节点有pod指定的标签,那么这个节点就被选中。复制代码
- CheckServiceAffinity(默认没有启用)
一个 Service 下可以有多个 POD,比如这些 POD 都运行在 1、2、3 机器上,而没有运行在 4、5、6 机器上,那么CheckServiceAffinity 就表示新加入的 POD 都集中运行在 1、2、3 机器上,这样集中好处是一个 Service 下 POD 之间内部通信的效率变高了。复制代码
- MaxEBSVolumeCount
确保已挂载的亚马逊 EBS 存储卷不超过设置的最大值,默认39复制代码
- MaxGCEPDVolumeCount
确保已挂载的GCE存储卷不超过设置的最大值,默认16复制代码
10 MaxAzureDiskVolumeCount
确保已挂载的Azure存储卷不超过设置的最大值,默认16复制代码
- CheckVolumeBinding
检查节点上的 PVC 是否被别的 POD 绑定了复制代码
- NoVolumeZoneConflict
检查给定的 zone (机房) 限制前提下,检查如果在此主机上部署 POD 是否存在卷冲突复制代码
- CheckNodeMemoryPressure
检查 node 节点上内存是否存在压力复制代码
- CheckNodeDiskPressure
检查磁盘 IO 是否压力过大复制代码
- CheckNodePIDPressure
检查 node 节点上 PID 资源是否存在压力复制代码
- MatchInterPodAffinity
检查 Pod 是否满足亲和性或者反亲和性复制代码
17.5 优选函数
在每个节点执行优选函数,将结果每个优选函数相加,得分最高的胜出。
- least_requested.go
选择消耗最小的节点(根据空闲比率评估 cpu(总容量-sum(已使用)*10/总容量))复制代码
- balanced_resource_allocation.go
均衡资源的使用方式,表示以 cpu 和内存占用率的相近程度作为评估标准,二者占用越接近,得分就越高,得分高的胜出。复制代码
- node_prefer_avoid_pods.go
看节点是否有注解信息 "scheduler.alpha.kubernetes.io/preferAvoidPods" 。没有这个注解信息,说明这个节点是适合运行这个 POD 的。复制代码
- taint_toleration.go
将 pods.spec.tolerations 与 nodes.spec.taints 列表项进行匹配度检查,匹配的条目越多,得分越低。复制代码
- selector_spreading.go
查找当前 POD 对象对应的 service、statefulset、replicatset 等所匹配的标签选择器,在节点上运行的带有这样标签的 POD 越少得分越高,这样的 POD 优选被选出。 这就是说我们要把同一个标签选择器下运行的 POD 散开(spreading)到多个节点上。复制代码
- interpod_affinity_test.go
遍历 POD 对象亲和性的条目,并将那些能够匹配到节点权重相加,值越大的得分越高,得分高的胜出。复制代码
- most_requested.go
表示尽可能的把一个节点的资源先用完,这个和 least_requested 相反,二者不能同时使用。复制代码
- node_label.go
根据节点是否拥有标签,不关心标签是什么,来评估分数。复制代码
- image_locality.go
表示根据满足当前 POD 对象需求的已有镜的体积大小之和来选择节点的。复制代码
- node_affinity.go
根据 POD 对象中的 nodeselector,对节点进行匹配度检查,能够成功匹配的数量越多,得分就越高。复制代码
17.6 选择函数
当通过优选的节点有多个,那么从中随机选择一台