k8s 调度
1、 k8s 架构
k8s的架构如图:
我们都知道k8s分为master、node,其中:
master 主要有如下几个组件:
Kubernetes Controller Manager(kube-controller-manager):Kubernetes资源对象的”大总管”,是所有资源对象的自动化控制中心,比如Deployment中的pod副本数
Kubernetes API Server (kube-apiserver):Kubernetes的“心脏”,是集群控制的入口进程,也是所有资源增、删、查、改等操作的唯一入口
Kubernetes Scheduler(kube-scheduler):Kubernetes的”调度室“,负责资源调度(Pod调度)
etcd:是用于共享配置和服务发现的分布式,一致性的KV存储系统,被用作Kubernetes集群后端数据的持久化存储
node 主要包含以下组件:
kubelet:负责Pod对应容器的创建、启停和销毁等任务
kube-proxy:与Kubernetes Service通信与负载均衡机制
Container Runtime:Docker Engine,负责本机容器的创建、启停与销毁等工作
2、k8s 调度
2.1 Pod 调度
这个过程看起来似乎比较简单,但实际生产环境的调度过程中,有很多问题需要考虑:
首先,如何保证全部计算节点调度的公平性?如何保证每个节点都能被分配资源?
其次,计算资源如何能够被高效利用?集群所有计算资源如何才能被最大化的使用?
再次,如何保证Pod调度的性能和效率?如何能够快速的对大批量的Pod完成调度到较优的计算节点之上?
最后,用户最了解自己的业务,用户是否可以根据实际需求定制自己的调度逻辑和策略?
2.2 Pod 调度过程
调度过程分为2个阶段:
第一阶段:预选过程,过滤节点,调度器用一组规则过滤掉不符合要求的主机。比如Pod指定了所需要的资源量,那么可用资源比Pod需要的资源量少的主机会被过滤掉。
第二阶段:优选过程,节点优先级打分,对第一步筛选出的符合要求的主机进行打分,在主机打分阶段,调度器会考虑一些整体优化策略,比如把容一个Replication Controller的副本分布到不同的主机上,使用最低负载的主机等。
代码位置(1.10 ):
https://github.com/kubernetes/kubernetes/tree/release-1.10/pkg/scheduler/algorithm
优选(Priorities)
经过预选策略(Predicates)对节点过滤,获取节点列表,再对符合需求节点列表进行打分,最终选择Pod调度到一个分值最高节点。
最终主机的得分用以下公式计算得出:
finalScoreNode = (weight1 * priorityFunc1) + (weight2 * priorityFunc2) + … + (weightn * priorityFuncn)
2.3 Node 定义
查看一个node的资源信息:
apiVersion: v1
kind: Node
metadata:
labels:
beta.kubernetes.io/arch: amd64
beta.kubernetes.io/os: linux
kubernetes.io/hostname: node-n1
name: node-n1
spec:
externalID: node-n1
status:
addresses:
- address: 10.162.197.135
type: InternalIP
allocatable:
cpu: "8"
memory: 16309412Ki
pods: "110"
capacity:
cpu: "8"
memory: 16411812Ki
pods: "110"
conditions: {...}
daemonEndpoints:
kubeletEndpoint:
Port: 10250
images: {...}
nodeInfo: {...}
2.4 Pod 定义
查看一个pod的资源信息:
kubectl explain pod.spec
我们看这个pod:
requests:申请范围是0到node节点的最大配置
limits:申请范围是requests到无限大,即0 <= requests <=Node Allocatable, requests <= limits <= Infinity。
说明:resoureces.limits影响pod的运行资源上限,不影响调度。
注释:
红色部分表示资源分配
浅蓝色表示采用的调度器
灰色表示普通调度策略
荧光色表示高级调度策略
2.5 k8s 调度器资源分配机制
基于Pod 中容器 request 资源“总和”调度