这是我参与「第四届青训营 」笔记创作活动的第26天
本次笔记重点内容
- Kubernetes 简介
- Kubernetes 资源管理
- Kubernetes 调度
Kubernetes
定义
容器相比于传统的虚拟化技术,更轻量,更敏捷,更易于管理,运维成本更低,而Kubernetes是一个便携、可扩展、开源的容器管理平台,容器规模巨大时对它们的编排管理做的很好。
目的:管理容器应用和服务
特性
- 服务发现和负载均衡
- 存储编排
- 自动发布,回滚
- 自愈
- 秘钥,配置管理
- 资源管理,应用编排调度
核心概念
- Pod:最小最基础的应用单位
metadata存在一些关键信息,spec是pod比较关键的配置
- Volume(最原始的概念)/PVC/PV:底层存储,可自动创建/StorageClass
- Deployment/Statefulset:Pod的封装
- Node
设计准则
声明式而不是命令式,也就是说只需要告诉K8S想要什么状态而不是告诉K8S一步一步如何做;控制循环,为生成用户所需状态的步骤;把简单留给用户,复杂给自己;模块化,由一个一个组件组成,组件内部也是模块化的;开放资源。
架构
- 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,等;
- 非原生: numa,socket,等;
- 存储类
- 原生:
- 临时存储: Ephemeral storage,EmptyDir 等
- 持久化 (PV): Cinder, RBD, Cephfs, NFS, GlusterFS 等
- 原生:
流程
Kubernetes调度
调度流程
- 过滤
- Pre-Filter: 进行一些全局的准备工作,防止流程中多次重复计算;
- Filter: 基于 Pod 的约束,进行 Pod -> Node 的匹配工作;
- Post-Filter: 如果没有一个合适的节点,则进行一些抢占行为(驱逐低优任务),看是否能找到合适节点;
- 打分
- 基于前面的过滤节点,对合适的节点进行打分,按照分值高低进行排序;
- 如果前面没有合适的节点,则直接调度失败;
- 任务分配
- Reserve: 在调度器 cache 里面缓存调度结果,为了解决异步 API 操作带来的时延问题;
- Permit: 扩展接口,可以在这里支持一些扩展语音,比如: Gang 等;
- 结果有三类: 失败,成功,等待
- 失败: 直接返回调度失败结果;
- 成功: 直接通过;
- 等待: 则异步等待,不阻塞其他流程;
- 结果有三类: 失败,成功,等待
- Pre-Bind: 任务运行前的一些准备操作,比如: 动态创建 Volume 等;
- Bind: 把 Pod 绑定到 Node,即: 给应用分配运行节点;