容器云技术选择之kubernetes和swarm对比

2023-11-16

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更懂管理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • linux 查询服务器的配置信息

    linux下看配置 可没有windows那么直观 你只能一个一个查看 一 cpu root srv more proc cpuinfo grep model name root srv grep model name proc cpuinf
  • 【Java数据结构】泛型详解+图文,通配符上界、下界

    0 泛型的本质 0 泛型的目的 1 泛型的语法 1 1 泛型的使用 2 包装类 2 1 装箱和拆箱 2 2 1练习题 3 泛型如何编译 4 泛型的上界 5 通配符 5 1通配符上界 5 2通配符下界 有坑填坑 0 泛型的本质 泛型的本质 泛
  • 【目标检测】25、Sparse R-CNN: End-to-End Object Detection with Learnable Proposals

    文章目录 一 背景 二 动机 三 方法 3 1 Backbone 3 2 Learnable proposal box 3 3 Learnable proposal feature 3 4 Dynamic instance interact
  • 【转载】Android Studio工程目录解析

    转载自CSDN网友HaiBing Android Studio工程目录结构分析 上 Android Studio工程目录结构分析 下 目录 Android Studio工程目录结构分析 上 Android Studio工程目录 app目录结
  • nltk_data无法下载或无法使用问题的解决方案之一

    nltk data无法下载或无法使用问题的解决方案汇总 报错展示 问题解决 本人使用的方法 1 手动下载 nltk data 数据压缩包 2 解压压缩包 找到packages文件夹 3 将packages文件夹中的文件全部复制到nltk d
  • 你是不是一个优秀的项目经理人(转)

    下面是项目管理之中最重要的一些技能被简化成的一些简单的小问题 你可以用它来测试你自己的水平 一 你没有很好地计划是因为你认为自己是一个执行者而不是计划者 很多人认为他们自己是行动型的 当他们被指派了一项任务时 他们的第一个反应就是着手开始解
  • 四、SpringBoot框架

    目录 什么是SpringBoot框架 SpringBoot的特点 作用 必会 简箱版tomcat 优缺点 面试 SpringBoot运行原理 开箱即用的全过程 SpringBoot是如何完成自动配置的 面试 SpringBoot启动项 St
  • C++面向对象------继承+多态

    概念 1 继承是从已有的类创建新类的过程 这使得创建和维护一个应用程序变得更容易 达到了重用代码功能和提高执行时间的效率 2 继承呈现了面向对象程序设计的层次结构 体现了从简单到复杂的认知过程 3 在c 类中 如果类b继承于类a 则类a叫做
  • uiautomator2常见的API操作

    click int x int y pressHome getCurrentActivityName pressMenu getCurrentPackageName takeScreenshot File storePath getDisp
  • 在typora中插入图片和视频

    在typora中插入图片和视频 sm ms图床 免费方案使用sm ms图床 这个东西很好用而且免费 使用方法可以参考 需要配置的点就是下面这一段 picBed uploader smms smms token 这里是你的smmstoken
  • 记录缓存知识

    所谓的缓存 就是将程序或系统经常du要调用的对象存在内存中 一遍其使用zhi时可以快速调用dao 不必再去创建新的重复的实例 这样做可以减少系统开销 提高系统效率 1 通过文件缓存 顾名思义文件缓存是指把数据存储在磁盘上 不管你是以XML格
  • 详解Linux系统中的软件管理及软件仓库

    目录 一 Linux中软件包的类型 二 软件包的名称结构 三 rpm命令管理软件包 四 本地软件仓库的搭建 五 dnf软件管理命令 总结 一 Linux中软件包的类型 DEB UEBlinux DEBlinux RPM redhat cen
  • Linux系统下对树莓派镜像进行烧写操作。可搭建自己的迷你服务器

    烧写后可以当做搭建自己的迷你服务器或者可携带的计算机哦 我以linux系统下对内存卡进行烧写镜像 烧写的先以snappy ubuntu care为例 网上的资料大多都是win下操作的 步 1 购买嵌入式开发板 可选够集成度大的 可烧写系统的
  • 【ES小结】还在用ElasticSearch做查询?换条思路实现高效数据统计

    博客首页 派 大 星 欢迎关注 点赞 收藏 留言 本文由派大星原创编撰 系列专栏 ES小结 本系列记录ElasticSearch技术学习历程以及问题解决 ElasticSearch高效数据统计 聚合查询 什么是聚合查询 Kibana 命令测
  • logback日志配置

  • Top-level statements must precede namespace and type declarations. [Test]csharp(CS8803)

    C NET 6 结构体 C 控制台应用程序定义了一个结构体 然后创建结构体实例 报如下错误 Top level statements must precede namespace and type declarations Test csh
  • 浅谈Dictionary用法

    一 基础篇 1 Dictionary泛型类提供了从一组键到一组值的映射 即键和值的集合类 2 Dictionary通过键来检索值的速度是非常快的 这是因为 Dictionary 类是作为一个哈希表来实现的 3 定义方式 Dictionary
  • 爬虫-Xpath-数据提取

    Xpath数据提取 xpath基本介绍和使用 xpath中常用的获取节点的表达式 xpath中常用的获取特定节点的表达式 XPath XML Path Language 是一门在 HTML XML 文档中查找信息的 语言 可用来在 HTML
  • return _compile(pattern, flags).search(string) TypeError: expected string or bytes-like object

    今天使用正则处理excel的数据时 报了一个错误 记录一下处理的方法 一开始去查了下报错 但是大多别人的答案却不能够解决我的问题 该错误的意思是 类型错误 期望的字符串或字节类对象 那就是我使用正则的数据有问题 我查看了下我的数据类型 果然
  • 容器云技术选择之kubernetes和swarm对比

    swarm和k8s本质都是容器编排服务 它们都能把底层的宿主机抽象化 然后将应用从以构建好的镜像开始 最终以docker的方式部署到宿主机上 应该选择哪种方案作为我们的容器云服务呢 我觉得k8s kubernetes简称 跟swarm的比较