History of Kubernets
Kubernets Wiki 最近看了Large-scale cluster management at Google with Borg,Borg是谷歌公司自己内部开发的一套集群管理系统,后来开源社区也就慢慢开始孵化和推出了Kubernets集群管理系统,k8s和Borg有着很深的渊源关系。 先从Kubernets入手,我们来看下K8s的组件: Kubelet 在每一台节点上都会运行Kubelet,管理节点上的容器。 kube-apiServer 验证和配置关于Pods,Services,ReplicationControllers等数据,其他kube都需要通过调用api来获取所需的数据。 kube-Controller-Manager 用于控制系统的状态,通过API接口来同步系统数据,比如将系统从A状态同步更新到B状态。 kube-proxy 运行在每一台的节点上,主要作用充当网络代理,能够简单的处理TCP UDP 转发和轮询。 kube-scheduler 用来调度Pods,当有新的Pods需要创建时,调度器会给每一台工作节点打分,然后将Pods分配到满足要求的节点上。 然后再看关于Borg系统的描述,每一个集群都称之为一个Cell,每一个Cell都运行在一个独立的数据中心里。 Borg 架构 Borg 设计准则主要是以下三点: 隐藏对系统底层资源的管理以及容错处理,方便开发者将注意力集中在开发上,而不过多注意底层细节。 系统中运行的应用都是高可用的,某台节点的宕机,不会引起服务的不可用。 必须非常高效的在数万台节点上完成对应用的扩展。 Borg的用户基本上是google内部开发人员和SRE,正是因为google注重对SRE的发展,才慢慢在google内部形成了上述三点的认知体系,提到google SRE不得不提GOOGLE SRE How Google Runs Production Systems这本书,我只看过中文版,看完英文版之后会写一篇博客专门详细讨论这本书里的内容。 集群设计架构 Borg系统有一套自己的配置文件语法体系BCL,然后通过borgcfg加载到基于Paxos的分布式数据库存储中,在k8s中我们是通过编写Yaml状态配置文件,然后使用kubectl将状态配置通过kube-api接口提交到后端分布式ETCD存储中,在边缘设施的k8s场景中,像k3s,microk8s会默认使用基于SQL的数据库引擎Dqlite,dqlite也采用了Raft一致性存储协议,这样就可以做到边缘设备上的k8s高可用。 在Borg系统中,SRE工程师大部分通过Borgctl命令行工具对系统进行访问和修改。 Borg的核心组成部分有Scheduler,BorgMaster,Paxos Datastore,LinkShard,Borglet。 BorgMaster: master分为两部分,第一部分是对外处理请求,比如RPC调用获取集群状态,任务分配信息,获取borglet的状态,第二部分是用于处理集群内部的任务调度模块,master 支持高可用,所有的数据都是通过基于Paxos的数据库进行存储,当前master leader宕机之后,master 副本中会选举出新的master节点继续对外提供服务。最引人注目的是,master节点的数据存储使用了CheckPoint技术,每隔一段时间,系统都会自动保存当前的状态到checkpoint中,这样在集群发生问题的时候,我们就能将集群回退到前一个正常的checkpoint的状态,并且在线下使用这些point来做debug。 BorgScheduler: 当任务通过master提交之后,master会将数据存储到paxos中,并且将任务放到待处理队列中,Scheduler会根据这些任务的优先级进行先后处理,Scheduler拿到任务之后,计算哪些机器是符合要求的,根据一定的打分算法给这些机器打分,再根据分数将任务分配到对应的节点上。 Borglet: 运行在每一台节点上,用于管理任务的生命周期,比如停止运行重启,维护操作系统的内核配置,borgmaster会定期去拉取let上的状态信息,如果let没有应答那么master就认为这个对应节点已经下线或者宕机。 Jobs&&Tasks: Borgs运行的对象以Jobs Tasks来进行管理,一个Job可以由多个Tasks组成。以下是任务的生命周期。 当任务被提交到Borg Master时,如果任务被master接受则会进入Pending状态,等待Scheduler进行调度,调度完成之后,组成job’s Tasks就开始运行,如果超出系统的资源限制,Tasks就会被Evicted,然后进入Pending状态,继续等待被调度到新的节点上,当Tasks运行结束,任务的状态会被更新为Dead,有点像进程的生命周期,整个主干过程就是 Create -> Pending -> Scheduling -> Runing -> Dead。 然后我们看下k8s整个架构以及任务的调度是如何完成的,可以与Borg对比,发现两者的优缺点。 ...