swarm与kubernetes的对比

前言:docker swarm 与kubernetes都是集群管理工具,一个是docker原生自带,一个是谷歌项目下的容器编排工具,那么到底他们到底有什么有缺点呢?

kubernetes:

kubernetes,是Google多年大规模容器管理技术的开源版本,是众多厂商推崇的docker管理优秀之作,随着越来越多的厂商不停地贡献代码,kubernetes功能也愈发完善

swarm:

Swarm是Docker公司在2014年12月初发布的一套用来管理Docker集群的较为简单的工具,由于Swarm使用标准的Docker API接口作为其前端访问入口,所以各种形式的Docker Client(dockerclient in go, docker_py, docker等)都可以直接与Swarm通信。随着Swarm0.2发布,swarm增加了新的策略来调度集群中的容器方式,使得在可用的节点上传播它们,以及支持更多的Docker命令以及集群驱动。

swarm结构图

示例

那么到底是docker亲儿子swarm管理上更胜一筹还是Google的kubernetes管理更加受人们青睐,下面是本人总结的对比详情。

swarm与kubernetes

swarm优点:

1 架构简单,部署运维成本较低

docker swarm 集群模式由于原生态集成到docker-engine中,所以首先学习成本低,对于使用docker-engine 1.12版本及以上可以平滑过渡,service服务可以满足动态增减容器个数,同时具备自身的负载均衡,swarm管理者多台设定保证了机器在出错后有一个良好的容灾机制

2 启动速度快

swarm集群只会有两层交互,容器启动是毫秒级

swarm劣势:

1 无法提供更精细的管理

swarm API兼容docker API,所以使得swarm无法提供集群的更加精细的管理

2 网络问题

在网络方面,默认docker容器是通过桥接与NAT和主机外网络通信,这样就出现2个问题,一个是因为是NAT,外部主机无法主动访问到容器内(除了端口映射),另外默认桥接IP是一样的,这样会出现不同主机的容器有相同的IP的情况。这样两容器更加不能通信。同时网络性能方面,有人测试经过桥接的网络性能只有主机网络性能的70%。当然以上问题可以通过其他工具解决,比如用 Flannel 或者 OVS网桥

3 容器可靠性

在容器可靠性方面,相较于Kubernetes的Replication Controllers可以监控并维持容器的生命,swarm在启动时刻可以控制容器启动,在启动后,如果容器或者容器主机崩溃,swarm没有机制来保证容器的运行。

kubernetes优点:

1 管理更趋于完善稳定

kubernetes 集群管理更趋于完善稳定,同时pod功能上比swarm的service更加强大

2 健康机制完善

Replication Controllers可以监控并维持容器的生命

3 轻松应对复杂的网络环境

kubernetes默认使用Flannel作为overlay网络。

Flannel是CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(OverlayNetwork)工具,其目的在于帮助每一个使用 Kuberentes 的CoreOS 主机拥有一个完整的子网。

kubernetes劣势:

1 配置、搭建稍显复杂,学习成本高

由于配置复杂,学习成本相对较高,对应运维的成本相对高点

2 启动速度稍逊

kubernetes会有五层交互,启动是秒级,启动速度慢于swarm

通过以上介绍,相信大家应该对docker容器集群管理工具的选择有了一个基本的认识,不管怎么选择,最终我们的目的都是为了减少人为干预,更智能的生产环境运维,所以应该根据实际情况斟酌选择。

 

-----------

下面这里有很多 相关 教程 可以参考 https://www.aliyun.com/jiaocheng/topic_24443.html

例如下面的一个例子

  • docker~swarm搭建docker高可用集群
  • 摘要:回到目录Swarm概念Swarm是Docker公司推出的用来管理docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机。Swarm使用标准的DockerAPI接口作为其前端访问入口,换言之,各种形式的DockerClient(dockerclientinGo,docker_py,docker等)均可以直接与Swarm通信。Swarm几乎全部用go语言来完成开发,Swarm0.2发布,相比0.1版本,0.2版本增加了一个新的策略来调度集群中的容器,使得在可用的节
  • 回到目录Swarm概念Swarm是Docker公司推出的用来管理docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机。Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(docker client in Go, docker_py, docker等)均可以直接与Swarm通信。Swarm几乎全部用go语言来完成开发,Swarm0.2发布,相比0.1版本,0.2版本增加了一个新的策略来调度集群中的容器,使得在可用的节点上传播它们,以及支持更多的Docker命令以及集群驱动。
    Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受docker客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,当Swarm重新恢复运行之后,它会收集重建集群信息.

    Swarm结构图docker~swarm搭建docker高可用集群

    Swarm的基本命令docker node 用来显示集群的节点,默认建立时只有一个节点,当然也就谈不上高可用了,可以使用docker node --help来查看所有node参数

    docker~swarm搭建docker高可用集群

    集群初始化 docker swarm init

    docker~swarm搭建docker高可用集群

    当已经被初始化后,就不能重新执行这个操作了,使用docker node ls 来查看刚建立的集群

    集群中的管理节点和工作节点功能图

    docker~swarm搭建docker高可用集群

    添加管理节点 docker swarm join

    Docker Swarm 命令中还需要添加一些选项:

    * join:表明一个新的节点将被添加进 Swarm

    * –manager:表明节点的性质(manager vs worker)

    * –listen-addr:让一个新添加的节点可以访问 Swarm 内的其他节点

    * 最后的参数就是第一管理节点的地址(即这一命令将被送到的那个节点)

    注意:由于 –auto-accept manager 选项会在 Swarm 初始化的过程中被提供,所以第二管理节点会被自动接受。如果没有这一选项,那么第二管理节点需要被第一管理节点手动接受。

    $ MANAGER2_IP=$(docker-machine ip manager2)docker-machine ssh manager2 docker swarm join --manager --listen-addr $MANAGER2_IP:2377 $MANAGER1_IP:2377

    Swarn部署时使用的脚本,来自网络

    下面是一小段用来创建 Docker 主机并部署 Swarm 的 Shell 脚本。当然了,管理/工作节点的数字都是可以随意改动的。
    注意:创建两个管理节点和两个工作节点,仅仅是用来作示范。在工业生产中,我们可能需要在集群里搭建 3 个管理节点和 5 个工作节点。

    # Define the number of managers/workersMANAGER=3WORKER=5# Create the Docker hostsfor i in $(seq 1 $MANAGER); do docker-machine create --driver virtualbox manager$i; donefor i in $(seq 1 $WORKER); do docker-machine create --driver virtualbox worker$i; done# Init the swarmdocker-machine ssh manager1 docker swarm init --auto-accept manager --auto-accept worker --listen-addr $(docker-machine ip manager1):2377# Add additional manager(s)for i in $(seq 2 $MANAGER); do docker-machine ssh manager$i docker swarm join --manager --listen-addr $(docker-machine ip manager$i):2377 $(docker-machine ip manager1):2377; done# Add workersfor i in $(seq 1 $WORKER); do docker-machine ssh worker$i docker swarm join --listen-addr $(docker-machine ip worker$i):2377 $(docker-machine ip manager1):2377; done对于上面文章中,只提到了集群,而没有谈到如何去使用,在建立集群后,服务的部署我们可以用

    docker stack deploy  -c test.yml test

    来建立一个服务,同时可以使用docker service来查看已经运行的服务!

    回到目录