长期以来,Kubernetes 和 Docker Swarm被看做是vs的对手,在接下来的对比中,我们看一下它们应该在何时被使用,以及怎么一起工作的。
关于Kubernetes和Docker有无数的争论和讨论。如果你没有深入研究它们,你会认为这两种开源技术在争夺容器(container)霸权。 让我们来一看清楚,Kubernetes和Docker Swarm不是竞争对手!两者都有各自的优缺点,可以根据你应用程序的需求来选择使用。(择优选用,相互协作)
这篇文章中,详细讨论了一下几个问题:
【DevOps】开发运维
如果你想要开发现代云基础架构或DevOps实现,那么全面了解Kubernetes and Docker是非常有必要的,这篇文章将带您从头开始探讨Kubernetes与Docker Swarm的历程,并将帮助您回答上面每个重要问题。
容器是包含应用程序代码,配置和依赖关系的软件包,它提高了运营效率和生产力。在这里,您可以确切地知道它将如何运行,这意味着它是可预测的、可重复的和不可变的。容器的兴起极大地促进了DevOps作为一种服务的发展,并且能够克服当前面临的最大安全障碍。
容器化通过在操作系统级别进行虚拟化来使应用程序可移植,从而创建基于内核的隔离的封装系统。容器化的应用程序可以放在任何地方,无需依赖项运行或需要整个VM,从而消除了依赖关系。
但是如果有多个容器呢?
这就需要容器编排(container orchestration)了!
容器编制是一个通常可以部署多个容器以通过自动化实现应用程序的程序。
Kubernetes和Docker Swarm这样的平台是容器管理和容器编排引擎,使用户能够指导容器部署并自动执行更新,运行状况监视和故障转移过程。
这一切听起来都很不错,但你如何实际使用工具和构建容器?
让我们从Docker开始吧。
构建、运输和运行任何应用程序
“Build, Ship, and Run Any App Anywhere”
Docker 官网:http://www.docker.com Github Docker
源码:https://github.com/docker/docker
Docker是一种容器管理服务,它帮助开发人员设计应用程序,使用容器能更容易地创建、部署和运行应用程序。Docker有一个用于集群容器的内置机制,称为“集群模式”(swarm mode)。使用集群模式,你可以使用Docker引擎在多台机器上启动应用程序。
Docker Swarm是Docker自己针对Docker容器的原生集群解决方案,它的优点是紧密集成到Docker的生态系统中,并且使用自己的API。它监视跨服务器集群的容器数量,是创建集群docker应用程序的最方便的方法,不需要额外的硬件。它为Dockerized应用程序提供了一个小型但有用的编排系统。
- 更快的运行速度
- 完备的相关技术文档
- 快速简单的配置
- 确保程序独立(容器间低耦合)
- 版本控制与组件重用
- 跨平台支持效果差
- 不提供存储选项
- 监控信息不足
自动化容器部署、扩展和管理平台
Automated Container Deployment, Scaling and Management Platform
当在多台机器上的多个容器中使用不同组件开发应用程序时,需要一个工具来管理和协调容器。这只有在Kubernetes的帮助下才可行。
Kubernetes是一个用于在集群环境中管理容器化应用程序的开源系统。以正确的方式使用Kubernetes可以帮助DevOps作为一个服务团队自动扩展应用程序,并在零停机的情况下进行更新。
它的速度很快:在不停机的情况下持续部署新功能时,Kubernetes是一个完美的选择。Kubernetes的目标是以恒定的正常运行时间更新应用程序。它的速度通过您每小时可以运送的许多功能来衡量,同时保持可用的服务。
遵循不可变基础架构的原则: 在传统的方法中,如果多个更新出现错误,您没有任何关于部署了多少个更新以及发生错误的时间点的记录。在不可变的基础架构中,如果想要更新任何应用程序,需要使用新标记构建容器映像并部署它,用旧映像版本销毁旧容器。这样,你就会有一个记录,并了解你做了什么,万一有什么错误;您可以轻松地回滚到前面的映像。
提供声明式配置: 用户可以知道系统应该处于什么状态以避免错误。源代码控制、单元测试等传统工具不能与命令式配置一起使用,但可以与声明式配置一起使用。
大规模部署和更新软件:由于Kubernetes具有不可变的声明性,因此扩展很容易。Kubernetes提供了一些用于扩展目的的有用功能:
处理应用程序的可用性:Kubernetes检查节点和容器的运行状况,并在由于错误导致的盒中崩溃时提供自我修复和自动替换。此外,它在多个pod之间分配负载,以便在意外流量期间快速平衡资源。
存储卷: 在Kubernetes中,数据是在容器之间共享的,但是如果pod被杀死,则自动删除卷。此外,数据是远程存储的,因此如果将pod移动到另一个节点,数据将一直保留,直到用户删除它。
初始进程需要时间: 当创建一个新进程时,您必须等待应用程序启动,然后用户才能使用它。如果您要迁移到Kubernetes,则需要对代码库进行修改,以提高启动流程的效率,这样用户就不会有不好的体验。
迁移到无状态需要做很多工作: 如果您的应用程序是集群的或无状态的,那么将不会配置额外的pod,并且必须重新处理应用程序中的配置。
安装过程非常单调乏味: 如果不使用Azure、谷歌或Amazon等云提供商,就很难在集群上设置Kubernetes。
Docker Swarm | Kubernetes | |
---|---|---|
开发者 | Docker 公司 | 谷歌 |
发布年份 | 2013 | 2014 |
公司使用 | Bugsnag,Bluestem Brands,Hammerhead,Code Picnic,Dial once等。 | Asana,Buffer,CircleCI,Evernote,Harvest,Intel,Starbucks,Shopify等 |
Controller | Manager | Master |
Storage | Volumes | Persistent and Epherma |
公共云服务提供商 | Google,Azure,AWS,OTC | Azure |
兼容性 | 不那么广泛和可定制 | 更广泛和高度可定制 |
安装 | 易于设置 | 需要时间安装 |
容差率 | 低容错性 | 高容错性 |
大集群 | 对于强集群状态考虑速度 | 在不考虑速度的情况下,即使在大型集群中也提供容器部署和扩展 |
负载均衡(Loading Balancing) | 当容器中的pod定义为服务时,提供负载平衡 | 通过集群中的任何节点提供自动的内部负载平衡 |
部署单位 | Task | Pod |
Port | Published Port | Endpoint |
社区 | 活跃的用户群,定期更新各种应用程序的映像 | 获得开源社区和谷歌,亚马逊,微软和IBM等大公司的大力支持 |
弱点 | 没有供应商的认证计划。大多数组织需要商业认证版本 | 倾向于开发人员而不是中央IT |
优势 | 主要由可以决定产品方向的单一供应商控制 | 明确的市场领导者 最高的采用率 |
Slave | Worker | Nodes |
容器设置 | 功能由Docker API提供并受其限制 | 客户端API和YAML, 在Kubernetes中是唯一的 |
可扩展性 | 即使在大型容器中也可以快速部署容器 | 以牺牲速度为代价为集群状态提供强有力的保证 |
正如前面所讨论的,Kubernetes和Docker都在不同的级别上工作,但都可以一起使用。Kubernetes可以集成Docker引擎来执行Docker容器的调度和执行。由于Docker和Kubernetes都是容器编排器,所以它们都可以帮助管理容器的数量,还可以帮助DevOps实现。两者都可以自动化运行容器化的基础架构中涉及的大部分任务,并且都是开源软件项目,由Apache License 2.0管理。除此之外,两者都使用YAML格式的文件来控制工具如何编排容器集群。当两者同时使用时,Docker和Kubernetes都是部署现代云架构的最佳工具。随着Docker Swarm的豁免,Kubernetes和Docker都相互补充。
Kubernetes使用Docker作为主要的容器引擎解决方案,Docker最近宣布它可以支持Kubernetes作为其企业版的编排层,除此之外,Docker还批准了经过认证的Kubernetes程序,该程序可确保所有Kubernetes API按预期运行。Kubernetes使用Docker Enterprise的功能,如安全映像管理,其中Docker EE提供映像扫描,以确保容器中使用的映像是否存在问题。另一个是安全自动化,其中组织可以消除低效率,例如扫描映像是否存在漏洞。
您正在寻找成熟的部署和监控选项
您正在寻找快速可靠的响应时间
您正在寻求开发复杂的应用程序,并且需要高资源计算而不受限制
你有一个非常大的集群
您希望在不花费太多时间进行配置和安装的情况下启动工具;
您正在寻找开发一个基本和标准的应用程序,它足够使用默认的docker镜像;
在不同的操作系统上测试和运行相同的应用程序对您来说不是问题;
您需要zdocker API经验和兼容性。
无论你选择Kubernetes还是Docker,两者都被认为是最好的,并且有相当大的差异。在这两者之间做出选择的最好方法可能是考虑哪一个您已经比较熟悉,或者哪一个适合您现有的软件堆栈。如果您需要开发复杂的应用程序,请使用Kubernetes,如果您希望开发小型应用程序,请使用Docker Swarm。此外,选择正确的项目是一项非常全面的任务,完全取决于您的项目需求和目标受众。
文章翻译自:《Kubernetes vs. Docker Swarm: A Complete Comparison Guide》
文章有些注解是自己加的,有错误的地方欢迎指出更正。