k8s架构设计
Table of Contents
组件 #
k8s可分为三大块:控制平面、节点和其他。
控制平面包括:
- API Server
- Scheduler
- Controller Manager
- etcd
节点包括:
- kubelet
- kube-proxy
- 容器运行时(docker、rkt等)
其他包括:
- DNS Server
- Dashboard
- Ingress
- Heapster
- 网络插件
- 等
插件化 #
数据流向 #
- k8s中的组件只与API server交流
- API server只能与etcd交流
- 组件如果需要存储/读取数据,统一通过API server处理
数据一致性 #
k8s中存在大量组件,这些组件需要更新大量数据,如何保证高并发下的数据一致性?
通过约束组件统一通过API server存储/读取数据,因此,只需在API server处使用乐观并发锁,就可以实现数据一致性。
API server #
鉴权&准入 #
一个对API server的请求需要经过多个插件。
- 鉴权插件
API server中有多个鉴权插件,API server会遍历这些插件直到找到一个能够识别请求用户的插件。
-
鉴权插件again
再次遍历鉴权插件,判断用户是否有权限执行这个请求。
-
准入插件
如果请求需要修改、创建、删除资源,那么就会进入准入插件。准入插件也有多个,其目的是为了保证相关数据的一致性,如ServiceAccount插件保证了如用户未明确serviceaccount,则为其使用默认的serviceaccount
异步通知 #
- 客户端通过HTTP连接API Server,用于获取对象更新事件
- 修改对象
- API Server更新对象到etcd
- etcd通知API server对象更新
- API Server将对象更新事件发送到所有监听该对象的客户端
调度器 #
Controller Manager #
k8s中有大量的控制器,如ReplicationController、ReplicaSet、Job等等,这些控制器实际上并不会直接控制其名义上控制的资源(如ReplicaSet之于Pod),而是通过其Manager进行控制。
这些控制器有:
- Replication Manager
- eplicaSet, DaemonSet, and Job controllers
- Deployment controller
- StatefulSet controller
- Node controller
- Service controller
- Endpoints controller
- Namespace controller
- PersistentVolume controller
- 等等
大部分控制器的逻辑都相同,以ReplicationManager为例:
Replication Manager #
ReplicationController不会直接创建或删除Pod,而是通过监听机制,让ReplicationManager来监听到pod变更,并创建或修改Pod声明文件,调度器和kubelet会根据pod声明文件进行调度。
Endpoints controller #
Endpoint控制器会监听Service和Pod两种资源,一旦Service增加或修改了Pod,或者Pod被新增、修改和删除后,Endpoint控制器会根据Service的pod选择器来选择合适的pod,并且将选择的pod的ip和端口更新到Endpoint资源上。
kubelet #
kubelet是一个节点上用来为所有正在运行的事物负责的组件。
- 当kubelet启动时,会将所在节点的信息注册到API server。
- kubelet会持续监听API server,一旦有pod被调度到该节点,则创建该pod对应的容器。
- kubelet会监控节点上所有容器,并上报其状态、事件和资源消耗情况到API server。
除监听API server外,kubelet还能通过指定声明文件来创建pod。
事件 #
部署Deployment时的事件链 #
高可用 #
todo