深入理解 K8S 资源管理和调度| 青训营笔记
这是我参与「第四届青训营 」笔记创作活动的的第17天
Kubernetes 简介
为什么需要 Kubernetes ?
-
容器相比于传统的虚拟化技术,更轻量,更敏捷,更易于管理,运维成本更低;
- 一次打包,任意地方运行
-
如果容器规模巨大,如何编排管理容器也是个巨大的挑战,需要一个强大的管理系统,Kubernetes 在这方面表现很好
- 基于 google 超过 15 年的大规模容器管理经验;
- 功能丰富,易于扩展,架构优雅;
- 社区活跃,仅次于 Linux 的全球第二大社区;
Kubernetes 是什么?
Kubemetes is a portable, extensible, open source platform for managing containerized workloads and services, that facilitates both declarative configuration and automation.
- 特点:便携,可扩展,开源的容器管理平台
- 目的:管理容器应用和服务
- 作用: 声明式配置和自动化
Kubernetes 特性
-
服务发现和负载均衡
-
存储编排
-
自动发布,回滚
-
自愈
-
秘钥,配置管理
-
资源管理,应用编排调度
Kubernetes 核心概念
-
Pod
-
PVC/PV/StorageClass
-
Deployment
-
Statefulset
-
Node
Pod
Volume/PV/PVC/StorageClass
PV
PVC
SC
Deployment
StatefulSet
Node
Kubernetes 设计准则
- Declarative > imperative: State your desired results, let the system actuate
- Control loops: Observe, rectify, repeat
- Simple > Complex: Try to do as little as possible
- Modularity: Components, interfaces, & plugins
- Legacy compatible: Meet users where they are, requiring apps to change is a non-starter
- Open>Closed:Open Source, standards, REST, JSON, etc.
Kubernetes 架构
- ETCD
- 持久化数据中心
- 维护集群中所有数据的有序性和一致性
- 事件机制同步数据变更
- APIServer
- 对所有组件提供 API 接口
- 负责 admission,鉴权等功能
- 提供后端 etcd 数据 cache,降低 ETCD 压力
- 结合 ETCD,提供 List-Watch 机制
- Controller-manager
- 提供一系列控制器,负责维护各种对象的生命周期 比如: Node controller, PV controller, Deployment controller, StatefulSet controller 等
- Scheduler
- 负责应用实例的调度,把Pod绑定到合适的 Node
- Kubelet
- 基于 Pod 声明,真正开始启动容器,负责容器生命周期维护
- Kube-proxy
- 网络代理,负责维护节点网络规则,接管 Pod 出入流量
Kubernetes 核心通信机制 - List-Watch
Kubernetes 核心功能
- 服务发现和负载均衡
- 存储编排
- 自动发布,回滚
- 自愈
- 秘钥,配置管理
- 资源管理,应用编排调度
Kubernetes 资源管理
资源种类
-
计算类
- 原生: CPU,memory,等;
- 可通过 Device plugin 方式支持的非原生: numa,socket。。。
-
存储类
- 原生:
- 临时存储: Ephemeral storage,EmptyDir 等
- 持久化 (PV): Cinder, RBD, Cephfs, NFS, GlusterFS...
- 可以通过 CSI 方式扩展支持其他存储;
- 原生:
资源上报
-
计算资源分配:
- Kubelet -> cgroup manager -> cpu, memory...
- Kubelet -> device manager -> extended resources
-
存储资源分配:
- Controller manager -> provisioner -> attacher -> mounter
资源分配
-
计算资源分配:
- Kubelet -> cgroup manager -> cpu, memory...
- Kubelet -> device manager -> extended resources
-
存储资源分配:
- Controller manager -> provisioner -> attacher -> mounter
资源状态维护
-
计算资源状态维护:
- kubelet/cgroup manager/device manager/evictioner manager -> cpu, memory, extended resources
-
存储资源维护
- PV controller -> PV/PVC
资源回收
- 计算资源回收:
- Kubelet -> cgroup manager -> cpu, memory...
- Kubelet -> device manager -> extended resources
- 存储资源回收:
- Controller manager -> unmounter -> detacher -> deleter
Kubernetes 调度
资源申请
申请 cpu 内存 硬盘这些资源
- 资源申请:
- request 保证最少有多少资源
- limit 最大程度可以使用多少资源,超过会被资源回收
Cpu 内存
存储
PVC
调度流程
调度框架
主要分为几个步骤:
-
过滤
- Pre-Filter: 进行一些全局的准备工作,防止流程中多次重复计算;
- Filter: 基于 Pod 的约束,进行 Pod -> Node 的匹配工作;
- Post-Filter: 如果没有一个合适的节点,则进行一些抢占行为(驱逐低优任务),看是否能找到合适节点;
-
打分
- 基于前面的过滤节点,对合适的节点进行打分,按照分值高低进行排序;
- 如果前面没有合适的节点,则直接调度失败;
-
任务分配
- Reserve: 在调度器 cache 里面缓存调度结果,为了解决异步 API 操作带来的时延问题;
- Permit: 扩展接口,可以在这里支持一些扩展语音,比如: Gang 等;
- 结果有三类: 失败,成功,等待
- 失败: 直接返回调度失败结果;
- 成功: 直接通过;
- 等待: 则异步等待,不阻塞其他流程;
- 结果有三类: 失败,成功,等待
- Pre-Bind: 任务运行前的一些准备操作,比如: 动态创建 Volume 等;
- Bind: 把 Pod 绑定到 Node,即: 给应用分配运行节点;
案例 MySql + WordPress
优化实践
Kubernetes 还可以更好
- 非原生资源的精细化管理能力
- 动态资源接入,管理能力
- 调度功能和性能
- 调度质量
Kubernetes 与 Yarn 的一些不同点
-
基本单位:
- Yarn: Container;
- Kubernetes: Pod;
-
资源管理的扩展能力:
- Yarn: 没提供 Plugin 机制,侵入性较大;
- Kubernetes: plugin 机制扩展,侵入性小;
-
调度模式:
- Yarn: Node -> Task
- Kubernetes: Task -> Node
-
系统设计
- Yarn: 节点缓存,无核心中心化存储;
- Kubernetes: 中心化存储;
字节的一些工作
-
非原生资源:
- Socket, numa, local disk, NIC, mbw...
-
动态资源:
- CPU 实时负载,利用率...
-
调度功能&性能优化:
- Gang
- 应用级别亲和性约束能力支持;
- 微拓扑调度能力支持;
- 资源预留;
- 系统重构: 分布式系统
- 等
-
调度质量改善:
- 重调度;
- 业务上下游亲和性策略;
- 实时负载均衡策略;
- 碎片整理,优化等