Scheduler调度器
Scheduler调度器:
k8s组件的工作关系:
创建pod:
- 客户端(kubectl)请求apiserver做相应的操作,api-server会进行认证(serviceaccount),授权检查(role等),都通过了则进行资源调度
- 调度器(scheduler)会在各个节点根据算法进行调度选择,最后api-server会把调度结果保存在etcd中,然后api-server根据调度结果发送对应node上kubelet的指令
- kubelet会监听api-server中关于自身节点的信息,需要执行操作时,去api-server中获取相关操作的配置清单,在本地创建pod
创建service:
kubectl创建service时走完前面相同的流程,但最后一步不由kubeletc管理,而是由kube-proxy管理,kube-proxy会根据api-server中的配置清单创建相应的iptables或ipvs规则
调度器调度过程:
分为两步: 过滤、打分
实际上可具体到3步,打分步骤后还有具体的绑定过程
- 预选过程(Predieata):根据运行最低要求,排除不达标的节点
- 优选过程(prority):使用算法计算,对各个满足要求的节点进行打分,得出优先级,选出得分最高的那个节点
- 绑定过程(Select):将pod绑定在得分最高的节点。如果有多个得分最高,则随机选择
特殊节点选择:
这些是可以影响预选、优选过程的方式
pod资源定义:
- 运行在指定名称的节点
- 运行在指定标签的节点
亲和性:
- nodeSelector,节点亲和性
- pod
- 偏向于把2个pod运行在同一位置,叫pod亲和性
- 偏向于把2个pod运行在不同位置,叫pod反亲和性(httpd和nginx就需要反亲和性)
污点(Taints)和污点容忍(Tolerations):
污点定义在节点上,污点容忍定义在pod
- 污点可理解为A的不良习惯,如抽烟、酗酒
- 污点容忍可理解为B能够忍受的习惯,如B容忍A抽烟
预选策略:
各个策略之间是"&&"关系,一个不满足就否定
CheckNodeCondition #检查节点是有运行正常
GeneralPredicates #通用预选策略
HostName #检查Pod资源是否定义了:pod.spec.hostname,如果此资源在节点上已经被占用了,就排除
PodFitsHostPorts #检查Pod资源是否定义了:pod.spec.containers.ports.hostPort,如果节点上此资源被占用,就排除
MatchNodeSelector #匹配pod.spec.nodeSelector,节点的标签不能匹配就排除
PodFitResources #检查节点的资源是否满足最低运行环境
NoDiskConfiict #默认未启用,检查是否能满足Pod依赖的存储卷
PodToleratesNodeTaints #检查pod.spec.tolerations中定义的容忍污点,能否完全容忍节点的污点
PodToleratesNodeExecuteTaints #默认未启用,检查特殊的污点。一般情况下,pod能够容忍污点,调度到一个node上,后来node的污点改成pod不能容忍的污点,pod不会被赶走,但execute类型的污点相反,改动到不能容忍了就被赶走
CheckNodeLabelPresence #默认未启用,检查节点标签能否允许pod调度
CheckServiceAffinity #默认未启用。已经存在一个svc,并在A、B节点创建了pod,新建的pod更亲和在已有svc的A、B节点创建
MaxEBSVolumeCountPred #aws云存储挂载是否超出上限,最大挂载39个,默认启用
MaxGCEPDVolumeCountPred #谷歌云存储上限,最大16个,默认启用
MaxAzureDiskVolumeCountPres #Azure云存储挂载上限。默认启用
CheckVolumeBindind #检查节点上的pvc绑定
NoVolumeZoneConflict #检查节点的存储区域、存储卷是否与pod冲突
CheckNodeMemoryPressure #检查节点内存是否压力过大
CheckNodePIDPressure #检查节点的PID是否压力过大
CheckNodeDiskPressue #检查节点磁盘IO是否压力过大
MatchInterPodAffinity #检查pod亲和性和反亲和性
优选函数:
每个函数的得分最大都是10分,最后算总分
LeastRequested #计算最空闲的主机
总得分=(cpu+mem)/2
cpu=(总容量-(正在被pod请求占用的容量))/总容量*10
mem=(总容量-(正在被pod请求占用的容量))/总容量*10
例:
cpu=(16c-8c)/16c*10=5
mem=(32G-8G)/32G*10=7.5
总分=(5+7.5)/2=6.25
BalanceResourceAllocation #cpu和内存资源使用率相近的胜出,结合上一个函数
例: 50%cpu和50%内存
NodePreferAvoidPods #根据节点的注解信息判定:scheduler.alpha.kubernetes.io/preferAvoidPods。没有此注解信息时,得分10,权重是10000,所以没有就能运行。此注解对pod运行有很大决定权
TaintToleration #污点容忍度打分,用pod.spec.tolerations的容忍列表与节点的污点做匹配,匹配度越高,分越低
SelectorSpreading #标签选择器分散度,A节点运行一个标签app:t1的pod,B、C没有标签为app:t1的pod,则B、C分最高
InterPodAffinity #pod亲和性匹配度越高的得分越高,A有2点亲和性满足,B有4点亲和性满足,则B有4分
NodeAffinity #节点亲和性
MostRequested #默认未启用,节点资源使用量越大的,分月高,与leastreuqest相反,一般两者取其一使用
NodeLabel #默认未启用,node标签判断,只要有标签就得分
ImageLocality #默认未启用,根据满足当前pod对象需要的已有镜像的体积之和计算

浙公网安备 33010602011771号