swarm和k8s本质都是容器编排服务。它们都能把底层的宿主机抽象化,然后将应用从以构建好的镜像开始,最终以docker的方式部署到宿主机上。
 
应该选择哪种方案作为我们的容器云服务呢?
我觉得k8s(kubernetes简称)跟swarm的比较好比MySQL和SQL Server的比较,前者轻量级、实施快、以实现核心功能为重,比较适合小规模部署,后者则是企业级、功能全、支撑场景多,适合做企业级docker云方案。
如下我对两者做出的一些对比:
 
  1. 设计理念有区别
swarm偏重的是容器的部署,而k8s更高一层:应用的部署。k8s对容器的所有操作都渗透着为应用而服务的理念,比如pod是为了让联系紧密但又不适合部署在一起的应用分别部署在不同docker里面,但docker之间共享volume和network namespace方式,以便实现紧密地“交流”,在比如service是为了隐藏pod(容器的集合,下文会介绍到)的网络细节,让pod提供固定的访问入口,从而方便地让其他应用访问等。
另外,k8s特别擅长大规模docker的管理。为了解决复杂场景下应用的部署,k8s的组件要比swarm多得多,即便似乎功能类似的组件,k8s很多时候都在场景支持上要优化swarm,以调度为例,swarm只有三种调度策略:宿主机负载、宿主机运行容器的多寡、随机指定宿主机,但K8s除此之外,策略更加丰富,它的策略数量是swarm的2倍以上。比如它还有端口冲突策略(在大规模部署docker时,端口冲突是必须要考虑的场景)、容器挂载的卷冲突策略、指定特定宿主机策略等。
 
  1. k8s安装复杂当适应更多场景
swarm与docker天然集成,安装和使用很简单,特别是docker 1.12及以上版本,swarm已经集成到了docker的engine中,因此docker安装后swarm的 部署已经完成了一半,而且swarm的操作都是通过docker api来实现,掌握了docker的操作命令后上手swarm很简单,基本上一个星期都可以玩的比较6了。
k8s基于docker,但围绕着应用的部署开发了很多组件,这些组件很多并不依赖于docker的api,在部署时需要单独规划和实施,而且因为组件中很多策略适应不同的部署场景,所以在部署前不仅仅要明白场景需求,而且还要对组件的设计逻辑了如指掌。所以安装和熟悉过程相比swarm而言要曲折很多。
 
  1. docker vs pod
在swarm中,被创建、调度和管理的最小单元就是docker。
在k8s中,最小单元则是pod(豌豆荚),pod由一个或者多个为实现某个特定功能而放在一起的容器组成。在pod内的docker共享volume和网络namespace,彼此之间可以通过localhost通信或者标准进程间通信。
用pod有什么好处呢?
我们试想这样一个场景:我们有一个web应用的容器,现在我们为了收集web日志需要安装一个日志插件,如果把插件安装在web应用容器的里面,则会面临如下一些问题:
  • 如果插件有更新,尽管web应用没有变化,但因为两者共享一个镜像,则必须把整个镜像构建一遍;
  • 如果插件存在内存泄露的问题,整个容器就会有被拖垮的风险
如果把插件安装在不同的容器,同样也不合适,因为你要想办法解决插件所在容器读取web容器的日志的问题。
有了pod以后,这些问题都可以迎刃而解。在pod里面为日志插件和web应用各自创建一个容器,两者共享volume,web应用容器只需将日志保存到volume,变可以很方便的让日志插件读取。同时,两个容器拥有各自的镜像,彼此更新互不影响。
 
  1. 容器内的负载均衡
swarm自带的负载均衡机制应用不广,大部分还是采用nginx+consul。nginx本身也是单独的 容器,而consul保存了各个docker中应用的网络信息(IP和端口),nginx镜像在compose时,在dockerfile中指定consul的地址,取出consul中保存的应用的网络信息,作为参数配置到nginx的config file中,从而实现负载均衡。
这种模式的缺点就是:nginx的容器中的配置文件无法跟着应用docker的网络信息发生变化而更改,也就是说,如果新增加了docker,新增加的docker IP和应用端口则需要手动添加到nginx的config file中,或者重新构建nginx的容器。
kubernetes的负载均衡要完善很多,内部集成了负载均衡。而且,对于dockerIP变更的问题也有很好的处理机制:k8s通过service实现负载均衡,service是pod(pod包含了容器,容器中包含了应用)的访问入口,它指向一组有相同label的多个pod。每个service创建的时候会在k8s内置的dns服务器中写入一条记录:service的名称和service的IP。当需要访问pod中的应用时,只需访问service的名称即可,pod的IP对访问者来说是透明的,因此不管怎么变都不会影响负载均衡。
 
  1. 谁最适合灰度发布
两者都支持灰度发布。
但swarm的灰度发布是一次梭哈。当执行swarm update操作时,所有旧的docker逐一全部替换成新的版本。如果在替换过程中我发现新版本存在问题时,我只能强行终止update,然后执行回滚。在这个过程中对线上的应用会有影响。
而k8s有replication controller的机制,可以人为控制灰度发布的过程。在发布的过程中,我可以让k8s通过replication controller起一小部分新版本的pod并减少对应数量老版本的pod,新的pod可响应用户的请求,如果新的pod比较顺利,则慢慢增加新版本的数量而减少老版本数量,直至新版本全部替换老版本,如果新的pod出现了问题,此时让新pod立即下线,从而不对线上业务造成影响。
k8s的发布过程可以人为干预,因此在重大发布时,这种方式其实更优。
 
  1. 弹性伸缩
弹性伸缩是指根据宿主机硬件资源承载的情况而做出的一种容器部署架构动态变化的过程。
比如某台宿主机的CPU使用率使用偏高,k8s可以根据Pod的使用率自动调整一个部署里面Pod的个数,保障服务可用性,但swarm则不具备这种能力。
 
  1. 生态
swarm是docke官方推出的集群方案,k8s是脱胎于google的一款基于容器的应用部署和管理打造一套强大并且易用的管理平台。相比swarm而言,k8s更懂容器的管理。
从github上也可以到看到k8s项目的star和fork 都很高,而且网上找的资料也非常丰富。也正是基于k8s的生态影响力,导致docker不得不在新发布的docker EE(Enterprise Edition)将k8s整合进来。
 
结论:
综上所述,K8S作为一款企业级的容器云方案,更值得我们进行研究。套用业界流行的话:swarm懂容器,但K8S更懂管理。
 
 
 

容器云技术选择之kubernetes和swarm对比的更多相关文章

  1. Docker 管理工具的选择:Kubernetes 还是 Swarm?

    [编者的话]选择Kubernetes 或者 Swarm 就像在将 Linux 桌面发行版的范围缩小到两个后选出一个最喜欢的.哪个更满足你的需要如何才是决定因素. [3 天烧脑式基于Docker的CI/ ...

  2. 容器云技术:容器化微服务,Istio占C位出道

    在精彩的软件容器世界中,当新项目涌现并解决你认为早已解决的问题时,这感觉就像地面在你的脚下不断地移动.在许多情况下,这些问题很久以前被解决,但现在的云原生架构正在推动着更大规模的应用程序部署,这就需要 ...

  3. 容器云平台No.4~kubernetes 服务暴露之Ingress

    这是容器云平台第四篇,接上一篇继续, 首先kubernetes服务暴露有如下几种方式: NodePort Loadbalance ClusterIP Ingress 本文紧贴第一篇架构图,只介绍Ing ...

  4. 容器云平台No.9~kubernetes日志收集系统EFK

    EFK介绍 EFK,全称Elasticsearch Fluentd Kibana ,是kubernetes中比较常用的日志收集方案,也是官方比较推荐的方案. 通过EFK,可以把集群的所有日志收集到El ...

  5. 容器云平台No.8~kubernetes负载均衡之ingress-nginx

    Ingress 是什么? Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由. 流量路由由 Ingress 资源上定义的规则控制. 可以将 Ingress 配置为服务提供外 ...

  6. 容器云平台No.7~kubernetes监控系统prometheus-operator

    简介 prometheus-operator Prometheus:一个非常优秀的监控工具或者说是监控方案.它提供了数据搜集.存储.处理.可视化和告警一套完整的解决方案.作为kubernetes官方推 ...

  7. 容器云平台No.3~kubernetes使用

    今天是是第三篇,接着上一篇继续 首先,通过kubectl可以看到,三个节点都正常运行 [root@k8s-master001 ~]# kubectl get no NAME STATUS ROLES ...

  8. IBM基于Kubernetes的容器云全解析

    基于Kubernetes的容器云 容器云最主要的功能是以应用为中心,帮助用户把所有的应用以容器的形式在分布式里面跑起来,最后把应用以服务的形式呈现给用户.容器云里有两个关键点,一是容器编排,二是资源调 ...

  9. 026.[转] 基于Docker及Kubernetes技术构建容器云平台 (PaaS)

    [编者的话] 目前很多的容器云平台通过Docker及Kubernetes等技术提供应用运行平台,从而实现运维自动化,快速部署应用.弹性伸缩和动态调整应用环境资源,提高研发运营效率. 本文简要介绍了与容 ...

随机推荐

  1. The import javax.servlet.jsp.JspException cannot be resolved

    问题描述   重新更换了 Apache Tomcat 的版本,在 Eclipse 中项目报错信息:The import javax.servlet.jsp.JspException cannot be ...

  2. Django—常用功能

    索引 一.静态文件 二.中间件 三.Admin站点 3.1 列表页选项 3.2 编辑页选项 3.3 重写模板 四.上传图片 4.1 在管理页面admin中上传图片 4.2 自定义form表单中上传图片 ...

  3. python3与mysql交互

    1.安装pymysql模块 pip3 install pymysql3 2.pymysql的简单使用: # /usr/bin/env python3 import pymysql class Mysq ...

  4. Python之copy模块

    概念 官方解释:Python中的赋值语句不复制对象,它们在目标和对象之间建立索引.对于可变项目或可变项目的集合,有时需要一个副本,以便可以更改一个副本而不更改其他副本.该模块提供通用的浅层和深层cop ...

  5. 「JOISC 2018 Day 3」比太郎的聚会

    题解: 很套路的题目 我们按照询问中的不算的个数是否大于$block$分类 如果大于,就$O(n)dp$一下 如果小于,就预处理出到每个点前$block$小的点 $block取\sqrt{n}$的话复 ...

  6. CAShapLayer的使用1

    1.添加橙色圆环 - (CAShapeLayer *)shapeLayer { if (!_shapeLayer) { _shapeLayer = [CAShapeLayer layer]; CGRe ...

  7. Windows 2008 如何启用 TLS1.1 1.2

    1.下载工具:下载>>> 2.在服务器运行本软件,点击“Bes”按钮,然后必须确保有TLS 1.2被选中,SSL2 SSL3可以不用选择,然后点击Apply按钮,这时系统提醒您重启, ...

  8. Manacher算法 (马拉车算法)

    #include<iostream> #include<string.h> #include<algorithm> using namespace std; ]; ...

  9. Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第六集之补充:文本编辑器vi/vim】

    一:vi/vim的基本使用流程,掌握这三个步骤就算是入门vi或者vim.接下来的学习都是对vim命令和使用技巧的掌握,这要求各位自己去记忆.因为很少使用到某些命令,自然我们经常忘记这些命令,所以一旦忘 ...

  10. 029 Es面试小节

    1.大纲 Es是什么?处理哪种业务逻辑用的多? Es类比数据库是什么? 对于数据库的字段.表等,在es中叫什么? Es的refresh把数据写到哪里? Es的数据如何变成检索和聚合索引的? Es的fl ...