小规模容器编排使用Docker Swarm不香么,用个锤子的kubernetes

news2025/1/18 6:19:10

文章目录

      • 一、Docker Swarm是什么?
      • 二、Swarmkit和Swarm Mode是什么?
      • 三、Docker Swarm的核心设计
      • 四、Docker Swarm安装部署
        • 4.1、初始化Swarm节点1
        • 4.2、新节点加入Swarm集群
        • 4.3、使用swarm部署服务
        • 4.4、swarm集群管理

一、Docker Swarm是什么?

Docker Swarm是一款由Docker官方推出的容器编排工具,其主要作用是把若干台Docker 主机抽象为一个整体,并且通过一个入口统一管理这些Docker 主机上的各种Docker 资源,用于管理和编排多个Docker容器的集群。

它可以让用户方便地管理多个Docker节点,以及部署和扩展应用程序。Docker Swarm通过提供集群管理、负载均衡、服务发现和滚动更新等功能,简化了分布式应用程序的开发和部署过程。

有人会有疑问,kubernetes现在已经是容器编排领域的王者了,还有Docker Swarm什么事情?其实不然,根据我的个人经验以及和同行的交流来看,kubernetes功能非常强大,但是也非常复杂, 部署和运维过程不是都需要有不少的工作,需要有专门的团队专家维护,属于比较“重”的。而相对来说Docker Swarm则比较轻量级,维护相对简单,对于一些中小企业来说,不需要投入过多的成本,也是一个非常好的选择。

还是老话:适合的才是最好的。

二、Swarmkit和Swarm Mode是什么?

Docker容器编排的功能经历了好几代,分别是Docker Swarm、Swarmkit和Swarm Mode。苍天啊,我也有点服了,整这么几个相近的名字,确实让初学者头疼凌乱。

Docker Swarm是Docker容器编排最初提供的功能,它独立于Docker Engine之外,使用Docker CLI进行管理,需要部署额外的KV存储,从Docker 1.6开始就有了,为了方便,我们姑且称之为Docker Swarm V1吧。

Docker Swarm V1由Discovery Service模块、Scheduler模块和Leadership模块组成。如下图所示,Discovery Service主要用于发现Swarm集群重的节点;Scheduler则主要负责给用户新创建的容器分配最优的节点,支持多种策略;Leadership则是提供了Swarm HA的功能。

目前来说Docker Swarm项目已经沉寂,不太建议新项目使用。

Docker 发展到1.12版本的时候,Docker官方又发布了一个项目称为Docker Swarmkit,它也是一个独立的容器编排项目,目前在github上开源,有2K Star,还在更新。Swarmkit有自己独立的CLI管理工具,容器编排和调度能力更强,支持节点发现,实现了Raft共识选主和安全访问,是一个比较完善的容器编排项目。为了方便,我们且称之为Docker Swarm V2。

运行SwarmKit的多台机器可以组合在一起形成Swarm集群,相互协调任务。一旦一台机器加入,它就自动成为一个Swarm 节点,而这个节点可以是工作节点或管理节点。它使用独立的CLI swarmd和swarmctl,swarmd部署在cluster中的每一个node上,彼此间互相通信,组成cluster;而swarmctl则用来控制整个集群。

例如使用swarmd初始化节点:

$ swarmd -d /tmp/node-1 --listen-control-api /tmp/node-1/swarm.sock --hostname node-1

例如使用swarmctl列出正在运行的服务:

$ swarmctl service ls
ID                         Name   Image        Replicas
--                         ----   -----        --------
08ecg7vc7cbf9k57qs722n2le  redis  redis:3.0.5  1/1

最后终于轮到了主角Swarm Mode,其实就是现在Docker官方建议使用的Docker容器编排模式,它的底层还是基于Swarmkit构建的,但是它将swarm的能力集成到了Docker Engine中,你只需要部署Docker Engine就自动获得了容器编排的能力,不需要额外的存储,使用Docker CLI,不需要额外的CLI工具,支持服务发现、滚动升级、负载均衡、路由和容器的扩缩容、安全通信等功能,算是非常完善且方便的。

swarm集群中所有的节点都是对等的,分为两个角色:manager和worker,manager服务集群的管理,worker负责容器的运行,两个角色可以相互转换,极为方便。目前推荐docker的容器编排使用swarm mode。

三、Docker Swarm的核心设计

我们再来仔细说说docker swarm(从这里开始指的都是swarm mode)的核心设计思想。

首先swarm的功能内嵌在了Docker Engine上,这样子一来除了Docker Engine无需再额外安装其他软件,相对于独立组件更加轻便。

swarm集群支持多个Manager,Manager之间通过raft协议实现高可用。它针对服务进行了抽象设计,抽象出了Service、Task和Container概念,如下图所示

Service代表一个作业,而Task则是swarm内调度的最小单位,每个task一般只调用一个Container,例如你指定了一个服务要运行三个实例,则会启动三个Task,每个Task负责运行一个Container实例。

在swarm中有两种不同的Service模式:

  • Replicated services(副本模式)
    副本模式下,在定义service的时候指定任务的数量,一般也就是container实例的数量,集群会按照指定的数量运行任务。
  • global services(全局模式)
    在每个节点上运行一个相同的任务,但是不预先指定任务数量,而是每增加一个节点到 swarm 中,协调器就新建一个任务,然后调度器把任务分配给新节点。

而对于Task,整个生命周期具有不同的状态,可以监控到任务执行的情况,Task生命周期状态有:

NEW       任务在初始化状态
PENDING   正在分配任务所用的资源
ASSIGNED  Docker分配任务给节点
ACCEPTED  任务被工作节点接受。如果工作节点拒接任务,状态将会转变成REJECTED
PREPARING Docker正在准备任务
STARTING  Docker正在开启任务
RUNNING   任务正在执行
COMPLETE  任务结束,不带错误代码
FAILED    任务结束,带着错误代码
SHUTDOWN  Docker请求任务关闭
REJECTED  工作节点拒绝任务
ORPHANED  节点宕机时间太长
REMOVE    该任务不是终端,但相关服务已被删除或缩小

一般的swarm使用流程为:用户在Docker Swarm上定义一个服务,包括服务名称、容器镜像、容器数量等信息,Docker Swarm manager会将服务的定义发送给集群中的所有Worker节点,每个Worker节点会启动指定数量的容器,并将容器注册到Swarm中,而Swarm会通过内置的负载均衡算法将请求分发到各个容器中,当用户需要更新容器时,只需更新服务定义,Swarm会自动将容器更新到最新版本。

四、Docker Swarm安装部署

由于Docker Swarm已经集成到了Docker Engine中,所以只要安装了Docker就可以通过以下步骤进行swarm集群的部署。

为了进行实验,我本地搭建了两个虚拟机:node1(192.168.56.11)和node2(192.168.56.12)。

4.1、初始化Swarm节点1

首先,选择一个节点作为manager节点,对swarm进群进行初始化,我这里选择node1,使用以下命令:

[docker@node1 ~]$ docker swarm init

结果如下:

可以看到这个节点已经成为了一个manager节点,且提示了如何加入新的manager节点和worker节点。

4.2、新节点加入Swarm集群

使用docker swarm join --token <token> <manager-ip>:<manager-port>命令可以作为worker节点加入集群。

[docker@node2 ~]$ docker swarm join --token SWMTKN-1-5h4jxvef4q4qhxb45saibjj3hgm8rsjm8otqc2x78m4ovinel7-2zm4q85rlavh59i1bdwbv5hwt 192.168.56.11:2377

正常情况下如下会提示作为worker节点加入成功。

4.3、使用swarm部署服务

使用docker service create --name <service-name> <image>命令可以创建service,在docker swarm中使用docker service进行服务部署和管理。

我们这里使用busybox镜像进行容器部署,首先拉去镜像到本地,并使用docker images查看确认镜像。

[docker@node1 ~]$ docker pull busybox:latest
[docker@node1 ~]$ docker images

创建service

[docker@node1 ~]$ docker service create --name helloworld busybox:latest sh -c "while true; do echo Hello; sleep 2; done"

查询service

[docker@node1 ~]$ docker service ls
ID             NAME         MODE         REPLICAS   IMAGE            PORTS
j1mtev8f7k05   helloworld   replicated   1/1        busybox:latest

可以看到服务ID以及副本的数量。

查看service详细信息

使用命令docker service inspect <service-name>可以查看service的详细信息,如下命令,可以看到输出内容信息非常丰富,包括service的定义等。

[docker@node1 ~]$ docker service inspect helloworld

扩展service

使用命令docker service scale <service-name>=<replicas>

[docker@node1 ~]$ docker service scale helloworld=2

再次使用docker service ls可以看到副本数量已经提升到了2。

更新service

可以使用docker service update --image <new-image> <service-name>更新service的定义,包括容器镜像和数量等信息,service将会被自动重新部署。

[docker@node1 ~]$ docker service update --image nginx:latest helloworld

重新查看service,可以发现image已经更换为了nginx:latest。

删除service

使用命令docker service rm <ID>或者docker service rm <service-name>

[docker@node1 ~]$ docker service rm helloworld

4.4、swarm集群管理

docker swarm还提供了一些命令用于swarm集群节点本身的管理,例如

  1. 查看 Swarm 集群节点:

    [docker@node1 ~]$ docker node ls
    
  2. 从 Swarm 集群中删除一个节点:

    [docker@node1 ~]$ docker node rm <node-id>
    
  3. 增加一个新的manager节点

    在当前manager节点上执行命令docker swarm join-token manager,此时会输出以下内容:

    docker swarm join --token SWMTKN-1-5h4jxvef4q4qhxb45saibjj3hgm8rsjm8otqc2x78m4ovinel7-3mxnl9pluz287gdo6ggefbr0r 192.168.56.11:2377
    

    在新节点上执行此命令,即可轻松添加一个新的manager节点。

通过以上,总结一下,docker swarm集群无论是部署和维护都是相对简单的,而容器的编排功能却一点也不弱,满足中小公司和团队的容器编排部署需要一点问题也没有,相对于kubernetes的部署和维护流程,能够节省大量的投入,所以kubernetes适合大规模的容器编排,小规模的老老实实选择docker swarm轻轻松松不香么~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/415240.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“QT 快速上手指南“ 之 计算器(二)组件,坐标,窗口

文章目录前言一、QT 基本组件用法介绍&#xff1a;1. QLabel &#xff1a;2. QPushButton :3. QLineEdit:二、坐标系统三、窗口部件的大小设置1. setSize( ) 函数&#xff1a;2. resize( )函数&#xff1a;3. setFixedSize( )函数:4. setFixedWidth( ) 和 setFixedHeight( )函数…

标准化归一化方法

一、经典机器学习的归一化算法 分别是0-1标准化&#xff08;Max-Min Normalization&#xff09;和Z-Score标准化。 1.1 0-1标准化方法 每一列中的元素减去当前列的最小值&#xff0c;再除以该列的极差。 不过在深度学习领域&#xff0c;我们更希望输入模型的数据是Zero-Ce…

使用Serv-U搭建FTP服务器并公网访问【内网穿透】

文章目录1. 前言2. 本地FTP搭建2.1 Serv-U下载和安装2.2 Serv-U共享网页测试2.3 Cpolar下载和安装3. 本地FTP发布3.1 Cpolar云端设置3.2 Cpolar本地设置4. 公网访问测试5. 结语1. 前言 科技日益发展的今天&#xff0c;移动电子设备似乎成了我们生活的主角&#xff0c;智能手机…

这些IT行业趋势,将改变2023

上一周&#xff0c;你被"AI"刷屏了吗&#xff1f; 打开任何一家科技媒体&#xff0c;人工智能都是不变的热门话题。周初大家还在用ChatGPT写论文、查资料、写代码&#xff0c;到周末的时候大家已经开始用GPT-4图像识别来做饭、Microsoft 365 Copilot 来写PPT了。 GP…

【周末闲谈】AI的旅途

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️周末闲谈】 系列目录 ✨第一周 二进制VS三进制 ✨第二周 文心一言&#xff0c;模仿还是超越&#xff1f; ✨第二周 畅想AR 文章目录系列目录前言AIAI的开端第一个AI程序AI的寒冬关于AI的思考末尾前言…

憨批的语义分割重制版11——Keras 搭建自己的HRNetV2语义分割平台

憨批的语义分割重制版11——Keras 搭建自己的HRNetV2语义分割平台学习前言什么是HRNetV2模型代码下载HRNetV2实现思路一、预测部分1、主干网络介绍a、Section-1b、Section-2c、Section-3d、Section-42、特征整合部分3、利用特征获得预测结果二、训练部分1、训练文件详解2、LOSS…

【Python童年游戏】满满的回忆杀—那些年玩过的童年游戏你还记得吗?那个才是你的菜?看到第一个我就泪奔了(致我们逝去的青春)

导语 滴一一学生卡&#x1f64c; 结伴上车的学生仔子们 用笑声打破车厢的沉默 大人眼里的晚高峰 是给放学后快乐&#x1f600;时光的加时 下车的学生匆匆起身带起 一阵熟悉的栀子香于&#x1f493; 是关于校园的记忆 开始零零散散地闪现 放学后集合的秘密基地/跟着城…

Half-UNet:用于医学图像分割的简化U-Net架构

Half-UNet简化了编码器和解码器&#xff0c;还使用了Ghost模块(GhostNet)。并重新设计的体系结构&#xff0c;把通道数进行统一。 论文动机 编码器的不同类型的架构图&#xff0c;编码器(A-C)的结构分别来源于U-Net的编码器、解码器和全的Unet结构。 下面是上图的一些结果指标…

4.2学习周报

文章目录前言文献阅读摘要介绍时间序列预测目前存在的问题时间序列预测方法分类未来方向时间序列预测总结前言 本周阅读文献《Forecast Methods for Time Series Data: A Survey》&#xff0c;本文主要对目前时间序列数据建模方法进行分类&#xff0c;主要分为了三类&#xff…

Linux->文件系统磁盘文件管理

目录 1 磁盘结构 2 逻辑抽象管理磁盘 2.1 逻辑抽象 2.2 管理磁盘 2.3 补充知识 3 软硬连接 1 磁盘结构 本篇的学习需要建立在大家在脑海中有一副磁盘的结构才能进行下去&#xff0c;所以我会以图解的方式为大家简单讲解一下&#xff0c;注&#xff1a;博主对这一部分并不是…

深度学习实战——卷积神经网络/CNN实践(LeNet、Resnet)

忆如完整项目/代码详见github&#xff1a;https://github.com/yiru1225&#xff08;转载标明出处 勿白嫖 star for projects thanks&#xff09; 系列文章目录 本系列博客重点在深度学习相关实践&#xff08;有问题欢迎在评论区讨论指出&#xff0c;或直接私信联系我&#xf…

详细介绍别人电脑访问到自己电脑运行的项目

文章目录 让别人远程访问你的代码网站项目或临时演示你的项目给客户的方式详解 引言一、创建一个你想要别人访问的项目二、明确你想要将这个网站或者项目存放的地方 终端分类服务器设备WEB服务器三、部署我们的网页 本地部署流程进入浏览器输入网址访问获取本机的IP地址&#…

多模态特征融合:图像、语音、文本如何转为特征向量并进行分类

多模态特征融合前言输入层&#xff0c;数据集转为特征向量图像语音什么是时域信号&#xff0c;什么是频域信号语音信号转换 - 1.傅立叶变换语音信号转换 - 2.梅尔频率倒谱系数文本词袋模型词嵌入模型输出层&#xff0c;多模态模型合并前言 学习多模态的话题可以从深度学习的分…

API接口安全—webservice、Swagger、WEBpack

API接口安全—webservice、Swagger、WEBpack1. API接口介绍1.1. 常用的API接口类1.1.1. API接口分类1.1.1.1. 类库型API1.1.1.2. 操作系统型API1.1.1.3. 远程应用型API1.1.1.4. WEB应用型API1.1.1.5. 总结1.1.2. API接口类型1.1.2.1. HTTP类接口1.1.2.2. RPC类接口1.1.2.3. web…

NLP与ChatGPT的碰撞:大模型和小模型联合发力

ChatGPT真的太火了&#xff01;作为NLP的终结者&#xff0c;ChatGPT又会与NLP发生怎么样的碰撞&#xff1f;大模型可以替代小模型吗&#xff1f;NLP又将何去何从&#xff1f;今天给大家推荐一本好书&#xff1a;《基于NLP的内容理解》&#xff01; 文章目录一、背景二、书籍介绍…

【原创】AIGC之ChatGPT工作原理

AIGC是什么 AIGC - AI Generated Content &#xff08;AI生成内容&#xff09;&#xff0c;对应我们的过去的主要是 UGC&#xff08;User Generated Content&#xff09;和 PGC&#xff08;Professional user Generated Content&#xff09;。 AIGC就是说所有输出内容是通过AI机…

2023年3月的10篇论文推荐

三月有很多的重大产品发布&#xff0c;包括刚刚发布的GPT4&#xff0c;还有Meta刚发布就被泄露的LLaMA&#xff0c;midjourney V5&#xff0c;还有ChatGPT的API&#xff08;非常便宜&#xff09;等等。 但是本文整理的是本月应该阅读的10篇论文&#xff0c;将包括多模态语言模…

Linux中shell内外命令讲解(下)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…

MySQL数据库:联合查询、子句查询、合并查询

一、联合查询 1.概念 简单理解就是将多张表合并到一起&#xff0c;然后进行数据查询&#xff0c;所有也叫多表联查。 如何将两张表合并到一起&#xff1f; 取两张表的笛卡儿积&#xff1a;将表1中的数据逐条与表2中的数据进行合并&#xff0c;最终形成的新的临时表&#xff0…

py征途4之无效思路

事件回顾&#xff1a; 近期班里组织了一个跑团&#xff0c;使用的是keep跑团助手&#xff08;小程序&#xff09;。每个人都有一个昵称&#xff0c;要对“每日跑量”进行统计&#xff0c;以明确到底有哪些人跑了步&#xff0c;哪些人没跑步。 为了解决这个问题&#xff0c;从3月…