Docker Swarm vs kubernetes

1,263 阅读8分钟

在kubernetes(k8s)火遍大江南北的背景下,为何我们在搭建微服务集群的时候,选择了Swarm,而没有选择k8s呢?

对于docker初学者来说,倾向于选择一个学习成本和学习周期相对较低的技术栈。这只是客观原因,后面具体看一下这两种技术栈的区别。

在了解Docker Swarm 和 kubernetes 前,先了解一下这几个名词

容器、容器化和容器编排

容器:容器是包含应用程序代码,配置和依赖关系的软件包,它提高了运营效率和生产力。

容器化:通过在操作系统级别进行虚拟化来使应用程序可移植,从而创建基于内核的隔离的封装系统。容器化的应用程序可以放在任何地方,无需依赖项运行或需要整个VM,从而消除了依赖关系。

容器编排:通常可以部署多个容器以通过自动化实现应用程序的程序,为了解决多个容器部署问题。k8s和swarm便是容器管理和容器编排引擎。

两者对比

Docker Swarm

Docker Swarm是Docker自己针对Docker容器的原生集群解决方案,它的优点是紧密集成到Docker的生态系统中,并且使用自己的API。它监视跨服务器集群的容器数量,是创建集群docker应用程序的最方便的方法,不需要额外的硬件。

优点

  • 以更快的速度运行:当您使用虚拟环境时,您可能已经意识到它需要很长时间,并且包含了启动和启动您想要运行的应用程序的冗长过程。对于Docker Swarm来说,这不再是一个问题。Docker Swarm不需要启动一个完整的虚拟机,就可以让应用程序在虚拟和软件定义的环境中快速运行,并有助于DevOps的实现。
  • 文档提供了所有的信息:Docker团队在文档方面非常突出! Docker正在快速发展,并且非常受欢迎。如果平台的一个版本在短时间间隔内发布,有些平台可能不维护文档。但是Docker Swarm从不这样,如果一些信息只适用于Docker Swarm的特定版本,那么相应文档将确保更新了所有信息。
  • 提供简单快速的配置:Docker Swarm的一个主要优点是它简化了问题。Docker Swarm使用户可以自己配置,将其放入代码中并轻松部署。由于Docker Swarm可以在各种环境中使用,因此需求不受应用程序环境的约束。
  • 确保应用程序是隔离的:Docker Swarm负责将每个容器与其他容器隔离,并拥有自己的资源。你可以部署各种容器,以便在不同的堆栈中运行单独的应用程序。除此之外,Docker Swarm将在每个应用程序在自己的容器上运行时清除应用程序的删除。如果不再需要应用程序,可以删除它的容器。它不会在您的主机OS上留下任何临时文件或配置文件。
  • 版本控制和组件重用:使用Docker Swarm,您可以跟踪容器的连续版本、检查差异或回滚到前面的版本。容器重用来自前一层的组件,这使得它们非常轻量级。

缺点

  • Docker依赖于平台: Docker Swarm是一个为Linux设计的平台。虽然Docker支持Windows和Mac OS X,但它使用虚拟机在非linux平台上运行。设计为在Windows上的Docker容器中运行的应用程序不能在Linux上运行,反之亦然。
  • 不提供存储选项: Docker Swarm不提供将容器连接到存储的简便方法,这是主要缺点之一。它的数据量需要对主机和手动配置进行大量的改进。如果你想要Docker Swarm解决存储问题,也能办到,但是方式并不高效,且这种方式对用户并不友好。
  • 监控不良: Docker Swarm提供关于容器的基本信息,如果您正在寻找基本的监控解决方案,那么使用Stats命令就足够了。如果您正在寻找先进的监控,那么Docker集群不是好的选择。虽然有像CAdvisor这样的第三方工具可以提供更多的监控,但是使用Docker本身实时收集更多关于容器的数据是不可行的。

kubernetes

kubernetes,简称K8s,是用8代替名字中间的8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。

k8s 和 Docker的关系是怎样的呢?

通常,我们会把Kubernetes(k8s)看作Docker的上层架构,就好像Java与J2EE的关系一样:J2EE是以Java为基础的企业级软件架构,Kubernetes(k8s)则以Docker为基础打造了一个云计算时代的全新分布式系统架构。但Kubernetes(k8s)与Docker之间还存在着更为复杂的关系,从表面上看,似乎Kubernets(k8s)离不开Docker,但实际上在Kubernetes(k8s)的架构里,Docker只是其目前支持的两种底层容器技术之一,另一种容器技术则是Rocke。

优点

  • 速度很快:在不停机的情况下持续部署新功能时,Kubernetes是一个完美的选择。Kubernetes的目标是以恒定的正常运行时间更新应用程序。它的速度通过您每小时可以运送的许多功能来衡量,同时保持可用的服务。
  • 遵循不可变基础架构的原则: 在传统的方法中,如果多个更新出现错误,您没有任何关于部署了多少个更新以及发生错误的时间点的记录。在不可变的基础架构中,如果想要更新任何应用程序,需要使用新标记构建容器映像并部署它,用旧映像版本销毁旧容器。这样,你就会有一个记录,并了解你做了什么,万一有什么错误;您可以轻松地回滚到前面的映像。
  • 提供声明式配置: 用户可以知道系统应该处于什么状态以避免错误。源代码控制、单元测试等传统工具不能与命令式配置一起使用,但可以与声明式配置一起使用。
  • 大规模部署和更新软件:由于Kubernetes具有不可变的声明性,因此扩展很容易。Kubernetes提供了一些用于扩展目的的有用功能:

(1) 水平基础架构扩展:在单个服务器级别执行操作以应用水平扩展。可以毫不费力地添加或分离atest服务器。

(2)自动扩展:根据CPU资源或其他应用程序指标的使用情况,您可以更改正在运行的容器数

(3) 手动扩展:您可以通过命令或界面手动扩展正在运行的容器的数量

(4)复制控制器:复制控制器确保集群在运行状态下具有指定数量的等效pod。如果存在太多pod,则复制控制器可以删除额外的pod,反之亦然。

  • 处理应用程序的可用性:Kubernetes检查节点和容器的运行状况,并在由于错误导致的盒中崩溃时提供自我修复和自动替换。此外,它在多个pod之间分配负载,以便在意外流量期间快速平衡资源。
  • 存储卷: 在Kubernetes中,数据是在容器之间共享的,但是如果pod被杀死,则自动删除卷。此外,数据是远程存储的,因此如果将pod移动到另一个节点,数据将一直保留,直到用户删除它。

缺点

  • 初始进程需要时间: 当创建一个新进程时,您必须等待应用程序启动,然后用户才能使用它。如果您要迁移到Kubernetes,则需要对代码库进行修改,以提高启动流程的效率,这样用户就不会有不好的体验。
  • 迁移到无状态需要做很多工作: 如果您的应用程序是集群的或无状态的,那么将不会配置额外的pod,并且必须重新处理应用程序中的配置。
  • 安装过程非常单调乏味: 如果不使用Azure、谷歌或Amazon等云提供商,就很难在集群上设置Kubernetes。

Kubernetes或Swarm如何选择呢?

Kubernetes

您正在寻找成熟的部署和监控选项。 您正在寻找快速可靠的响应时间。 您正在寻求开发复杂的应用程序,并且需要高资源计算而不受限制。 你有一个非常大的集群。

Swarm

希望在不花费太多时间进行配置和安装的情况下启动工具。 正在寻找开发一个基本和标准的应用程序,它足够使用默认的docker镜像。 在不同的操作系统上测试和运行相同的应用程序。 您需要zdocker API经验和兼容性。

无论你选择Kubernetes还是Swarm,两者都被认为是最好的,并且有相当大的差异。在这两者之间做出选择的最好方法可能是考虑哪一个您已经比较熟悉,或者哪一个适合您现有的软件堆栈。如果您需要开发复杂的应用程序,请使用Kubernetes,如果您希望开发小型应用程序,请使用Swarm。

Swarm懂容器,但K8S更懂管理。

文章内容主要来源:www.modb.pro/db/116201