之前学习kubernetes时,实际部署操作和理论知识并不能很好的连接起来,尤其是如何调度的过程有些模棱两可,下面是一些总结以及对于k8s资源管理的学习
用一句话简单来概括就是将Pod放到合适的Node上去
下面用图解来说明
k8s最主要的一个特点就是合理利用资源,那么这就体现在如何找到一个合适的节点,下面是具体描述
1.满足Pod资源要求
2.满足Pod的特殊关系要求
3.满足Node限制要求
4.做到集群资源合理利用
在了解资源管理之前,必须要明白在k8s中资源是如何被定义的。在 kubernetes 中,任何可以被申请、分配,最终被使用的对象,都是 kubernetes 中的资源,而最主要的就是内存和CPU
主要包含requests和limits
主要区别是requests为Pod底层最低所需资源,limits则为一种能力限制也是上限
Pod资源类型
CPU
memory
ephemeral-storage 临时存储
extended-resource:navida.com/gpu 扩展资源
例子
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
ResourceQuota
限制每个namespace资源用量
用法
per namespace
Scope :
Terminating /Not Terminating
BestEffort/NotBestEffort
PriorityClass
满足pod与pod关系要求
1.Pod亲和调度 PodAffinity
1>必须和某些Pod调度在一起 requiredDuringSchedulingIgnoredDuringExectuion
2>优先和某些Pod调度在一起 perferingDuringSchedulingIgnoredDuringExectuion
2.Pod反亲和调度 PodAffinity
与上述相同
NodeSelector
必须调度到呆了某些标签的label
1.Node亲和调度 NodeAffinity
1>必须调度到某些Node上 requiredDuringSchedulingIgnoredDuringExectuion
2>优先调度到某些Node上 perferingDuringSchedulingIgnoredDuringExectuion
通常有两种集群资源合理运用策略
1.先到先得(FIFO)
2.优先级策略 符合企业业务
2.1.1优先级调度配置
创建PriorityClass
为各个Pod配置上不同的PriorityClassName
2.1.2优先级调度过程
1.Pod2和Pod1先后进入调度队列,但均未被调度
2.当进行一轮调度时,PriorityQueue会优先Pop优先级更大的Pod1出队列镜像调度
3.调度成功后,对此Pod1进行Bind,并开始下一轮调度Pod2
图示(按顺序)
过程
1.Pod2先进性调度,调度成功后分配至Node1上运行
2.之后Pod1再进行调度,由于Node1资源不足出现了调度失败,此时进入抢占流程
3.经过抢占算法计算后,选中Pod2作为Pod1的让渡者
4.驱逐了Node1上运行的Pod2,并将Pod1调度至Node1
图示(按顺序)