【k8s连载系列】2. k8s整体架构( 三 )


- V2:v2版本将数据保存到内存, 这样很可能会不稳定,一宕机,数据全没了 。- V3: v3版本将数据保 存到磁盘. 然后进行缓存加速 。并且,如果使用了V3版本,官方建议采用SSD进行存储和读取- 如何选择版本呢?不用我们自己选择,k8s已经集成了etcd 。正常我们都选择使用v3版本, 但Kubernetes v1.11版本之前使用的是v2版本.
-
## 3、Raft内部结构
Raft内部结构如下图,主要包含几个方面:Http Server,Raft,Wal,Store 。下面来详细介绍
<img src="http://shimg.jingyanzongjie.com/230728/0644405G3-2.png" alt="image" style="zoom:50%;" />
### 1> HTTP Server
这里采用的是使用http进行构建的c/s服务, k8s也是采用的http协议进行c/s服务的开发. 为什么要这么做呢? 因为http天生支持一系列的操作. 例如: get ,post, put, delete, 授权认证等. 所以, 没有必要再去采用标准的tcp协议. 开发一系列的认证流程, 所以, 直接采用http协议即可. http协议主要解决的是数据传输问题 。
### 2> Raft
共识算法,上面说过了,这里不再赘述
### 3>WAL 预写日志
什么叫预写日志呢?在写入修改底层数据之前,把所有的操作先保存在日志里 。
- Raft:共识算法,从一开始就被设计成一个易于理解和实现的共识算法 。每一个Raft集群中都包含多个服务器,在任意时刻,每一台服务器只能处于Leader、Follower以及Candidate三种状态;在处于正常的状态时,集群中只会存在一个Leader,其余都是Follower 。
共识算法,或者叫最终一致算法 。比如:有3台etcd机器在运行的过程中,突然停了,那么3台etcd中的配置可能是不一样的,但是,一旦运行起来,经过一段时间,最终会达到一致 。每一个Raft集群都包含多个服务器,在任意时刻,每一台服务器只可能处于Leader(主节点)、Follower(跟随者)、Candidater(竞选者)三种状态中的一种 。在处于正常状态(可访问)时,集群中只会存在一个Leader,其余的服务器都是Follower 。
- WAL: 预写日志, 吸入到数据库之前,先保存到日志里 。如果要对数据进行更改, 那么先写入一条日志, 然后定时的对日志进行完整的备份. 也就是完整+临时. 比如: 我先备份一个大版本, 备份以后, 还会有1个子版本, 两个子版本....., 然后将这些版本再次进行一个完整备份,把它变成一个大版本. 这样做的好处, 我们不能始终进行完整备份, 因为消耗的数据量太大. 为什么还要在一定时间内进行完整的备份呢?防止增量备份太多, 还原的时候太费事. 并且, Raft还会实时的把这些数据和日志存入到本地磁盘进行持久化.
- Store: 把WAL中的日志和数据, 写入磁盘进行持久化.
# 四、Node节点
从图中可以看出, Node节点包含三个组件 ,kubelet, kube proxy, 以及container. 也就是说我们在node节点需要安装三个软件: kebelet, kebu proxy, docker
<img src="http://shimg.jingyanzongjie.com/230728/064440AO-3.png" alt="img" style="zoom:33%;" />
### 1)kubelet的作用
master端收到多个任务,调度器会把任务发送给node节点,在node节点上,任务都是以容器化的方式运行的 。容器是被谁初始化的?容器的运行时,比如docker,docker会帮我们启动容器 。一边是kuberates 的Api Server,另一边是docker 。他俩能够对话么?不能 。举个例子: 一个是外国人,只会说英语,一个是中国人,只会说汉语 。那如何让外国人和中国人交流呢?翻译呗 。kubelet的作用就是连接k8s和docker的 。kubelet监听api server,api server下发命令以后,kubelet要去调用docker,去执行指令,比如容器的创建 。
kubelet的直接跟容器交互, 实现容器的生命周期管理.他会和CRI, C是容器, R是runtime, I是interface. CRI就是docker的操作形式. kubelet会和docker交互, 创建需要的容器. kubelet会维持Pod的生命周期.

经验总结扩展阅读