Docker swarm

基本概念

Docker是使用google公司推出的go语言进行开发实现,基于linux内核的cgroups,namespace,以及AUFS类的UnionFS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主与其他的隔离的进程,因此也也被称为容器。

Docker在容器的基础上进一步封装,从文件系统、互联网络到进程隔离等等,极大简化了容器的创建和维护。使得Docker技术比虚拟机技术更为轻便、快捷。
在这里插入图片描述

Docker Swarm是Docker官方三剑客项目之一,提供Docker容器集群服务,是Docker官方对容器云生态进行支持的核心方案。它可以将多个Docker主机封装为单个大型的虚拟机Docker主机,快速打造一套容器云平台。Docker 1.12.0+Swarm mode已迁入

Docker引擎,成为了Docker子命令docker swarm。与kubelet是竞争关系。
Swarm 是使用Swarmkit构建的Docker引擎(原生)的集群管理和编排工具。其涉及的相关术语

  • 节点

运行的Docker的主机可以主动初始化一个swarm集群或者加入一个已存在的swarm集群。而运行Docker的主机就是一个swarm集群的一个节点(Node)。节点按功能可分为:管理节点、工作节点

  • 管理节点:用于swarm集群的管理,docker swarm命令基本职能在管理节点执行
    • 工作节点:是任务执行节点,管理节点将服务(service)下发至工作节点执行。

注:管理节点也可充当工作节点的角色执行任务
在这里插入图片描述

  • 服务和任务

任务(Task)是swarm中的最小的调度单位,目前来说就是一个单一的容器
服务(Service)是指一组任务的集合,服务定义任务的属性

  • 服务有两种模式

  • replicated service 按照一定规则在各个工作节点上运行指定个数的任务 * global service 每个工作节点上运行一个任务
    两种模式通过docker service create 的–mode参数指定

在这里插入图片描述

Docker Swarm集群

初始化集群

使用 docker swarm init初始化一个swarm集群

docker swarm init --advertise-addr 192.168.2.100

如果docker主机有多个网卡,拥有多个ip,必须使用–advertise-addr指定ip。执行 docker swarm init命令的节点自动称为管理节点
增加工作节点
在另外的工作节点上执行上一步创建管理节点时候输出的加入swarm集群的命令和token
在这里插入图片描述
如果忘记了加入初始化集群输出的加入命令,可通过以下命令获取加入集群的命令:docker swarm join-token manager
通过docker node promote 主机名 可将工作节点manager status变为reachable,在现有leader挂掉后,可有机会称为leader
在这里插入图片描述

查看集群

只能在管理节点执行查看集群命令:docker node ls
在这里插入图片描述

集群上部署服务

使用docker service命令来管理swarm集群的服务,该命令只能在管理节点上运行。
新建服务
在创建好的swarm集群运行服务
docker service create --replicate
-replicas 3 指定启动3个副本
-p 80:80 自定端口号,将容器的80端口号映射到宿主机的80端口号
-name nginx 取名为nginx
nginx:latest 镜像为基于官方的nginx最新镜像
查看服务

docker service ls:查看当前swarm集群运行的服务
docker service ps ngins:查看某个服务的详情
docker service logs nginx:查看某个服务的日志

删除服务

docker service rm nginx :从swarm集群中移除某个服务

Docker Swarm vs. Kubernets

Docker Swarm

Docker swarm是docker自己的docker容器本地集群解决方案,具有与docker生态系统紧密集成并使用自己API的优势。它监视跨服务器群集的容器数量,是在没有其他硬件的情况下创建群集docker应用程序的最便捷方式。它为Dockerized应用程序提供了一个小规模但有用的编排系统。

使用Docker Swarm的优点

  • 以更快的速度运行:当您使用虚拟环境时,您可能已经意识到它需要很长时间,并且包括启动和启动您要运行的应用程序的繁琐程序。使用Docker Swarm,这不再是一个问题。Docker Swarm消除了启动完整虚拟机的需要,使应用程序能够快速在虚拟和软件定义的环境中运行,并有助于DevOps实施。
  • 文档提供了所有信息: Docker团队在文档方面脱颖而出!Docker正在迅速发展,并为整个平台赢得了热烈的掌声。当版本在很短的时间间隔内发布时,某些平台不会维护文档。但是Docker Swarm从未与它妥协。如果该信息仅适用于Docker Swarm的某些版本,则文档会确保更新所有信息。
  • 提供简单快速的配置: Docker Swarm的一个主要优点是它简化了问题。Docker Swarm使用户可以自己配置,将其放入代码中并轻松部署。由于Docker Swarm可以在各种环境中使用,因此需求不受应用程序环境的约束。
  • 确保应用程序是孤立的:Docker Swarm注意每个容器与其他容器隔离并拥有自己的资源。可以部署各种容器以在不同堆栈中运行单独的应用程序。除此之外,当每个应用程序在自己的容器上运行时,Docker Swarm会清除应用程序删除。如果不再需要该应用程序,则可以删除其容器。它不会在您的主机操作系统上留下任何临时或配置文件。
  • 版本控制和组件重用:使用Docker Swarm,您可以跟踪容器的连续版本,检查差异或回滚到先前版本。容器重复使用前面层中的组件,这使得它们显着轻量级。

使用Docker Swarm的缺点

  • Docker依赖于平台:Docker Swarm是一个Linux激动人心的平台。虽然Docker支持Windows和Mac OS X,但它利用虚拟机在非Linux平台上运行。设计为在Windows上的Docker容器中运行的应用程序无法在Linux上运行,反之亦然。
  • 不提供存储选项:Docker Swarm不提供将容器连接到存储的无障碍方式,这是主要缺点之一。其数据量需要在主机和手动配置上进行大量即兴创作。如果您期望Docker Swarm解决存储问题,可能会以高效且用户友好的方式完成。
  • 监控不良:Docker Swarm提供有关容器的基本信息,如果您正在寻找基本的监控解决方案,那么Stats命令就足够了。如果您正在寻找高级监控,那么Docker Swarm永远不是一个选择。虽然有像CAdvisor这样的第三方工具可以提供更多监控,但使用Docker本身实时收集有关容器的更多数据是不可行的。

当在多台机器上的多个容器中使用不同组件开发应用程序时,需要该工具来管理和协调容器。这只有在Kubernetes的帮助下才可行

Kubernetes

Kubernetes是一个用于管理集群环境中的容器化应用程序的开源系统。以正确的方式使用Kubernetes可帮助DevOps即服务团队自动扩展应用程序并以零停机时间进行更新。

使用Kubernetes的优点

  • 它的速度很快:在不停机的情况下持续部署新功能时,Kubernetes是一个完美的选择。Kubernetes的目标是以恒定的正常运行时间更新应用程序。它的速度通过您每小时可以运送的许多功能来衡量,同时保持可用的服务。
  • 遵循不可变基础架构的原则:以传统方式,如果多个更新出现任何问题,您就没有任何记录显示您部署了多少更新以及发生了哪个错误。在不可变基础结构中,如果您希望更新任何应用程序,则需要使用新标记构建容器映像并进行部署,从而使用旧映像版本终止旧容器。通过这种方式,您将获得一份记录,并了解您所做的事情以及是否有任何错误; 您可以轻松回滚到上一个图像。
  • 提供声明性配置:用户可以知道系统应该处于什么状态以避免错误。作为传统工具的源代码控制,单元测试等不能与命令式配置一起使用,但可以与声明性配置一起使用。
  • 大规模部署和更新软件:由于Kubernetes具有不可变的声明性,因此扩展很容易。Kubernetes提供了一些用于扩展目的的有用功能:
  • 水平基础架构缩放:在单个服务器级别执行操作以应用水平缩放。可以毫不费力地添加或分离atest服务器。
  • 自动扩展:根据CPU资源或其他应用程序指标的使用情况,您可以更改正在运行的容器数
  • 手动缩放:您可以通过命令或界面手动缩放正在运行的容器的数量
  • 复制控制器:复制控制器确保群集在运行条件下具有指定数量的等效窗格。如果存在太多pod,则复制控制器可以删除额外的pod,反之亦然。
  • 处理应用程序的可用性:Kubernetes检查节点和容器的运行状况,并在由于错误导致的盒中崩溃时提供自我修复和自动替换。此外,它在多个pod之间分配负载,以便在意外流量期间快速平衡资源。
  • 存储卷:在Kubernetes中,数据在容器之间共享,但如果pod被杀死,则会自动删除卷。此外,数据是远程存储的,因此如果将pod移动到另一个节点,数据将保留,直到用户删除为止。

使用Kubernetes的缺点

  • 初始过程需要时间:创建新进程时,您必须等待应用程序开始,然后才能供用户使用。如果要迁移到Kubernetes,则需要对代码库进行修改,以使启动过程更有效,这样用户就不会有糟糕的体验。
  • 迁移到无状态需要付出很多努力:如果您的应用程序是群集或无状态的,则不会配置额外的pod,并且必须在应用程序中重新配置。
  • 安装过程繁琐:如果您不使用Azure,Google或Amazon等任何云提供商,则很难在群集上设置Kubernetes。

Kubernetes vs. Docker Swarm:快速摘要

开发公司 Docker公司 Google 发布年份 2013 2014 使用公司 Bugsnag,Bluestem Brands,Hammerhead,Code Picnic,Dial once等 Asana,Buffer,CircleCI,Evernote,Harvest,Intel,Starbucks,Shopify等 调节器 Manager Master 存储 Volumes Persistent and Ephermal 公共云服务提供商 Google,Azure,AWS,OTC Azure 兼容性 不那么广泛和可定制 更广泛和高度可定制 安装 易于设置 需要时间安装 容差率 低容错性 高容错性 大集群 速度被认为是强群集状态 即使在大型集群中也提供容器部署和扩展,而不考虑速度 负载均衡 当容器中的pod定义为服务时提供负载平衡 通过群集中的任何节点提供自动内部负载平衡 部署单位 Task Pod 端口 Published Port Endpoint 网络 覆盖 平面网络空间 社区 活跃的用户群,定期更新各种应用程序的图像 获得开源社区和谷歌,亚马逊,微软和IBM等大公司的大力支持 弱点 没有供应商的认证计划。大多数组织需要商业认证版本 倾向于开发人员而不是中央IT 优势 主要由可以决定产品方向的单一供应商控制 明确的市场领导者 最大的采用和兴趣 slave worker nodes 容器设置 功能由Docker API提供并受其限制 客户端API和YAML在Kubernetes中是唯一的 可扩展性 即使在大型容器中也可以快速部署容器 以牺牲速度为代价为群集状态提供强有力的保证

Kubernetes或Docker如何选择

如果使用Kubernetes:

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

如果使用Docker,

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

无论您选择Kubernetes还是Docker,两者都被认为是最好的并且具有相当大的差异,选择合适的任务是一项非常全面的任务,完全取决于您的项目要求和目标受众,选用适合您现有的软件堆栈。

参考文章:
Kubernetes vs. Docker Swarm:完整的比较指南

代码交流 2021