这是我参与「第四届青训营 」笔记创作活动的第13天
容器和虚拟机的区别
容器是多个应该用共享一套操作系统
虚拟机是在一套操作系统上虚拟多个机器,每个机器有一套自己的操作系统
1.1 Kubernetes核心概念
- Pod
- Deployment/StatefulSet
- Volume/PVC/PV/StorageClass
- Node
1.1.1 Pod
Pod是最小单位,是一个或者多个Container的组合
Pod中的spec有几个配置就有几个container组成Pod
1.1.2 Volume/PVC/PV/StorageClass
Volume太老了,基本不用。
PV关联到一个具体的存储。
1.1.3 Deployment/StatefulSet
Deployment由一个或者多个Pod组成。
- template:是Pod的模板
- replicas:由几个Pod组成
StatefulSet与Deployment不同的在于volumeClaimTemplate,多了存储空间的描述
1.1.4 Node
Node是一个机器的概念
1.2 Kubernetes设计准则
- 声明式而不是命令式
- 控制循环
- 简单
- 模块化
- 向下兼容
- 开放原则
1.3 Kubernetes架构
ETCD: 持久化数据中心
维护集群中所有数据的有序性和一致性,事件机制同步数据变更
Controller-Manager
提供一系列控制器,负责维护各种对象的生命周期,如Node controller、PV controler、Deployment controller、StatefulSet controller等
APIServer
对所有组件提供API接口,负责admission,鉴权等功能,提供后端etcd数据cacher,降低ETCO压力,结合ETCO,提供List-Watch机制
Schedular:
负责应用实例的调度,把Pod绑定到合适的Node上
Kulelet:
基于Pod声明,真正开始启动容器,负责容器生命周期维护
Kube-proxy
网络代理,负责维护节点网络规则,接管Pod出入流量
1.4 Kubernetes核心通道机制 List Watch
Kubernetes 是通过 List-Watch 的机制进行每个组件的协作,保持数据同步的,每个组件之间的设计实现了解耦。
用户是通过 kubectl 根据配置文件,向 APIServer 发送命令,在 Node 节点上面建立 Pod 和 Container。
APIServer 经过 API 调用,权限控制,调用资源和存储资源的过程,实际上还没有真正开始部署应用。这里需要 Controller Manager、Scheduler 和 kubelet 的协助才能完成整个部署过程。
在 Kubernetes 中,所有部署的信息都会写到 etcd 中保存。实际上 etcd 在存储部署信息的时候,会发送 Create事件给 APIServer,而 APIServer 会通过监听(Watch)etcd发过来的事件。其他组件也会监听(Watch)APIServer 发出来的事件。
1.5 Kubernetes核心功能
- 服务发现和负载均衡
- 存储编排
- 自动发布,回滚
- 自愈
- 密钥,配置管理
- 资源管理,应用编排调度
2 资源管理
2.1 资源上报
在kubelet中,集成了cAvisor采集器,采集机器的细粒度信息后上报给Node status setter,Node status setter会将信息更新到Node API Object里面。
如Numa sockect资源,K8s提供Device manager组件,实现自己的Device agent上报资源。
2.2 资源分配-计算资源
在Pod中配置需要多少资源,kubelet中的container manager根据list watch机制,利用Cgroup manager做一些操作,类似资源上报的逆过程。
2.3 资源分配-存储卷
创建一个Pod,里面挂了PVC,controller-manager会watch到
2.3 状态维护
PV Controller:管理PV
Protection controller:做数据保护,比如删除pod前不能删除PV
Attach/Detach controller:管理块设备节点的attach/detach
3 调度
3.1 资源申请
通过配置文件,配置PVC