Scheduler调度器

Scheduler调度器:

k8s组件的工作关系:

创建pod:

  1. 客户端(kubectl)请求apiserver做相应的操作,api-server会进行认证(serviceaccount),授权检查(role等),都通过了则进行资源调度
  2. 调度器(scheduler)会在各个节点根据算法进行调度选择,最后api-server会把调度结果保存在etcd中,然后api-server根据调度结果发送对应node上kubelet的指令
  3. kubelet会监听api-server中关于自身节点的信息,需要执行操作时,去api-server中获取相关操作的配置清单,在本地创建pod

创建service:

kubectl创建service时走完前面相同的流程,但最后一步不由kubeletc管理,而是由kube-proxy管理,kube-proxy会根据api-server中的配置清单创建相应的iptables或ipvs规则

调度器调度过程:

分为两步: 过滤、打分
实际上可具体到3步,打分步骤后还有具体的绑定过程

  1. 预选过程(Predieata):根据运行最低要求,排除不达标的节点
  2. 优选过程(prority):使用算法计算,对各个满足要求的节点进行打分,得出优先级,选出得分最高的那个节点
  3. 绑定过程(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对象需要的已有镜像的体积之和计算
posted @ 2022-09-02 16:00  suyanhj  阅读(166)  评论(0)    收藏  举报