Kubernetes 手记(17)- 调度策略
十七 调度策略
Master 主要是运行集群的控制平面组件的,apiserver、scheduler、controlermanager,Master 还依赖与 etcd 这样的存储节点。
kubeadm 部署的集群会将 Master 的控制组件都运行为静态 POD 了,从本质来讲,这些组件就是运行在 Master 节点专为集群提供服务的进程,Master 是不负责运行工作负载的。
node 节点是负责运行工作负载 POD 的相关节点,用户只需要将运行任务提交给 Master 就可以了,用户无需关心运行在哪个 node 节点上,Master 整合了所有 node 为一个虚拟的资源池。
17.1 POD 创建流程
用户创建的任务最终应该运行在哪个 node 节点上,是由 Master 节点上的 scheduler 决定的,而 scheduler 也是允许用户定义它的工作特性的,默认情况下,我们没有定义它,其实是使用的默认的 scheduler 调度器。
当我们使用 kubectl describe pods myapp 查看 POD 信息时候,会有一个 Events 字段中,有关于调度结果的相关信息。
Scheduler 会从众多的 node 节点中挑选出符合 POD 运行要求的节点,然后将选定的 node 节点信息记录在 etcd 中,kubelet 始终 waitch 着 apiserver 上的关于本节点的信息变化,kubelet 就会去 apiserver 获取关于变化信息的配置清单,根据配置清单的定义去创建 POD。
17.2 Service 创建过程
当用户创建一个 service 的时候,这个请求会提交给 apiserver,apiserver 将清单文件写入 etcd 中,然后每个 node 节点上的 kube-proxy 会 waitch apiserver 关于 service 资源的相关变动,发生变化时候,每个节点的 kube-proxy 会将 service 创建为 iptables/ipvs 规则。
从通信角度来讲:kubectl、kubelet、kube-proxy 都是 apiserver 的客户端,这些组件与 apiserver 进行交互时候,数据格式为 json,内部的数据序列化方式为 protocolbuff。
17.3 资源限制维度
资源需求:运行 POD 需要的最低资源需求
资源限制:POD 可以占用的最高资源限额
17.4 Scheduler 调度过程
预选阶段:排除完全不符合运行这个 POD 的节点、例如资源最低要求、资源最高限额、端口是否被占用
优选阶段:基于一系列的算法函数计算出每个节点的优先级,按照优先级排序,取得分最高的 node
选中阶段:如果优选阶段产生多个结果,那么随机挑选一个节点
POD 中影响调度的字段,在 kubectl explain pods.spec 中
其他影响调度的因素
节点亲和性调度:表现为 nodeSelector 字段
POD 间亲和性:POD 更倾向和某些 POD 运行在一起,例如同一个机房、同一个机器
POD 间反亲和性:POD 和某 POD 更倾向不能运行在一起,这叫反亲和性,例如:监听同一个 nodeport,有机密数据的
Taints(污点):给某些 node 打上污点,
Tolerations(污点容忍):一个 POD 能够容忍 node 上的污点,如果运行过程中 node 出现新的污点,那么 POD 可以
驱逐 POD:node 给一个限定的时间,让 POD 离开这个节点。
17.4 预选因素
下面的预选条件需要满足所有的预选条件才可以通过预选
CheckNodeConditionPred
GeneralPredicates
NoDiskConflict(默认没有启用)
PodToleratesNodeTaints
PodToleratesNodeNoExecuteTaints
CheckNodeLabelPresence(默认没有启用)
CheckServiceAffinity(默认没有启用)
MaxEBSVolumeCount
MaxGCEPDVolumeCount
10 MaxAzureDiskVolumeCount
CheckVolumeBinding
NoVolumeZoneConflict
CheckNodeMemoryPressure
CheckNodeDiskPressure
CheckNodePIDPressure
MatchInterPodAffinity
17.5 优选函数
在每个节点执行优选函数,将结果每个优选函数相加,得分最高的胜出。
least_requested.go
balanced_resource_allocation.go
node_prefer_avoid_pods.go
taint_toleration.go
selector_spreading.go
interpod_affinity_test.go
most_requested.go
node_label.go
image_locality.go
node_affinity.go
17.6 选择函数
当通过优选的节点有多个,那么从中随机选择一台
其他
自己将手记发在:https://github.com/redhatxl/awesome-kubernetes-notes欢迎一键三连
版权声明: 本文为 InfoQ 作者【雪雷】的原创文章。
原文链接:【http://xie.infoq.cn/article/384f17a1c536ac5491d9d49e9】。文章转载请联系作者。
评论