今天我们来聊一聊k8s的架构
01.Master
Master节点主要由四个模块组成,APIServer,Schedule, Controller Manager, etcd。
APIServer
负责对外提供RESTful的KubernetesAPI服务,它是系统管理指令的统一入口,任何对资源进行增删改查的操作都要交给APIServer处理后再提交给etcd。Kubectl(Kubernetes提供的客户端工具,该工具内部就是对Kubernetes API的调用)是直接和APIServer交互的。
Schedule
Schedule的职责很明确,就是负责调度Pod到Node上。如果把schedule看成一个黑匣子,那么它的输入是Pod和由多个Node组成的列表,输出是Pod和一个Node的绑定,即将这个Pod部署到这个Node上。Kubernetes目前提供了调度算法,同样也保留了接口,我们可以根据自己的需求定义自己的调度算法。
ControllerManager
如果说APIServer做的是“前台“的工作的话,那Controller Manager就是负责”后台“的。每一个资源一般都对应一个控制器,而Controller Manager就是负责管理这些控制器的。比如我们通过APIServer创建一个Pod,当这个Pod创建成功后,APIServer的任务就算完成了,而后面保证Pod的状态始终和我们预期的一样的重任就由Controller Manager去保证。
Etcd
Etcd是一个高可用的键值存储系统,Kubernetes使用它来存储各个资源状态,从而实现RESTful的API。
02.Node
每一个Node节点主要由三个模块组成,kubelet,kube-proxy, runtime。
Runtime
Runtime指的是容器运行环境,目前Kubernetes支持Docker和RKT两种容器。
Kube-proxy
该模块实现了Kubernetes中的服务发现和反向代理功能。反向代理方面:kube-proxy支持TCP和UDP连接转发,默认基于Round Robin算法将客户端流量转发到与service对应的一组后端Pod。服务发现方面:kube-proxy使用etcd的watch机制,监控集群中service和endpoint对象数据的动态变化,并且维护一个service到endpoint的映射关系,从而保证了后端Pod的IP变化不会对访问者造成影响。另外kube-proxy还支持session affinity。
Kubelet
Kubelet是Master在每个Node节点上面的agent,是Node节点上最重要的模块。它负责维护和管理该Node上面的所以容器,但是如果容器不是通过Kubernetes创建的,它并不会管理。本质上,它负责Pod的运行状态与期望的状态一致。
03.Pod
Pod是Kubernetes的基本操作单元,也是运行应用的载体。整个Kubernetes系统都是围绕着Pod展开的,比如如何部署运行Pod,如何保证Pod的数量,如何访问Pod等。另外,Pod是一个或多个相关容器的集合,提供了一种容器的组合模型。
Pod与容器
在Docker中,容器是最小的处理单元,增删改查的对象是容器,容器之间是相互隔离的。而在Kubernetes中,Pod包含一个或多个相关的容器,Pod可以认为是容器的一种延伸扩展,一个Pod也是一个隔离体,而Pod内部包含的一组容器又是共享的(包括PID,Network,IPC,UTS)。除此之外,Pod中的容器可以访问共同的数据卷来实现文件系统的共享。
Pod生命周期
Pod被分配到一个Node上之后,就不会离开这个Node,直到被删除。当某个Pod失败,首先会被Kubernetes清理掉,之后Replication Controller将会在其他机器上(或者本机)重建Pod,重建之后的Pod的ID发生了变化,会是一个新的Pod。