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

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

猜你喜欢

转载自blog.csdn.net/qq_46595591/article/details/107620114