几种集群方案简介
下面以docker部署为主,主流的容器化集群部署方案主要有以下几种:
compose支持在 同一节点 上部署,swarm支持在多个节点上部署容器。这两者都是docker原生支持的docker集群部署方式,开箱即用,比较方便,偏重于容器的部署。
swarm偏重的是容器的部署,而k8s偏重于应用的部署。k8s对容器的所有操作都渗透着为应用而服务的理念,比如pod是为了让联系紧密但又不适合部署在一起的应用分别部署在不同docker里面,但docker之间共享volume和network namespace方式,以便实现紧密地“交流”,在比如service是为了隐藏pod(容器的集合,下文会介绍到)的网络细节,让pod提供固定的访问入口,从而方便地让其他应用访问等。
在swarm中,被创建、调度和管理的最小单元就是docker。在k8s中,最小单元则是pod。
marathon+mesos,一开始是给大数据组件部署用的,这个框架是一个双层调度框架,侧重于底层资源管理。需要自己实现任务调度。
下面重点对比一下k8s和mesos。
k8s vs mesos
k8s
k8s一些概念
k8s组件
kubelet会在API Server上注册节点信息,定期向Master汇报节点资源使用情况,并通过cAdvisor监控容器和节点资源。可以把kubelet理解成【Server-Agent】架构中的agent,是Node上的pod管家。
scheduler负责集群的资源调度,为新建的pod分配机器。这部分工作分出来变成一个组件,意味着可以很方便地替换成其他的调度器。
controller-manager负责执行各种控制器,目前有两类:
K8s概述:几种集群方案的对比
提交流程
提交一个pod的流程
K8s概述:几种集群方案的对比
提交一个controller的流程
K8s概述:几种集群方案的对比
提交一个service的流程
K8s概述:几种集群方案的对比
mesos
mesos+marathon
mesos复制资源管理,主要有以下四个组件:
这里面有两层的Scheduler,一层在Master里面,allocator会将资源公平的分给每一个Framework,二层在Framework里面,Framework的scheduler将资源按规则分配给Task。其它框架的调度器是直接面对整个集群,Mesos的优势在于,第一层调度先将整个Node分配给一个Framework,然后Framework的调度器面对的集群规模小很多,然后在里面进行二次调度,而且如果有多个Framework,例如有多个Marathon,则可以并行调度不冲突。
以下面这个调度图为例子:
K8s概述:几种集群方案的对比
DC/OS
DC/OS是以Mesos为内核,加上marathon和chronos作为运行和管理任务和应用的框架。它集成了许多大数据处理框架(hadoop、spark等)。
K8s概述:几种集群方案的对比
Mesosphere DCOS除了内核Mesos,还有两个关键组件Marathon和Chronos。其中,Marathon(名分布式的init)是一个用于启动长时间运行应用程序和服务的框架,Chronos(又名分布式的cron)是一个在Mesos上运行和管理计划任务的框架。
Mesosphere DCOS在其公有仓库上已提供了40多种服务组件,比如Hadoop,Spark,Cassandra, Jenkins, Kafka, MemSQL等等。
DC/OS上面的Framework实现也可以使用k8s。
k8s vs mesos
K8s概述:几种集群方案的对比
DC/OS采用二次调度的机制,使得应用调度与资源调度相分离。这一点与Kubernetes不同,Kubernetes的应用调度与资源调度全部都是通过内部的组件完成的,其自身的资源调度平台仅能为容器运行提供支撑,不能为其它的Framework提供资源支撑,可以说Kubernetes的容器调度与资源调度是紧耦合的。而在DC/OS平台下,各应用调度框架与Mesos资源实现了松耦合,Mesos仅负责资源的调度,而上层应用的调度则由各应用的Framework自身完成,Framework自身也可以通过容器的方式运行在平台之上。
不同集群规模的选择
K8s概述:几种集群方案的对比
因为容器和集群编排有学习成本,所以对于小集群,建议是使用Iaas和裸机部署docker。
然后当发展到一定程度,有50+个以上的服务的中等规模集群,建议使用Docker Swarm,Swarm与docker紧密结合,命令与docker相对一致,比较容易上手。
到了百级别的集群,在这个量级上需要有一些定制化工作,swarm调度方面开始有压力,组件内置又不好debug。这时候会比较多选择Mararthon+Mesos,双层调度机制使得集群可以大很多。
到了千级别的集群,kubernetes的模块划分的更细,设计思想也更偏向于微服务部署,就是学习成本比较高。
然后是万级别的节点,这时候Kubernetes的调度和etcd等组件的压力在万级别上会达到瓶颈,单个etcd集群和串行调度,controller监听单队列会遇到性能的问题。这时候需要定制化K8s组件,比如etcd做多集群,对于多租户可以实现并行调度,监听多个队列,定制事件优先级,比如add优先于delete等等。
在这个级别上也可以使用DC/OS做定制化,天生的双层调度可以给不同的租户独立使用Marathon并行调度。
最后是部署大数据组件,推荐是使用Mesos做调度,因为天生就是从做大数据组件部署起来的,拥有丰富的大数据Framework。