k8s是云时代的“操作系统”,对于k8s的理解,我们可以对照操作系统来学习理解。本篇我们对schduler组件进行简单理解。
Scheduler
先看一下k8s的部署图
k8s部署图
要理解的组件是Scheduler组件。
scheduler组件干啥的,顾名思义,这是一个调度器。和操作系统比较一下,操作系统的调度器有哪些关节概念:
- 调度进程
- 进程有优先级
- 分为抢占式调度和非抢占式调度。
下面我们对比一下。
k8s调度对象
操作系统调度的对象是进程,k8s调度的是什么呢,是Pod,Pod是k8s的最小调度对象。
进程中有占用的代码段、数据段、堆、进程指针等关键信息,Pod中的关键信息是什么。
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: test
image: test
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
如上Pod描述,关心的是cpu和memory,cpu是可压缩资源,memory是不可压缩资源,可压缩资源不够只会饥饿不会挂,不可压缩资源不够会挂掉。
其中limits对应的是操作系统底层的Cgroups 的 cpu.cfs_quota_us和memory.limit_in_bytes,request对应的是操作系统底层的cpu.shares。
k8s调度过程
k8s调度过程- 当通过apiServer提交了各种调度api对象到Etcd后,infomer会把需要调度的api对象从Etcd中取出,放入Priority Queue中。
- 在Scheduler Cache中缓存了集群相关信息, 调度器从Priority Queue中取出待调度api对象,从Scheduler Cache中取出集群节点信息,经过Predicates算法过滤出符合要求的Node信息,这里的要求就是Node可使用的cpu和memery是否满足Pod中的request的要求。Predictes 过滤有GeneralPredicates、Volume、宿主机、Pod等过滤规则。
- Priorities对过滤出的Node进行优先级筛选,选出最佳的Node。注意这里的Priorities是指一个模块组件而不是Pod的优先级。
- 当找到节点后,就把api对象和Node绑定起来,并更新相关的信息到Scheduler Cache和Etcd。
Pod的优先级
Pod的优先级是怎么定义的呢?见如下资源定义:
apiVersion: scheduling.k8s.io/v1beta1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
globalDefault: false
description: "This priority class should be used for high priority service pods only."
k8s默认的优先级最大值就是1000000。优先级越高,在上述k8s调度图中,该api对象会排在PriorityQueue的前面,会优先被调度。相比于操作系统的优先级定义,这里的优先级定义更加简单直接。
抢占式调度
和操作系统的占式调度相比,k8s的抢占式调度也是一样的,所不同的是,为了让高优先级的Pod调度成功,需要将低优先级的Pod给delete掉。
小结
k8s是云时代的“操作系统”是一个很好的比喻,既说明了k8s的价值,有说明了k8s的运转和操作系统类似。对于Scheduler的理解更加印证了这一点。
网友评论