我花了10个小时,写出了这篇K8S架构解析( 二 )

从上面的配置文件可以看出,需要对这个 RC 定义一个名字,以及期望的副本数,以及容器中的镜像文件 。然后通过 kubectl 作为客户端的 cli 工具,执行这个配置文件 。

我花了10个小时,写出了这篇K8S架构解析

文章插图
 
通过 kubectl 执行 RC 配置文件
执行了上面的命令以后,Kubernetes 会帮助我们部署副本 MySQL 的 Pod 到 Node 。
此时先不着急看结果,回到最开始的架构图,可以看到 kubectl 会向 Master 中的 APIServer 发起命令,看看 APIServer 的结构和信息的传递吧 。
我花了10个小时,写出了这篇K8S架构解析

文章插图
 
Kubernetes API Server 通过一个名为 kube-apiserver 的进程提供服务,该进程运行在 Master 上 。
可以通过 Master 的 8080 端口访问 kube-apiserver 进程,它提供 REST 服务 。
因此可以通过命令行工具 kubectl 来与 Kubernetes APIServer 交互,它们之间的接口是 RESTful API 。
APIServer 的架构从上到下分为四层:
  • API 层:主要以 REST 方式提供各种 API 接口,针对 Kubernetes 资源对象的 CRUD 和 Watch 等主要 API,还有健康检查、UI、日志、性能指标等运维监控相关的 API 。
  • 访问控制层:负责身份鉴权,核准用户对资源的访问权限,设置访问逻辑(Admission Control) 。
  • 注册表层:选择要访问的资源对象 。PS:Kubernetes 把所有资源对象都保存在注册表(Registry)中,例如:Pod,Service,Deployment 等等 。
  • etcd 数据库:保存创建副本的信息 。用来持久化 Kubernetes 资源对象的 Key-Value 数据库 。

我花了10个小时,写出了这篇K8S架构解析

文章插图
 
APIServer 分层架构图
当 kubectl 用 Create 命令建立 Pod 时,是通过 APIServer 中的 API 层调用对应的 RESTAPI 方法 。
之后会进入权限控制层,通过 Authentication 获取调用者身份,Authorization 获取权限信息 。
AdmissionControl 中可配置权限认证插件,通过插件来检查请求约束 。例如:启动容器之前需要下载镜像,或者检查具备某命名空间的资源 。
还记得 mysql-rc.yaml 中配置需要生成的 Pod 的个数为 1 。到了 Registry 层会从 CoreRegistry 资源中取出 1 个 Pod 作为要创建的 Kubernetes 资源对象 。
然后将 Node,Pod 和 Container 信息保存在 etcd 中去 。这里的 etcd 可以是一个集群,由于里面保存集群中各个 Node/Pod/Container 的信息,所以必要时需要备份,或者保证其可靠性 。
Controller Manager,Scheduler 和 kubelet
前面通过 kubectl 根据配置文件,向 APIServer 发送命令,在 Node 上面建立 Pod 和 Container 。
在 APIServer,经过 API 调用,权限控制,调用资源和存储资源的过程 。实际上还没有真正开始部署应用 。
这里需要 Controller Manager,Scheduler 和 kubelet 的协助才能完成整个部署过程 。
在介绍他们协同工作之前,要介绍一下在 Kubernetes 中的监听接口 。从上面的操作知道,所有部署的信息都会写到 etcd 中保存 。
实际上 etcd 在存储部署信息的时候,会发送 Create 事件给 APIServer,而 APIServer 会通过监听(Watch)etcd 发过来的事件 。其他组件也会监听(Watch)APIServer 发出来的事件 。
我花了10个小时,写出了这篇K8S架构解析

文章插图
 
Kubernetes 就是用这种 List-Watch 的机制保持数据同步的,如上图:
  • 这里有三个 List-Watch,分别是 kube-controller-manager(运行在Master),kube-scheduler(运行在 Master),kublete(运行在 Node) 。他们在进程已启动就会监听(Watch)APIServer 发出来的事件 。
  • kubectl 通过命令行,在 APIServer 上建立一个 Pod 副本 。
  • 这个部署请求被记录到 etcd 中,存储起来 。
  • 当 etcd 接受创建 Pod 信息以后,会发送一个 Create 事件给 APIServer 。
  • 由于 Kubecontrollermanager 一直在监听 APIServer 中的事件 。此时 APIServer 接受到了 Create 事件,又会发送给 Kubecontrollermanager 。
  • Kubecontrollermanager 在接到 Create 事件以后,调用其中的 Replication Controller 来保证 Node 上面需要创建的副本数量 。
上面的例子 MySQL 应用是 1 个副本,Tomcat 应用是两个副本 。一旦副本数量少于 RC 中定义的数量,Replication Controller 会自动创建副本 。总之它是保证副本数量的 Controller 。PS:扩容缩容的担当 。