0
点赞
收藏
分享

微信扫一扫

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

一、Kubernetes 简介

几个核心概念

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

  • Pod
  • PVC/PV/StorageClass
  • Deployment
  • Statefulset
  • Node

Kubernetes架构

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

  • ETCD
  • 持久化数据中心
  • 维护集群中所有数据的有序性和一致性
  • 事件机制同步数据变更
  • APIServer
  • 对所有组件提供 API 接口
  • 负责 admission,鉴权等功能
  • 提供后端 etcd 数据 cacher,降低 ETCD 压力
  • 结合 ETCD,提供 List-Watch 机制
  • Controller-manager
  • 提供一系列控制器,负责维护各种对象的生命周期 比如: Node controller, PV controller, Deployment controller, StatefulSet controller 等
  • Kubelet
  • 基于 Pod 声明,真正开始启动容器,负责容器生命周期维护
  • Kube-proxy
  • 网络代理,负责维护节点网络规则,接管 Pod 出入流量

二、Kubernetes 资源管理

资源种类

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

  • 计算类
  • 原生: CPU,memory,等;
  • 可通过 Device plugin 方式支持的非原生: numa,socket...
  • 存储类
  • 原生:
  • 临时存储: Ephemeral storage,EmptyDir 等
  • 持久化 (PV): Cinder, RBD, Cephfs, NFS, GlusterFS...
  • 可以通过 CSI 方式扩展支持其他存储

资源上报

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

  • 计算资源上报:
  • cAdvisor -> Kubelet -> Node
  • Agent -> Device plugin -> Kubelet -> Node
  • 存储资源上报:
  • 临时存储:
  • cAdvisor -> Kubelet -> Node
  • 持久化存储:
  • 托管到存储提供商管理

资源分配

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

  • 计算资源分配:
  • Kubelet -> cgroup manager -> cpu, memory...
  • Kubelet -> device manager -> extended resources
  • 存储资源分配:
  • Controller manager -> provisioner -> attacher -> mounter

资源状态维护

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

  • 计算资源状态维护:
  • kubelet/cgroup manager/device manager/evictioner manager -> cpu, memory, extended resources
  • 存储资源维护
  • PV controller -> PV/PVC

资源回收

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

  • 计算资源回收:
  • Kubelet -> cgroup manager -> cpu, memory...
  • Kubelet -> device manager -> extended resources
  • 存储资源回收:
  • Controller manager -> unmounter -> detacher -> deleter

三、Kubernetes 调度

约束描述

  • 资源申请:
  • request、limit
  • 其他约束:
  • affinity/anti-affinity
  • Label selector
  • Taint & toleration
  • Image locality
  • Bin-packing/Load balancing...

调度流程

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

调度框架

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

主要分为几个步骤:

  • 过滤
  • Pre-Filter: 进行一些全局的准备工作,防止流程中多次重复计算;
  • Filter: 基于 Pod 的约束,进行 Pod -> Node 的匹配工作;
  • Post-Filter: 如果没有一个合适的节点,则进行一些抢占行为(驱逐低优任务),看是否能找到合适节点;
  • 打分
  • 基于前面的过滤节点,对合适的节点进行打分,按照分值高低进行排序;
  • 如果前面没有合适的节点,则直接调度失败;
  • 任务分配
  • Reserve: 在调度器 cache 里面缓存调度结果,为了解决异步 API 操作带来的时延问题;
  • Permit: 扩展接口,可以在这里支持一些扩展语音,比如: Gang 等;
  • 结果有三类: 失败,成功,等待
  • 失败: 直接返回调度失败结果;
  • 成功: 直接通过;
  • 等待: 则异步等待,不阻塞其他流程;
  • Pre-Bind: 任务运行前的一些准备操作,比如: 动态创建 Volume 等;
  • Bind: 把 Pod 绑定到 Node,即: 给应用分配运行节点;

四、小结

Kubernetes 运行 MySql + WordPress 示例:

  • ​​kubernetes.io/zh-cn/docs/…​​

Kubernetes 与 Yarn 的一些不同点:

  • 基本单位:
  • Yarn: Container;
  • Kubernetes: Pod;
  • 资源管理的扩展能力:
  • Yarn: 没提供 Plugin 机制,侵入性较大;
  • Kubernetes: plugin 机制扩展,侵入性小;
  • 调度模式:
  • Yarn: Node -> Task
  • Kubernetes: Task -> Node
  • 系统设计
  • Yarn: 节点缓存,无核心中心化存储;
  • Kubernetes: 中心化存储;
举报

相关推荐

0 条评论