深入理解 K8S 资源管理和调度|青训营笔记

134 阅读5分钟

深入理解 K8S 资源管理和调度|青训营笔记

这是我参与「第四届青训营」笔记创作活动的的第14天。

一、课程概述

  1. Kubernetes简介
  2. Kubernetes资源管理
  3. 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架构

Screen Shot 2022-08-12 at 10.42.30 PM.png

  • 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
  • 计算资源管理 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是当今常见的资源管理系统,需要在运用中进一步了解其深层次实现。