草庐IT

容器编排工具很多套,出身名门的Swarm上不了

博学谷狂野架构师 2023-04-16 原文

Swarm集群编排

什么是Swarm

​ Swarm是Docker公司自研发的容器集群管理系统,Swarm在早期是作为一个独立服务存在,在Docker Engine v1.12中集成了Swarm的集群管理,和编排功能。可以通过初始化Swarm或加入现有Swarm来启用Docker引擎的Swarm模式。

​ Docker Engine CLI和API包括了管理Swarm节点命令,比如添加、删除节点,以及在Swarm中部署和编排服务,也增加了服务栈(Stack)、服务(Service)、任务(Task)概念

Swarm能干什么

​ Swarm是Docker 引擎内置(原生)的集群管理和编排工具。Docker Swarm是 Docker 官方三剑客项目之一,swarm是基于docker平台实现的集群技术,他可以通过几条简单的指令快速的创建一个docker集群,接着在集群的共享网络上部署应用,最终实现分布式的服务。

swarm节点

swarm是一系列节点的集合,而节点可以是一台裸机或者一台虚拟机。一个节点能扮演一个或者两个角色,manager或者worker。

manager节点

Docker Swarm集群需要至少一个manager节点,节点之间使用Raft consensus protocol进行协同工作。

​ 通常,第一个启用docker swarm的节点将成为leader,后来加入的都是follower。当前的leader如果挂掉,剩余的节点将重新选举出一个新的leader。

​ 每一个manager都有一个完整的当前集群状态的副本,可以保证manager的高可用。

worker节点

​ worker节点是运行实际应用服务的容器所在的地方。理论上,一个manager节点也能同时成为worker节点,但在生产环境中,我们不建议这样做。

​ worker节点之间,通过control plane进行通信,这种通信使用gossip协议,并且是异步的。

运行机制

名词解释

集群中经常谈到的stacks, services, tasks,他们之间的关系。

下面简单解释一下这三者的含义:

task

​ 在Docker Swarm中,task是一个部署的最小单元,task与容器是一对一的关系。

services

​ swarm service是一个抽象的概念,它只是一个对运行在swarm集群上的应用服务,所期望状态的描述。它就像一个描述了下面物品的清单列表一样:

  • 服务名称
  • 使用哪个镜像来创建容器
  • 要运行多少个副本
  • 服务的容器要连接到哪个网络上
  • 应该映射哪些端口
stack

​ stack是描述一系列相关services的集合。我们通过在一个YAML文件中来定义一个stack。

工作原理
服务、任务和容器

​ 当将服务部署到集群时,管理者将服务定义视为服务所需状态。然后将服务调度为一个或多个副本任务。这些任务在集群的节点上彼此独立运行。

例如下图有三个副本的HTTP服务,每个服务实例就是一个任务。

​ 容器是一个独立的进程,在swarm模型中,每个任务调用一个容器。任务类似于插槽,调度器将容器放入其中。一旦容器运行,调度器认为该任务处于运行状态。如果容器出现健康监测失败或者终止,那么任务也终止。

副本和全局服务

有两种类型的服务部署:副本和全局。

​ 对于副本服务,指定要运行的相同任务的数量,每个副本都是相同的内容。

​ 全局服务是在每个节点上运行一个任务的服务。不需要预先指定任务数量。每当将一个节点添加到集群中,协调者将创建一个任务,并且调度器将任务分配给该新加入的节点。全局服务最好是监控代理、反病毒扫描程序等等想要在集群中每个节点上运行的容器。

下图显示三个副本服务(黄色)和全局服务(灰色):

功能特点(了解)

集成的集群管理

​ 使用Docker Engine CLI创建一组Docker引擎,您可以在其中部署应用程序服务。您不需要其他编排软件来创建或管理群集。

节点分散式设计

​ Docker Engine不是在部署时处理节点角色之间的差异,而是在运行时处理角色变化。您可以使用Docker Engine部署两种类型的节点,管理节点和工作节点。这意味着您可以从单个服务器构建整个群集。

声明性服务模型

​ Docker Engine使用声明性方法来定义应用程序堆栈中各种服务的所需状态。例如,您可以描述由具有消息队列服务和数据库后端的Web前端服务组成的应用程序。

可扩容与缩放容器

​ 对于每个服务,您可以声明要运行的任务数。当您向上或向下缩放时,swarm管理器通过添加或删除任务来自动适应,以保持所需的任务数量来保证集群的可靠状态。

容器容错状态协调

​ 群集管理器节点不断监视群集状态,并协调您表示的期望状态的实际状态之间的任何差异。

​ 例如,如果设置一个服务以运行容器的10个副本,并且托管其中两个副本的工作程序计算机崩溃,则管理器将创建两个新副本以替换崩溃的副本。 swarm管理器将新副本分配给正在运行和可用的worker节点上。

多主机网络

​ 您可以为服务指定覆盖网络。当swarm管理器初始化或更新应用程序时,它会自动为覆盖网络上的容器分配地址。

服务发现

​ Swarm管理器节点为swarm中的每个服务分配唯一的DNS名称,并负载平衡运行的容器。您可以通过嵌入在swarm中的DNS服务器查询在群中运行的每个容器。

负载平衡

​ 您可以将服务的端口公开给外部负载平衡器。在内部,swarm允许您指定如何在节点之间分发服务容器。

缺省安全

​ 群中的每个节点强制执行TLS相互验证和加密,以保护其自身与所有其他节点之间的通信。您可以选择使用自签名根证书或来自自定义根CA的证书。

滚动更新

​ 在已经运行期间,您可以增量地应用服务更新到节点。 swarm管理器允许您控制将服务部署到不同节点集之间的延迟。如果出现任何问题,您可以将任务回滚到服务的先前版本。

准备环境

服务器准备

我的三台测试机

IP地址 角色 主机名
192.168.64.153 manager node1
192.168.64.154 worker node2
192.168.64.155 worker node3
服务器端口开放

在创建集群前,如果开启了防火墙,请确认三台主机的防火墙能让swarm需求的端口开放,需要打开主机之间的端口,以下端口必须可用。在某些系统上,这些端口默认为打开。

  • 2377:TCP端口2377用于集群管理通信
  • 7946:TCP和UDP端口7946用于节点之间的通信
  • 4789:TCP和UDP端口4789用于覆盖网络流量

可以直接禁用系统防火墙来让这些端口通信不受限制,一般测试环境我们都会禁用防火墙

systemctl stop firewalld(立即生效)
systemctl disable firewalld(重启生效)

搭建Swarm集群

当首次安装并使用Docker Engine时,默认情况下swarm模式是禁用的。当启用swarm模式时,可以使用docker service 服务管理命令。

有两种方式在swarm模式下运行引擎:

  • 创建一个新的集群

  • 加入现有集群

    在生成环境中,集群模式提供具有集群管理功能的容错平台,以保证服务的可靠运行。

下面我们就来搭建一个swarm集群

初始化集群
docker swarm init --advertise-addr 192.168.64.153(本机地址)

生成口令
生成管理节点口令
docker swarm join-token manager

生成执行节点口令
docker swarm join-token worker

其他节点加入集群

在第一个从节点执行加入 work的指令

docker swarm join --token SWMTKN-1-53p5t2rt9ud5j0owkl14boj2z8im6r60ddlzotgc4a8y93u1c2-8f6crxgyc9umayhxva1jv9t1w 192.168.64.153:2377

第二个节点执行加入work的命令

docker swarm join --token SWMTKN-1-53p5t2rt9ud5j0owkl14boj2z8im6r60ddlzotgc4a8y93u1c2-8f6crxgyc9umayhxva1jv9t1w 192.168.64.153:2377

查看swarm的节点

执行docker node ls 查看swarm节点信息

docker node ls

AVAILABILITY状态说明
  • Active 意味着调度程序可以将任务分配给节点。

  • Pause 意味着调度程序不会将新任务分配给节点,但现有任务仍在运行。

  • Drain 意味着调度程序不会向节点分配新任务。调度程序关闭所有现有任务并在可用节点上调度它们。

MANAGER STATUS状态说明

显示节点是属于manager或者worker

  • 没有值 :表示不参与群管理的工作节点。

  • Leader :意味着该节点是使得群的所有群管理和编排决策的主要管理器节点。

  • Reachable: 意味着节点是管理者节点正在参与Raft共识。如果领导节点不可用,则该节点有资格被选为新领导者。

  • Unavailable :意味着节点是不能与其他管理器通信的管理器。如果管理器节点不可用,您应该将新的管理器节点加入群集,或者将工作器节点升级为管理器。

修改主机名

默认centos的主机名是localhost,我们看上面,节点的主机名都是localhost,我们修改以下

查看主机名

hostnamectl status可以查看主机名

hostnamectl status

修改主机名

修改主机名使用hostnamectl set-hostname NAME命令可以进行修改,我们使用 node1,node2...方式命名我们的节点

#修改主机名
hostnamectl set-hostname node1
# 查看主机名
hostnamectl status

其他节点依次操作就可以

再次查看节点

再次查看swarm节点信息

docker node ls

添加节点标签

因为我们用到了节点约束,所有启动服务之前需要添加节点标签

# 添加标签
docker node update --label-add role=data node1
#查看节点标签信息
docker node inspect node1|grep role

管理节点

升降级节点

无论您升级或降级节点,您应该始终在群中维护奇数个管理器节点,

​ 升降级节点角色只能在管理节点上运行,应先升级工作节点为被选举者,再降级领导者为工作节点,然后被选举者成为领导者完成替换;

​ 您可以将工作程序节点提升为manager角色。这在管理器节点不可用或者您希望使管理器脱机以进行维护时很有用。 类似地,您可以将管理器节点降级为worker角色。

升级节点

要降级一个节点或一组节点,请从管理器节点运行

docker node promote 节点名称

docker node promote pbui0rdry85e25i3bvhzmqw8h

升级节点后不会马上生效,会进入Reachable 状态,如果leader节点关掉,当前节点会参与主节点竞争

降级节点

要升级一个节点或一组节点,请从管理器节点运行

docker node demote 节点名称

docker node demote r7cv7prw1h2to9h1cpwxs9jhl

swam将节点降级后,再次查看节点命令不生效,需要到管理节点查看

节点退出swarm集群

​ docker swarm leave 命令可在所有节点上运行,值得注意的是,工作节点退出swarm集群后,在管理节点上依然保存着工作节点的节点信息,状态为down,要删除节点信息,可使用docker node rm 命令,当所有的节点都退出并且被删除时,在管理节点上使用docker swarm leave,然后退出整个集群;

工作节点

在工作节点执行以下命令可以退出swarm节点

docker swarm leave

管理节点

在管理节点查看节信息

docker node ls

根据退出节点前后查看节点信息,可以发现退出的节点是down的状态,并没有删除节点

删除节点信息

在管理节点执行删除命令docker node rm 节点ID

docker node rm r7cv7prw1h2to9h1cpwxs9jhl

管理集群服务

管理集群服必须在manager角色的主机上

创建overlay网络

我们需要载多个服务器中运行Docker容器集群,需要使用overlay网络,overlay网络用于连接不同机器上的docker容器,允许不同机器上的容器相互通信,同时支持对消息进行加密

docker network create --driver overlay learn-docker-overlay-network
创建服务

使用docker service create命令来创建服务

创建MySQL服务
docker service create \
-e MYSQL_ROOT_PASSWORD=root \
--mount type=bind,source=/tmp/etc/mysql,destination=/etc/mysql/mysql.conf.d/ \
--mount type=bind,source=/tmp/data/mysql,destination=/var/lib/mysql \
--replicas 1 \
--constraint 'node.labels.role == data' \
--name mysql \
--network learn-docker-overlay-network \
mysql:5.7.33

--replicas 1 表示在集群中创建1个服务

node.labels.role == data表示节点需要创建在标签是data的节点上

可以查看swarm的进程

docker service ls

docker service ps mysql

创建nacos服务

nacos也是需要创建一个,但是节点是可以漂移的,不需要固定在某一台机器

docker service create \
-e MODE=standalone \
--replicas 1 \
--name nacos \
--network learn-docker-overlay-network \
nacos/nacos-server

可以查看swarm的进程

docker service ls

docker service ps nacos

我们发现nacos运行在了 node3节点上

创建learn-docker-storage服务

我们创建learn-docker-storage服务,我们将该服务部署两个节点

docker service create \
--name learn-docker-storage \
--replicas 2 \
--network learn-docker-overlay-network \
manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-storage:1.0-SNAPSHOT

可以查看swarm的进程

docker service ls

docker service ps nacos

我们发现我们的存储服务运行在两个节点上

创建learn-docker-web服务

我们创建learn-docker-web服务,我们将该服务同样部署两个节点

docker service create \
--name learn-docker-web \
--replicas 2 \
--network learn-docker-overlay-network \
manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-web:1.0-SNAPSHOT

可以查看swarm的进程

docker service ls

docker service ps nacos

创建learn-docker-gateway服务

我们创建learn-docker-gateway服务,因为是网关服务,我们只创建一个节点,因为需要对外暴漏端口,需要开放8888端口

docker service create \
-p 8888:8888 \
--name learn-docker-gateway \
--replicas 1 \
--network learn-docker-overlay-network \
manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-gateway:1.0-SNAPSHOT

可以查看swarm的进程

docker service ls

docker service ps nacos

测试访问微服务

因为在node2节点上,node2节点IP是192.168.64.154 我们可以请求URL访问

 curl http://192.168.64.154:8888/employeapi/find/10001| python -m json.tool

查看某个服务日志

通过docker service logs 服务命可以看到当前服务的日志,但是这个服务有两个容器在运行,所有能同时看到两个容器的日志

docker service logs learn-docker-storage

扩缩容服务

可以通过集群操作对集群进行扩缩容

扩容操作

我们将learn-docker-storage由两个容器变为三个容器

docker service scale learn-docker-storage=3

这样我们就把存储服务变成了三台服务

缩容操作

同样,使用该命令对learn-docker-storage进行缩容

docker service scale learn-docker-storage=2

删除服务

我们可以尝试把learn-docker-gateway删除掉,删除操作将会把整个服务的所有容器删除

docker service rm learn-docker-gateway

本文由传智教育博学谷教研团队发布。

如果本文对您有帮助,欢迎关注点赞;如果您有任何建议也可留言评论私信,您的支持是我坚持创作的动力。

转载请注明出处!

有关容器编排工具很多套,出身名门的Swarm上不了的更多相关文章

  1. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  2. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  3. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  4. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  5. ruby - 使用 Ruby 开发工具包将文件上传到 Amazon S3 - 2

    我正在尝试上传文件。一个简单的hello.txt。我正在关注文档,但无法将其上传到我的存储桶。#STARTAWSCLIENTs3=Aws::S3::Resource.newbucket=s3.bucket(BUCKET_NAME)begins3.buckets[BUCKET_NAME].objects[KEY].write(:file=>FILE_NAME)puts"Uploadingfile#{FILE_NAME}tobucket#{BUCKET_NAME}."bucket.objects.eachdo|obj|puts"#{obj.key}=>#{obj.etag}"endresc

  6. ruby - 在 StockChart (highchart) 中以编程方式显示柱形图的工具提示 - 2

    我有一个Highstock图表(带有标记和阴影的线条),并且想以编程方式显示一个highstock工具提示,例如,当我选择某个表上的一行(包含图表数据)我想显示相应的highstock工具提示。这可能吗? 最佳答案 股票图表thissolution不起作用:在thisexample你必须更换这个:chart.tooltip.refresh(chart.series[0].data[i]);为此:chart.tooltip.refresh([chart.series[0].points[i]]);解决方案可用here.

  7. ABB-IRB-1200运动学分析MATLAB RVC工具分析+Simulink-Adams联合仿真 - 2

    一、机器人介绍        此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接

  8. Ruby & Syslog & 自定义工具 - 2

    我是syslog的新手。我们决定使用系统日志来跟踪Rails应用程序中的一些特殊事件。问题是我不想使用默认的/var/log/system.log文件,而是使用自定义文件,例如/var/log/myapp_events.log.我看到我必须像这样在/etc/syslog.conf中定义我自己的设施:myapp_events.*/var/log/myapp_events.log重新启动syslogd后,我发现我可以直接在bash控制台中使用它:syslog-s-kFacilitymyapp_eventsMessage"thisismymessage"该消息按预期出现在/var/log/m

  9. ruby - 使用 Gatling 作为集成测试工具 - 2

    目前我有一小套针对我的网络服务器运行的集成测试,它发出请求并断言一些关于响应应该是什么的假设。这些是用Ruby编写的,生成http请求。我一直在看Gatling作为压力测试工具,但我想知道它是否也可以用于集成测试。这样,所有端点请求都可以在压力测试和集成测试中重复使用。我可能在这里失去了一些东西,因为没有RSpec的BDD,但不必两次创建相同的测试。有没有人有这样使用gatling的经验? 最佳答案 您可以使用AssertionAPI并设置验收标准。但是,Gatling不是浏览器,不会运行/测试您的Javascript,因此这种方法

  10. ruby - 为什么 openssl 在 windows 上产生错误但在 centos 上不产生错误:PKCS12_parse: mac verify failure (OpenSSL::PKCS12::PKCS12Error) - 2

    require'openssl'ifARGV.length==2pkcs12=OpenSSL::PKCS12.new(File.read(ARGV[0]),ARGV[1])ppkcs12.certificateelseputs"Usage:load_cert.rb"end运行它会在Windows上产生错误,但在Linux上不会。错误:OpenSSL::PKCS12::PKCS12Error:PKCS12_parse:macverifyfailurefrom(irb):21:ininitializefrom(irb):21:innewfrom(irb):21fromC:/Ruby192/

随机推荐