深入理解 K8S 资源管理和调度|青训营笔记
这是我参与「第四届青训营」笔记创作活动的的第14天。
一、课程概述
- Kubernetes简介
- Kubernetes资源管理
- Kubernetes调度
二、详细内容
1. Kubernetes简介
K8S核心功能、设计准则、架构、组件
1.1 容器
- 无容器情况下,每个VM有自己的OS
- 容器化下,基于主机的OS上进行Docker编排和分布
1.2 Kubernetes定义
- 应用数量大难以管理/编排困难/出问题难以恢复
- 特点:便携、可扩展、开源的容器管理平台
1.3 K8S核心概念
- Pod:最基本的单位;由一个或多个container组成;最小的应用单位
- Deployment/StatefulSet:pod的集合(把提供相同功能的应用分为多个实例,多个pod集合);只需要写deployment部署和实例个数,便可创建多个相同的pod;
- statefulSet更强调stateful,每个pod可以有不同的存储空间各自工作,pod之间不能完全替代彼此
- deployment内有template,写好后可以创建多份一样的
- stateful set比deployment多了VolumnClaim,因此每个pod可以有自己的数据
- 存储
- volume:原始的使用存储的方式(需要写死在pod中,不方便配置/不能自动化管理)
- PVC/PV:进行封装;PVC持久化存储声明(用户配置);PV关联到NFS上具体的存储地点
- StorageClass:类存储;自动化创建多块存储空间,无需管理员手动创建多个存储实例;声明存储空间,同时关联PVC自动调取NFS创建空间;
- Node:由多个节点构成
- 控制面:高层控制
- 数据面:数据存储节点
- allocatable:可分配的节点、存储大小;比capacity小因为系统占用资源;
- capacity:物理上的资源;
1.4 K8S设计准则
- declarative > imperative:声明式而非命令式;声明理想状态而K8S决定如何达到;
- control loops:observe/rectify/repeat 控制循环
- simple > complex:把简单留给客户(靠封装提供简单接口)
- modularity:components/interfaces/plugins 模块化
- legacy compatible:向下兼容
1.5 K8S架构
- ETCD:持久化数据中心;维护集群中所有数据的有序性和一致性;事件机制同步数据变更;
- APIServer:对所有组件提供API接口;负责admission、鉴权功能;提供后端ETCD数据cacher,降低ETCD压力;结合ETCD提供list-watch机制
- controller-manager:提供一系列控制器,负责维护各种对象的生命周期;(Node controller,PV Controller, Deployment controller, stateful controller等)
- scheduler:负责应用实例的调度;把pod绑定到合适Node;
- kubelet:基于pod声明,真正开始启动容器,负责容器生命周期维护;
- kube-proxy:网络代理,负责维护节点网络规则,接管pod出入流量;
1.6 K8S核心通信机制 List-Watch
- custom controller:利用resource event handlers把操作放入workqueue队列中,通过queue进行processing
- client-go
- api收到事件,reflector先生成list,然后watchAPI;watch是增量更新
- reflector生成一个object放入delta-fito queue;
- pop到informer,加到indexer中存储object和key;同时informer调用event handler向custom controller提交object
1.7 K8S核心功能
- 服务发现和负载均衡
- 存储编排
- 自动发布回滚
- 自愈
- 密钥和配置管理
- 资源管理和应用编排调度
2. 资源管理
资源管理方法:上报、维护、分配、回收
2.1 资源种类
- 计算类
- CPU/memory/hugepages/GPU:原生提供
- Socket/Numa:拓展plugin
- 存储类
- Ephemeral Storage/NFS/GlusterFS/RBD/Cinder
- 自定义Storage
2.2 资源上报
- kubelet
- cAdvisor:采集器,采集机器信息上报给node status setter;
- Device manager:有一套RPC的device plugin机制,通过device agent上报回收资源;manager上报NSS写入Node API object;
- node status setter:根据上报数据更新Node API object;
- 节点资源样例
- capacity:socket数、GPU数、CPU数、storage和memory大小
- alocatible同上
2.3 资源分配
- kubelet
- Pod/Container上报给container manager
- container manager向Cgroup manager allocate CPU
- 向device manager上报allocate GPU等
- 存储卷
- Pod/PVC向controller-manager中的PV controller/provisioner创建PVC大小的volumn,同时关联和PVC/PV绑定;再传给attach controller向机器绑定;
- controller-manager向kubelet的volume manager提供volumn信息;kubelet可以对盘进行格式化,再传递给mounter
- mounter把相关存储mount提供给pod/PVC使用
2.4 状态维护
- 存储卷管理
- controller-manager
- PV controller
- protection controller:数据保护
- attach/detach controller:网络快设备存储
- volume manager - Kubelet
- controller-manager
- 计算资源管理 Kubelet
- Cgroup manager:CPU类资源
- device manager:扩展类资源
- eviction manager:申请资源超量后干掉
2.5 资源回收
- 反向运行资源分配机制
- 相关controller要控制顺序
3. 调度
调度机制、流程
3.1 资源申请
- requests:至少需要的CPU/Memory/storage
- limits 上限需要的资源量
3.2 调度流程
graph TD
开始 --> A[过滤节点]
A-->|成功| 给节点打分 -->给节点排序-->选择最合适节点-->结束
A-->|失败| B[尝试抢占节点]
B-->|成功|给节点排序-->选择最合适节点-->结束
B-->|失败|调度失败-->进入调度队列等待下一轮-->结束
3.3 调度步骤
- 过滤
- pre-filter:进行全局准备防止流程中多次重复计算
- filter:基于pod的约束,进行pod->node匹配
- post-filter:若没有合适节点进行抢占行为,驱逐低优先级任务,看能否找到合适节点
- 打分
- 基于过滤节点打分,按分值进行排序
- 若没有合适节点直接失败
- 任务分配
-
reserve:在调度器cache里缓存调度结果,解决异步api操作带来的时延问题
-
permit:扩展接口、支持扩展语音
- 失败:返回调度失败结果
- 成功:直接通过
- 等待:异步等待,不阻塞其他流程
-
pre-bind:任务运行前准备操作
-
bind:pod绑定到node
-
4.Kubernetes发展
4.1 发展方向
- 非原生资源的精细化管理能力
- 动态资源接入、管理能力
- 调度功能和性能
- 调度质量
4.2 K8S vs YARN
- 基本单位:pod/container
- 资源管理
- 资源种类
- 扩展能力
- 调度模式
- K8S:task -> node
- YARN:node -> task
- 系统设计
- 中心存储
- 节点缓存
三、个人总结
本节课我们学习了资源管理系统Kubernetes的相关功能、运用以及资源管理逻辑。K8S是当今常见的资源管理系统,需要在运用中进一步了解其深层次实现。