简介
① 公平:如何保证每个节点都能被分配资源
② 资源高效利用:集群所有资源最大化被使用
③ 效率:调度的性能要好,能够尽快地对大批量的 pod 完成调度工作
④ 灵活:允许用户根据自己的需求控制调度的逻辑
调度过程
预选
PodFitsResources:节点上剩余的资源是否大于 Pod 请求的资源
PodFitsHost:如果 Pod 指定了 NodeName,检查节点名称是否和 NodeName 匹配
PodFitsHostPorts:节点上已经使用的 port 是否和 Pod 申请的 port 冲突
PodSelectorMatches:过滤掉和 Pod 指定的 label 不匹配的节点
NoDiskConflict:已经 mount 的 volume 和 Pod 指定的 volume 不冲突,除非它们都是只读的
CheckNodeDiskPressure:检查节点磁盘空间是否符合要求
CheckNodeMemoryPressure:检查节点内存是否够用
优选
LeastRequestedPriority:通过计算 CPU 和内存的使用率来决定权重,使用率越低权重越高,当然正常肯定也是资源是使用率越低权重越高,能给别的 Pod 运行的可能性就越大
SelectorSpreadPriority:为了更好的高可用,对同属于一个 Deployment 或者 RC 下面的多个 Pod 副本,尽量调度到多个不同的节点上,当一个 Pod 被调度的时候,会先去查找该 Pod 对应的 controller,然后查看该 controller 下面的已存在的 Pod,运行 Pod 越少的节点权重越高
ImageLocalityPriority:就是如果在某个节点上已经有要使用的镜像节点了,镜像总大小值越大,权重就越高
NodeAffinityPriority:这个就是根据节点的亲和性来计算一个权重值
{ "kind" : "Policy",
"apiVersion" : "v1",
"predicates" : [
{"name" : "PodFitsHostPorts"},
{"name" : "PodFitsResources"},
{"name" : "NoDiskConflict"},
{"name" : "NoVolumeZoneConflict"},
{"name" : "MatchNodeSelector"},
{"name" : "HostName"}
],
"priorities" : [
{"name" : "LeastRequestedPriority", "weight" : 1},
{"name" : "BalancedResourceAllocation", "weight" : 1},
{"name" : "ServiceSpreadingPriority", "weight" : 1},
{"name" : "EqualPriority", "weight" : 1}
]
}
节点亲和性
pod.spec.affinity.nodeAffinity.
preferredDuringSchedulingIgnoredDuringExecution(优先执行计划):软策略
requiredDuringSchedulingIgnoredDuringExecution(要求执行计划):硬策略
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: NotIn
values:
- k8s-node02 #node的hostname不存在node02,硬策略
kubectl get node --show-labels kubectl describe nodes k8s-node01
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 60
preference:
matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-node-223-65
键值运算关系
① In:label 的值在某个列表中
② NotIn:label 的值不在某个列表中
③ Gt:label 的值大于某个值
④ Lt:label 的值小于某个值
⑤ Exists:某个 label 存在
⑥ DoesNotExist:某个 label 不存在
pod亲和性
pod.spec.affinity.podAffinity指定pod与pod在同一拓扑域podAntiAffinitypod指定pod与pod不在同一拓扑域
podAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- pod-2
topologyKey: kubernetes.io/hostname #符合app这个key的值是pod-2时,会调度到与topologyKey指定的key相同的节点上
podAntiAffinity: #反亲和性
requiredDuringSchedulingIgnoredDuringExecution: # 硬策略
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- busybox-pod
topologyKey: kubernetes.io/hostname
指定调度节点
spec:
nodeSelector:
type: backEndNode1 #调度到type值为backEndNode1的node节点上