kubernetes中的调度和资源管理(QoS,优先级,抢占)

之前学习kubernetes时,实际部署操作和理论知识并不能很好的连接起来,尤其是如何调度的过程有些模棱两可,下面是一些总结以及对于k8s资源管理的学习

一、调度过程

用一句话简单来概括就是将Pod放到合适的Node上去
下面用图解来说明

1.开始有一个Yaml文件

在这里插入图片描述

2.提交完Yaml文件后,APIServer将待创建的请求路由给Controllers进行校验

在这里插入图片描述

3.校验完后,创建一个Pod,但此时namespace为空,phase为pending

在这里插入图片描述

4.Kube-Scheduler观察到新创建的Pod namespace为空,视为待调度

在这里插入图片描述

5.通过一系列计算,Kube-Scheduler找出最适合的节点Node1,并更新namespace

在这里插入图片描述

6.在Node1上的Kubelet观察到此Pod将其拉到Node1上进行一系列的资源配置,最后将状态改为running

在这里插入图片描述

7.合适的节点选择

k8s最主要的一个特点就是合理利用资源,那么这就体现在如何找到一个合适的节点,下面是具体描述
1.满足Pod资源要求
2.满足Pod的特殊关系要求
3.满足Node限制要求
4.做到集群资源合理利用

二、资源管理

在了解资源管理之前,必须要明白在k8s中资源是如何被定义的。在 kubernetes 中,任何可以被申请、分配,最终被使用的对象,都是 kubernetes 中的资源,而最主要的就是内存和CPU

1.基础调度

1.1Resources

主要包含requests和limits
主要区别是requests为Pod底层最低所需资源,limits则为一种能力限制也是上限

Pod资源类型
CPU
memory
ephemeral-storage 临时存储
extended-resource:navida.com/gpu 扩展资源

例子
在这里插入图片描述

1.2 Pod QoS

kubernetes 支持用户容器通过 request、limit 两个字段指定自己的申请资源信息
那么根据容器指定资源的不同情况,Pod 也被划分为 3 种不同的 QoS(Quality of Service) 级别

Guaranteed 高 保障
Burstable 中 弹性
BestEffort 低 尽力而为

那么如何实现使用Pos QoS使用
1.Guaranteed
CPU/memory 必须request==limits,其余资源可不等

在这里插入图片描述
2.Burstable
CPU/memory requests不等于limits

在这里插入图片描述
3.BestEffort
所有资源requests和limits必须都不填

在这里插入图片描述
不同QoS的表现
1.调度表现不同:调度器会使用requets进行调度
2.底层调度表现不同
CPU按照request划分权重
CPU ——manager——policy=static
guaranteed整数会绑核
memory按照QoS划分OOMScore
Guaranteed -998
Burstable 2-999
BestEffort 1000

在这里插入图片描述
Eviction
优先BestEffort
kubelet -CPU Manager

1.3 资源Quota

ResourceQuota
限制每个namespace资源用量

用法
per namespace
Scope :
Terminating /Not Terminating
BestEffort/NotBestEffort
PriorityClass

在这里插入图片描述

1.4Pod 亲和调度

满足pod与pod关系要求

1.Pod亲和调度 PodAffinity

1>必须和某些Pod调度在一起 requiredDuringSchedulingIgnoredDuringExectuion
在这里插入图片描述
2>优先和某些Pod调度在一起 perferingDuringSchedulingIgnoredDuringExectuion

在这里插入图片描述
2.Pod反亲和调度 PodAffinity
与上述相同

1.5Node亲和调度

NodeSelector
必须调度到呆了某些标签的label

1.Node亲和调度 NodeAffinity

1>必须调度到某些Node上 requiredDuringSchedulingIgnoredDuringExectuion
在这里插入图片描述
2>优先调度到某些Node上 perferingDuringSchedulingIgnoredDuringExectuion

2.高级调度

通常有两种集群资源合理运用策略
1.先到先得(FIFO)
2.优先级策略 符合企业业务

2.1优先级Priority

2.1.1优先级调度配置
创建PriorityClass
为各个Pod配置上不同的PriorityClassName

在这里插入图片描述
2.1.2优先级调度过程
1.Pod2和Pod1先后进入调度队列,但均未被调度
2.当进行一轮调度时,PriorityQueue会优先Pop优先级更大的Pod1出队列镜像调度
3.调度成功后,对此Pod1进行Bind,并开始下一轮调度Pod2

图示(按顺序)
在这里插入图片描述
在这里插入图片描述

2.2抢占

过程
1.Pod2先进性调度,调度成功后分配至Node1上运行
2.之后Pod1再进行调度,由于Node1资源不足出现了调度失败,此时进入抢占流程
3.经过抢占算法计算后,选中Pod2作为Pod1的让渡者
4.驱逐了Node1上运行的Pod2,并将Pod1调度至Node1

图示(按顺序)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述