一、Kubernetes 简介
几个核心概念
- • Pod
- • PVC/PV/StorageClass
- • Deployment
- • Statefulset
- • Node
Kubernetes架构
- • 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 资源管理
资源种类
- • 计算类
- • 原生:CPU,memory,等;
- • 可通过 Device plugin 方式支持的非原生:numa,socket...
- • 存储类
- • 临时存储:Ephemeral storage,EmptyDir 等
- • 持久化 (PV): Cinder, RBD, Cephfs, NFS, GlusterFS...
- • 原生:
- • 可以通过 CSI 方式扩展支持其他存储
资源上报
- • 计算资源上报:
- • cAdvisor -> Kubelet -> Node
- • Agent -> Device plugin -> Kubelet -> Node
- • 存储资源上报:
- • 托管到存储提供商管理
- • cAdvisor -> Kubelet -> Node
- • 临时存储:
- • 持久化存储:
资源分配
- • 计算资源分配:
- • 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 调度
约束描述
- • 资源申请:
- • request、limit
- • 其他约束:
- • affinity/anti-affinity
- • Label selector
- • Taint & toleration
- • Image locality
- • Bin-packing/Load balancing...
调度流程
调度框架
主要分为几个步骤:
- • 过滤
- • Pre-Filter: 进行一些全局的准备工作,防止流程中多次重复计算;
- • Filter: 基于 Pod 的约束,进行 Pod -> Node 的匹配工作;
- • Post-Filter: 如果没有一个合适的节点,则进行一些抢占行为(驱逐低优任务),看是否能找到合适节点;
- • 打分
- • 基于前面的过滤节点,对合适的节点进行打分,按照分值高低进行排序;
- • 如果前面没有合适的节点,则直接调度失败;
- • 任务分配
- • 结果有三类:失败,成功,等待
- • 失败:直接返回调度失败结果;
- • 成功:直接通过;
- • 等待:则异步等待,不阻塞其他流程;
- • Reserve: 在调度器 cache 里面缓存调度结果,为了解决异步 API 操作带来的时延问题;
- • Permit:扩展接口,可以在这里支持一些扩展语音,比如:Gang 等;
- • Pre-Bind: 任务运行前的一些准备操作,比如:动态创建 Volume 等;
- • Bind: 把 Pod 绑定到 Node,即:给应用分配运行节点;
四、小结
Kubernetes 运行 MySql WordPress 示例:
- • https://kubernetes.io/zh-cn/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume
Kubernetes 与 Yarn 的一些不同点:
- • 基本单位:
- • Yarn:Container;
- • Kubernetes:Pod;
- • 资源管理的扩展能力:
- • Yarn:没提供 Plugin 机制,侵入性较大;
- • Kubernetes:plugin 机制扩展,侵入性小;
- • 调度模式:
- • Yarn: Node -> Task
- • Kubernetes: Task -> Node
- • 系统设计
- • Yarn: 节点缓存,无核心中心化存储;
- • Kubernetes:中心化存储;