欢迎访问我的博客,你的支持,是我最大的动力!

马哥_K8s进阶实战(10)Pod资源调度

Docker 小马奔腾 356℃ 评论
目录:
[显示]

kube-scheduler将创建Pod请求分配到节点的过程

K8s调度器

默认调度器,基于资源可用性将Pod资源公平地分布于集群节点之上
完成调度操作的步骤:节点预选(Predicate)、节点优先级排序(Priority)、节点择优(Select)

常用预选策略

若预选后不存在任何节点满足,则Pod会置于Pending状态

1、CheckNodeCondition,检查是否可以在节点报告磁盘、网络不可用或未准备好时将Pod调度其上
2、HostName,Pod的spec.hostname属性时,检查
3、PodFitsHostPorts,Pod的spec.hostPort属性时,检查端口是否被占用
4、MatchNodeSelector,Pod的spec.nodeSelector属性时,检查节点标签
5、NoDiskConflict,Pod请求的存储卷在此节点是否可用
6、PodFitsResources,检查资源是否足够,标准为节点已分配的资源量(各容器requests值之和),注解中标记为critical的Pod资源不受影响
7、PodToleratesNodeTaints,Pod的spec.tolerations属性,仅关注NoSchedule和NoExecute两个效用标识的污点
8、PodToleratesNodeNoExecuteTaints,Pod的spec.tolerations属性,是否能接纳节点的NoExecute类型污点
9、CheckNodeLabelPresence,仅检查节点上指定的所有标签的存在性
10、CheckServiceAffinity,将相同Service的Pod对象放置在同一个或同一类节点上以提高效率
11、MaxEBSVolumeCount,检查节点已挂载的EBS存储卷数量是否超过设置的最大值,默认为39
12、MaxGCEPDVolumeCount,检查节点上已挂载的GCE PD 存储卷数量是否超过最大值,默认为16
13、MaxAzureDiskVolumeCount,检查节点上已挂载的Azure Disk存储卷数量是否超过最大值,默认为16
14、CheckVolumeBinding,检查节点上已绑定和未绑定的PVC是否满足需求
15、NoVolumeZoneConflict,在给定区域zone限制下,检查此节点部署的Pod对象是否存在存储卷冲突
16、CheckNodeMemoryPressure,若给定节点已报告内存资源压力过大,检查当前Pod是否可调度至该节点
17、CheckPodePIDPressure,检查节点PID资源压力
18、CheckNodeDiskPressure,检查节点磁盘资源压力
19、MatchInterPodAffinity,检查节点是否满足Pod对象亲和性或反亲和性条件
CheckNodeLabelPressence,CheckServiceAffinity为可配置策略,可接受参数;其他为静态策略
NoDiskConflict、PodToleratesNodeNoExecuteTaints、CheckNodeLabelPresence、CheckServiceAffinity没有包含在默认的预选策略中

常用优选函数

预选策略筛选并生成一个节点列表后,进入第二阶段的优选过程,该过程使用优选函数,并得到优先级分值,0表示不适用,10表示最适合

节点亲和调度

节点亲和性规则:硬亲和性 required 、软亲和性 preferred。
硬亲和性规则不满足时,Pod会置于Pending状态,软亲和性规则不满足时,会选择一个不匹配的节点
当节点标签改变而不再符合此节点亲和性规则时,不会将Pod从该节点移出,仅对新建的Pod对象生效

节点:自定义标签
Pod:标签选择器

节点硬亲和性

方式一:Pod使用 spec.nodeSelector (基于等值关系)
方式二:Pod使用 spec.affinity 支持matchExpressions属性 (复杂标签选择机制)

# 调度至 zone = foo 的节点
kubectl label nodes kube-node1 zone=foo

可有多个nodeSelectorTerms,相互间为逻辑或关系
同个nodeSelectorTerms下可有多个matchExpressions,各matchExpressions间为逻辑与关系
同个matchExpressions下可有多条标签选择规则,相互间为逻辑与关系

节点亲和性仅是节点预选策略中的一项,其他预选策略依然生效

节点软亲和性

柔性控制逻辑,当条件不满足时,能接受被编排于其他不符合条件的节点之上
权重 weight 定义优先级,1-100 值越大优先级越高

Pod资源亲和调度

Pod对象间亲和性,将一些Pod对象组织在相近的位置(同一节点、机架、区域、地区)
Pod对象间反亲和性,将一些Pod在运行位置上隔开

调度器将第一个Pod放置于任何位置,然后与其有亲和或反亲和关系的Pod据此动态完成位置编排
# 基于 MatchInterPodAffinity预选策略完成节点预选,基于 InterPodAffinityPriority优选函数进行各节点的优选级评估

位置拓扑,定义"同一位置"

Pod硬亲和调度

Pod亲和性描述一个Pod与具有某特征的现存Pod运行位置的依赖关系;即需要事先存在被依赖的Pod对象

# 被依赖Pod
kubectl run tomcat -l app=tomcat --image tomcat:alpine

kubectl explain pod.spec.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution.topologyKey

调度器先基于标签选择器查询拥有匹配标签的所有被依赖Pod,再获取它们所属节点的topologyKey指示的属性的标签值,再查询所有拥有匹配这些标签值的所有节点,从而完成节点预选,再根据优选函数计算节点优先级,挑选出运行新建Pod的节点

若节点标签在运行时发生更改,不再满足Pod亲和性规则时,该Pod会继续运行;即仅对亲建的Pod生效

Pod软亲和调度

Pod反亲和调度

Pod反亲和调度用于分散同一类应用,调度至不同的区域、机架或节点等
将 spec.affinity.podAffinity 替换为 spec.affinity.podAntiAffinity

反亲和调度也分为柔性约束和强制约束

污点和容忍度

污点 taints 是定义在节点上的键值型属性数据,用于让节点拒绝将Pod调度运行于其上,除非Pod有接纳节点污点的容忍度
容忍度 tolerations 是定义在Pod上的键值属性数据,用于配置可容忍的污点,且调度器将Pod调度至其能容忍该节点污点的节点上或没有污点的节点上
# 使用PodToleratesNodeTaints预选策略和TaintTolerationPriority优选函数完成该机制

节点亲和性使得Pod对象被吸引到一类特定的节点 (nodeSelector和affinity)
污点提供让节点排斥特定Pod对象的能力

定义污点和容忍度

污点定义于 nodes.spec.taints 容忍度定义于 pods.spec.tolerations
语法: key=value:effect
effect定义排斥等级:
NoSchedule,不能容忍,节点现存Pod不受影响
PreferNoSchedule,柔性约束,节点现存Pod不受影响
NoExecute,不能容忍,当污点变动时,Pod对象会被驱逐

在Pod上定义容忍度时:
1、等值比较 容忍度与污点在key、value、effect三者完全匹配
2、存在性判断 key、effect完全匹配,value使用空值

一个节点可配置多个污点,一个Pod也可有多个容忍度

管理节点的污点

键名常为 node-type/node-role/node-project/node-geo等,必要时带上域名,如node-type.ilinux.io等
同一个键值数据,effect不同,也属于不同的污点
添加污点:
kubectl taint node <node-name> <key>=<value>:<effect> ...
查看污点:
kubectl get nodes <nodename> -o go-template={{.spec.taints}}
删除污点:
kubectl taint node <node-name> <key>[:<effect>]-
kubectl patch nodes <node-name> -p '{"spec":{"taints":[]}}'

kubectl taint node kube-node1 node-type=production:NoSchedule
kubectl get nodes kube-node1 -o go-template={{.spec.taints}}
# 删除key为node-type,effect为NoSchedule的污点
kubectl taint node kube-node1 node-type:NoSchedule-
# 删除key为node-type的所有污点
kubectl taint node kube-node1 node-type-
# 删除所有污点
kubectl patch nodes kube-node1 -p '{"spec":{"taints":[]}}'

Pod对象容忍度

spec.tolerations字段添加
tolerationSeconds用于定义延迟驱逐不前Pod的时长

问题节点标识

自动为节点添加污点信息,使用NoExecute效用标识,会驱逐现有Pod
K8s核心组件通常都容忍此类污点

node.kubernetes.io/not-ready 节点进入NotReady状态时自动添加
node.alpha.kubernetes.io/unreachable 节点进入NotReachable状态时自动添加
node.kubernetes.io/out-of-disk 节点进入OutOfDisk状态时自动添加
node.kubernetes.io/memory-pressure 节点内存资源面临压力
node.kubernetes.io/disk-pressure 节点磁盘面临压力
node.kubernetes.io/network-unavailable 节点网络不可用
node.cloudprovider.kubernetes.io/uninitialized kubelet由外部云环境程序启动时,自动添加,待到去控制器初始化此节点时再将其删除

Pod优选级和抢占式调度

优选级,Pod对象的重要程度
优选级会影响节点上Pod的调度顺序和驱逐次序
一个Pod对象无法被调度时,调度器会尝试抢占(驱逐)较低优先级的Pod对象,以便可以调度当前Pod

Pod优选级和抢占机制默认处于禁用状态
启用:同时为kube-apiserver、kube-scheduler、kubelet程序的 --feature-gates 添加 PodPriority=true
使用:
事先创建优先级类别,并在创建Pod资源时通过 priorityClassName属性指定所属的优选级类别

 

转载请注明:轻风博客 » 马哥_K8s进阶实战(10)Pod资源调度

喜欢 (0)or分享 (0)