《一》Docker Swarm、mesos与k8s的区别

Docker Swarm与mesos的区别

DockerSwarm 是目前 Docker 社区原生支持的集群工具,它通过扩展 DockerAPI 力图让用户像使用单机 Docker API 一样来驱动整个集群;相较于 Mesos 而言, DockerSwarm 对集群的侵入性更小,从而资源损耗也更低;

而 Mesos 是 Apache 基金会下的集群资源管理工具,它通过抽象主机的 CPU、内存、存储等计算资源来搭建一套高效、容错、弹性的分布式系统。

1.安装配置方面

DockerSwarm 要比 Mesos简单的多。K8s不同的操作系统上安装都不同。每个操作系统都有自己的独立安装指令。

使用 Docker Swarm 搭建一套集群 。

1>.通过 shell 命令 swarmcreate 生成一个集群的 token;

2>.借助这个 token 将想要添加到集群的主机广播到 DockerHub 集群发现 的公共服务(HostedDiscovery with Docker Hub)上,这样我们就把主机添加集群中了;

3>.接下来通过命令 swarmmanage 以及相应的 token 我们就可以在任何一台连接到互联网的主机上管理我们的集群了。

第1步使用staticfile、consul、etcd 或者ZooKeeper 中的任意一个,甚至是静态的IP列表来做集群发现即可。

 

与 DockerSwarm 不同,我们必须保证 Mesos 的管理节点直正常运行,然后才能向集群中添加agent/slave节点;另外向集群中添加节点时还需要配置resource,containers 等基本参数;最后只搭建好了 Mesos 集群是无法方便的使用集群资源的,我们需要Marathon、Chronos、Spark 等调度器去调度资源,才能真正使用起这套东西。主要也是由 Mesos 需要支撑多种资源调度导致的。

 

2.集群高可用/容错

DockerSwarm 与 Mesos 都可以通过一致性中间件构造高可用集群。Mesos 的 Master 节点一般通过ZooKeeper 保证高可用,而 Docker Swarm 的 manager节点可以通过 consul、etcd 或ZooKeeper 中的任意一个来保证高可用。 K8s专注容器的高可用性,集群的精细管理,复杂的网络场景

3.基本的健康检查

DockerSwarm 没有提供对其部署的容器进行健康检查的功能,所以需要容器部署方来进行相应的容器的健康检查以及异常重启等;而 Mesos 的调度器Marathon 是支持健康检查的,它可以每隔一段时间扫描一次应用的绑定端口,并在容忍3次或者几次失败后将应用重启,目前支持 HTTP、TCP协议,当然,这都需要应用提供 health 的接口。

4.可扩展性

由于 DockerSwarm 使用标准的 Docker API,从而任何使用 DockerAPI 与 Docker 进行通讯的工具都可以无缝地和 Docker Swarm 协同工作<专注>

Mesos 的可扩展性首先在于它可以承接各种调度器,Spark、Hadoop、Kafka、Cassandra、Marathon、Chronos 等等都可以拿 Mesos 来做资源池;其次,Mesos 可以与Mesos-DNS 结合来实现内部的服务发现/负载均衡。

 

Docker Swarm与k8s的区别

1、出生不同,Google根据其在Linux上容器管理经验,改造到docker管理上,就是kubernetes。他的在许多方面表现良好。最重要的是构造于Google多年的宝贵经验只上。kubernetes并不是为了docker写的,kubernetes把集群带到了一个全新的高度,代价是学习曲线比较陡。docker-swarm使用了一个不同的方式。它是docker原生的集群工具。最方便的部分是它暴露了docker标准的编程接口,意味着你之前一直在使用的任何与docker沟通的工具(docker命令行接口,dockercompose,dokku,krane等等),都可以无缝的在docker swarm上使用。

2、安装配置不同,安装设置swarm非常简单,简单明了并且很灵活。我们需要做的就是安装一个服务发现工具,然后在所有的节点上安装swarm容器。相比较而言,kubernetes的安装就有点复杂。不同的操作系统上安装都不同。每个操作系统都有自己的独立安装指令。

3、运行方式不同,使用Swarm和使用容器没有什么不同。比如,你习惯于使用DockerCLI(命令行接口),你可以继续使用几乎相同的命令。如果你习惯于使用Docker Componse来运行容器,你可以继续在Swarm集群中使用。不管你之前习惯于怎么使用容器,你仍旧可以使用,只是在更大级别的集群中使用。Kubernetes要求你去学习它自己的CLI(命令行接口)和配置。你不能使用你之前创建的docker-compose.yml配置,你必须要去新建与Kubernetes对应的配置。你也不能使用之前学习的DockerCLI(命令行接口)。你必须要去学习 Kubernetes CLI(命令行接口)

从易用性角度来看,建议采用DockerSwarm。从稳定性和可扩展性来看,建议选择Mesos;从网络场景的复杂度与精细化来看,建议选用k8s

 

《二》Docker的网络实现原理

基于对net namespace的控制,docker可以为在容器创建隔离的网络环境,在隔离的网络环境下,容器具有完全独立的网络栈,与宿主机隔离,也可以使容器共享主机或者其他容器的网络命名空间

docker容器的网络有五种模式:

l  bridge:docker默认的网络模式,为容器创建独立的网络命名空间,容器具有独立的网卡等所有单独的网络栈,是最常用的使用方式。

l  host:直接使用容器宿主机的网络命名空间。

l  none:为容器创建独立网络命名空间,但不为它做任何网络配置,容器中只有lo,用户可以在此基础上,对容器网络做任意定制。

l  其他容器:与host模式类似,只是容器将与指定的容器共享网络命名空间。

l  用户自定义:docker1.9版本以后新增的特性,允许容器使用第三方的网络实现或者创建单独的bridge网络,提供网络隔离能力。

 

bridge模式是docker默认的,也是开发者最常使用的网络模式。在这种模式下,docker为容器创建独立的网络栈,保证容器内的进程使用独立的网络环境,实现容器之间、容器与宿主机之间的网络栈隔离。同时,通过宿主机上的docker0网桥,容器可以与宿主机乃至外界进行网络通信。

 

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备(虚拟网卡),Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。

 

同一宿主机上,容器之间都是连接到docker0这个网桥上的,它可以作为虚拟交换机使容器可以相互通信。由于宿主机的IP地址与容器veth pair IP地址均不在同一个网段,故仅仅依靠veth pairnamespace的技术,还不足以使宿主机以外的网络主动发现容器的存在。为了使外界可以访问容器中的进程,docker采用了端口绑定的方式,也就是通过iptablesNAT,将宿主机上的端口端口流量转发到容器内的端口上。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐