十六、Docker Swarm的介绍和使用

news2024/10/7 10:21:13

一、Swarm简介
1、swarm介绍
Dockere Swarm是Docker公司推出的用来管理docker集群的编排工具,代码开源在https://github.com/docker/swarm, 它是将一群Docker宿主机变成一个单一的虚拟主机,提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。,换言之,各种形式的DockerClient(compose,docker-py等)均可以直接与Swarm通信,甚至Docker本身都可以很容易的与Swarm集成,这大大方便了用户将原本基于单节点的系统移植到Swarm上,同时Swarm内置了对Docker网络插件的支持,用户也很容易的部署跨主机的容器集群服务。

从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了。而目前一般使用的docker版本都是高于这个版本的。

Swarm deamon相当于是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受Docker客户端发来的请求,选择合适的节点来运行容器,这就意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,当Swarm重新恢复运行之后,他会收集重建集群信息。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。

2、swarm原理
如下图所示,swarm 集群由管理节点(manager)和工作节点(work node)构成。
在这里插入图片描述

swarm mananger:负责整个集群的管理工作包括集群配置、服务管理等所有跟集群有关的工作。
work node:即上图中的 available node,主要负责运行manager节点调度来的服务。
service :应用编排
task : 应用实例

3、swarm的调度策略
swarm在调度节点运行容器的时候,会根据指定的策略来计算最适合运行容器的节点,目前支持的策略有:random、spread、binpack
1)Random(随机)
随机选择一个Node来运行容器,一般用作调试用,可能会使容器分配很不均匀。
2)Spread
Spread策略会选择运行容器最少的那台节点来运行新的容器,使容器比较均衡的分布在集群中的各个节点上运行,一旦一个节点挂掉了只会损失少部分的容器。
3)Binpack
Binpack策略最大化的避免容器碎片化,binpack策略会选择运行容器最集中的那台机器来运行新的容器。就是说binpack策略尽可能的把还未使用的节点留给需要更大空间的容器运行,尽可能的把容器运行在一个节点上面。

4、swarm模式的特性
1)容错性强
当集群中某个或某几个节点宕机后,cluster会根据自己的服务注册发现机制,以及之前设定的值–replicas,在集群中其他健康节点上,重新拉起容器副本。整个副本迁移的过程无需人工干预,迁移后原本的集群的load balance依旧好使,使集群恢复到预期的状态。(类似k8s的功能)
2)节点的可扩展性
Swarm Cluster不光只是提供了优秀的高可用性,同时也提供了副本弹性扩展或缩减的功能。当容器副本想改变时,只需通过scale参数即可很方便的达到预期。
注意区别:
复制服务(–replicas n)
将一系列复制任务分发至各节点当中,具体取决于您所需要的设置状态,例如“–replicas 3”,某个节点可能同时存在多个容器副本。(类似k8s中的deployment)
全局服务(–mode=global)
适用于集群内全部可用节点上都需要此服务的任务,例如“–mode global”。如果大家在 Swarm 集群中设有 10 台 Docker 节点,则全部节点之上都部署有该容器。(类似于k8s中的daemonset)

二、swarm集群部署
1、服务器规划

角色IP地址
manager192.168.2.140
node1192.168.2.141
node2192.168.2.142

2、创建 swarm 集群管理节点(manager)
初始化 swarm 集群,在规划的manager节点进行初始化,就是集群的管理节点。

[root@k8s-m1 compose-test]# docker swarm init --advertise-addr 192.168.2.140
Swarm initialized: current node (hkhxn2djs9owibdx1gsq8s0fm) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-1tce5hvvwrnf7enszpvjnc5kidxh9724o482vyu3tdhn55b7fs-7qi2xytdz15npxea9uz09on54 192.168.2.140:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

以上输出,证明已经初始化成功。需要把join的相关信息复制出来,在增加node节点时会用到,忘记了可以通过 docker swarm join-token worker查看 。还可以添加多个管理节点,使用最后一行的docker swarm join-token manager查看相关的添加命令。

#使用该输出结果添加进来的就是worker节点
[root@k8s-m1 compose-test]# docker swarm join-token worker 
To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-1tce5hvvwrnf7enszpvjnc5kidxh9724o482vyu3tdhn55b7fs-7qi2xytdz15npxea9uz09on54 192.168.2.140:2377

#使用该输出结果添加出来的就是manager节点
[root@k8s-m1 compose-test]# docker swarm join-token manager
To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-1tce5hvvwrnf7enszpvjnc5kidxh9724o482vyu3tdhn55b7fs-3hw1dgxnswnmn2b0hom0eazoh 192.168.2.140:2377

#通过docker info 可以查看集群的相关信息
[root@k8s-m1 compose-test]# docker info
.....
  Node Address: 192.168.2.140
  Manager Addresses:
   192.168.2.140:2377
   192.168.2.141:2377
   ......

3、创建 swarm 集群工作节点(worker)
这里直接创建好俩台机器,node1 和 node2 。直接执行上一步的join行相关命令

[root@k8s-m2 ~]#     docker swarm join --token SWMTKN-1-1tce5hvvwrnf7enszpvjnc5kidxh9724o482vyu3tdhn55b7fs-7qi2xytdz15npxea9uz09on54 192.168.2.140:2377
This node joined a swarm as a worker.

##删除节点,在相应的节点上执行
[root@k8s-m2 ~]# docker swarm leave
##将节点添加为 manager节点
[root@k8s-m2 ~]# docker swarm join --token SWMTKN-1-1tce5hvvwrnf7enszpvjnc5kidxh9724o482vyu3tdhn55b7fs-3hw1dgxnswnmn2b0hom0eazoh 192.168.2.140:2377
This node joined a swarm as a manager.
[root@k8s-m2 ~]# 

以上数据输出说明已经添加成功。
4、查看集群信息
进入集群中的某一节点,执行:docker info 可以查看当前集群的信息。

[root@k8s-m1 compose-test]# docker info
#查看集群节点
[root@k8s-m1 compose-test]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
pmam1lvqtnej1u0iidnfit29d *   k8s-m1     Ready     Active         Leader           19.03.9
lccgk1w1h85rmddn961rq6mqp     k8s-m2     Ready     Active                          19.03.9
sim3mrvc776ats8oj7647xcmw     k8s-m3     Ready     Active                          19.03.9

在这里插入图片描述

三、实例部署测试

1、部署服务到集群中
注意:跟集群管理有关的任何操作,都是在manager 节点上操作的。
以下例子,在一个工作节点上创建一个名为 pingtest 和redis的服务,这里是随机指派给一个工作节点:

[root@k8s-m1 ~]# docker service create --replicas 1 --name pingtest alpine ping www.baidu.com
[root@k8s-m1 ~]# docker service create -p 6379:6379 --replicas 1 --name redis redis

2、查看服务部署情况
查看 pingtest 服务运行在哪个节点上,可以看到目前是在 k8s-m1 节点:

[root@k8s-m1 ~]#  docker service ps pingtest 
ID             NAME           IMAGE           NODE      DESIRED STATE   CURRENT STATE            ERROR     PORTS
9x9egswr0d09   pingtest.1   alpine:latest   k8s-m1    Running         Running 51 minutes ago 

3、查看 pingtest 部署的具体信息

### --pretty 是格式化输出
[root@k8s-m1 ~]#  docker service inspect pingtest --pretty 
ID:             v6euaefndeyatcq99sfovks5q
Name:           pingtest
Service Mode:   Replicated
 Replicas:      1
Placement:
UpdateConfig:
 Parallelism:   1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Update order:      stop-first
RollbackConfig:
 Parallelism:   1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Rollback order:    stop-first
ContainerSpec:
 Image:         alpine:latest@sha256:21a3deaa0d32a8057914f36584b5288d2e5ecc984380bc0118285c70fa8c9300
 Args:          ping www.baidu.com 
 Init:          false
Resources:
Endpoint Mode:  vip

4、修改副本数

#修改副本数
[root@k8s-m1 ~]# docker service update --replicas 2 redis
redis
overall progress: 2 out of 2 tasks 
1/2: running   [==================================================>] 
2/2: running   [==================================================>] 
verify: Service converged 
#查看所有服务
[root@k8s-m1 ~]# docker service ls
ID             NAME         MODE         REPLICAS   IMAGE           PORTS
v6euaefndeya   pingtest   replicated   1/1        alpine:latest   
wdffmjjycyyg   redis        replicated   2/2        redis:latest    *:6379->6379/tcp

5、部署global模式的服务

#先删除redis服务,创建一个global模式的服务
[root@k8s-m1 ~]#  docker service rm redis 
redis
[root@k8s-m1 ~]#  docker service create -p 6379:6379 --mode=global --name redis redis
d745h87vfl04nbr5lbzl7qvvk
overall progress: 3 out of 3 tasks 
sim3mrvc776a: running   [==================================================>] 
pmam1lvqtnej: running   [==================================================>] 
lccgk1w1h85r: running   [==================================================>] 
verify: Service converged 

[root@k8s-m1 ~]# docker service ls
ID             NAME         MODE         REPLICAS   IMAGE           PORTS
v6euaefndeya   pingtest   replicated   1/1        alpine:latest   
**加粗样式**d745h87vfl04   redis        global       3/3        redis:latest    *:6379->6379/tcp
[root@k8s-m1 ~]# docker service ps redis 
ID             NAME                              IMAGE          NODE      DESIRED STATE   CURRENT STATE           ERROR     PORTS
wbklclpklgq2   redis.lccgk1w1h85rmddn961rq6mqp   redis:latest   k8s-m2    Running         Running 2 minutes ago             
vp91pjp4wie4   redis.pmam1lvqtnej1u0iidnfit29d   redis:latest   k8s-m1    Running         Running 2 minutes ago             
lgfcacvhm248   redis.sim3mrvc776ats8oj7647xcmw   redis:latest   k8s-m3    Running         Running 2 minutes ago  
#可以看到mode模式为global模式的服务在每个节点都有部署

6、滚动升级服务
以下实例,我们将介绍服务版本如何滚动升级至其他版本。

#创建一服务

[root@k8s-m1 ~]# docker service create --replicas 1 --name alpine  --update-delay 10s  alpine:3.18 ping www.baidui.com
image alpine:3.18 could not be accessed on a registry to record
its digest. Each node will access alpine:3.18 independently,
possibly leading to different nodes running different
versions of the image.

pk13bmvzbcxbumzoihletj5sp
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged 

#查看

[root@k8s-m1 ~]# docker service  ls
ID             NAME       MODE         REPLICAS   IMAGE           PORTS
pk13bmvzbcxb   alpine     replicated   1/1        alpine:3.18     
ah72skm0q6jb   pingtest   replicated   1/1        alpine:latest 

#升级

[root@k8s-m1 ~]# docker service  update --image alpine alpine 
alpine
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged 

#检查

[root@k8s-m1 ~]# docker service  ls
ID             NAME       MODE         REPLICAS   IMAGE           PORTS
pk13bmvzbcxb   alpine     replicated   1/1        alpine:latest   
ah72skm0q6jb   pingtest   replicated   1/1        alpine:latest   
#版本已经发生变化,升级成功

#还可以重新回到原来的版本

[root@k8s-m1 ~]# docker service  update --image alpine:3.18 alpine 
[root@k8s-m1 ~]# docker service ps alpine 
ID             NAME           IMAGE           NODE      DESIRED STATE   CURRENT STATE             ERROR     PORTS
zig8ku5v2xj1   alpine.1       alpine:3.18     k8s-m2    Running         Running 25 seconds ago              
tt06vxjyj0fe    \_ alpine.1   alpine:latest   k8s-m2    Shutdown        Shutdown 57 seconds ago             
bye27dklm8a4    \_ alpine.1   alpine:3.18     k8s-m2    Shutdown        Shutdown 5 minutes ago              
[root@k8s-m1 ~]# 

7、停止某个节点接收新的任务
查看所有的节点:

[root@k8s-m1 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
pmam1lvqtnej1u0iidnfit29d *   k8s-m1     Ready     Active         Leader           19.03.9
lccgk1w1h85rmddn961rq6mqp     k8s-m2     Ready     Active                          19.03.9
sim3mrvc776ats8oj7647xcmw     k8s-m3     Ready     Active                          19.03.9

可以看到目前所有的节点都是 Active, 可以接收新的任务分配。

停止节点 k8s-m2:

[root@k8s-m1 ~]# docker node update k8s-m2 --availability  drain
k8s-m2
[root@k8s-m1 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
pmam1lvqtnej1u0iidnfit29d *   k8s-m1     Ready     Active         Leader           19.03.9
lccgk1w1h85rmddn961rq6mqp     k8s-m2     Ready     Drain                           19.03.9
sim3mrvc776ats8oj7647xcmw     k8s-m3     Ready     Active                          19.03.9

注意:k8s-m2状态变为 Drain。不会影响到集群的服务,只是k8s-m2节点不再接收新的任务,集群的负载能力有所下降。

可以通过以下命令重新激活节点:

[root@k8s-m1 ~]# docker node update k8s-m2 --availability  active

关于docker swarm的更多命令可以通过自动补全或者-h进行查看测试。

更多关于docker容器和运维方面相关知识的,请前往博客主页查看。

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

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

相关文章

MySQL8超详细安装教程

MySQL的下载与安装 一、MySQL8下载 MySQL Community Server 社区版本,开源免费,自由下载,但不提供官方技术支持,适用于大多数普通用户。 MySQL Enterprise Edition 企业版本,需付费,不能在线下载&#x…

VUE——Vue CLI的原理与基本使用

摘要 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,提供: 通过 vue/cli 实现的交互式的项目脚手架。通过 vue/cli vue/cli-service-global 实现的零配置原型开发。一个运行时依赖 (vue/cli-service),该依赖: 可升级&…

互联网企业更需要线上版的产品手册

互联网企业在不断发展变化的市场中,需要更加灵活和快速地适应市场需求,因此,线上版的产品手册对于互联网企业来说是非常重要的。 互联网企业更需要线上版的产品手册的原因 互联网用户更喜欢在线文档 互联网用户更喜欢在线文档,…

中创|没人比我更懂!马斯克发出警告:人类要小心人工智能

马斯克在过去十年对AI的态度一直非常鲜明,很早就对这个问题有深入地思考: 2014 “我们对AI要非常小心,这可能是我们最大的存在威胁。” 2016 “AI的未来发展方向可能并不乐观,起码不会所有结果都是好的。” 2017 “AI会比地…

中原银行 OLAP 架构实时化演进

中原银行 OLAP 架构实时化演进 1. OLAP 实时化建设背景2. OLAP 全链路实时化3. OLAP 实时化探索4. 未来探索方向 中原银行成立于 2014 年,是河南省唯一的省级法人银行,2017 年在香港联交所主板上市,2022 年 5 月经中国银保监会批准正式吸收合…

【问题解决】 网关代理Nginx 301暴露自身端口号

一般项目上常用Nginx做负载均衡和静态资源服务器,本案例中项目上使用Nginx作为静态资源服务器出现了很奇怪的现象,我们一起来看看。 “诡异”的现象 部署架构如下图,Nginx作为静态资源服务器监听8080端口,客户浏览器通过API网关…

跟晓月一起学:mysql中常用的命令汇总

前言 本文主要讲解了MySQL中常用的命令,感谢师父的耐心指导,师父博客:https://zmedu.blog.csdn.net 本文是对MySQL常用的两个命令的总结,一个是select ,一个是show命令,很多时候我们监控MySQL需要监控MyS…

ABB 5SHY35L4520 AC10272001R0101/5SXE10-0181 IGCT模块

ABB 5SHY35L4520 AC10272001R0101/5SXE10-0181 IGCT模块 ABB 5SHY35L4520 AC10272001R0101/5SXE10-0181 IGCT模块 2、DCS的软件系统 DCS的软件体系如图2所示,通常可以为用户提供相当丰富的功能软件模块和功能软件包,控制工程师利用DCS提供的组态软件&…

STM32 USART串口

什么是串口 串口是串行接口 (Serial Interface)的简称,它是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本&#xf…

优秀的 Verilog/FPGA开源项目介绍(三十七)- MATH库

DSP介绍 数字信号处理( Digital Signal Processing)技术广泛地应用于通信与信息系统、信号与信息处理、自动控制、 雷达、军事、航空航天、医疗、家用电器等许多领域。DSP 技术可以快速地对采集的信号进行量化、变换、滤波、估值 、增强、压缩、识别等处理&#xff…

2023 linux驱动中probe函数的返回值,返回0成功。返回负数则失败,这个时候驱动向系统申请的有关资源都会被释放,如中断号,申请的内存等。实际测试。

一、在linux 驱动里面申请一个gpip&#xff0c;&#xff0c;gpip2b4 变换是 76 &#xff0c;dts 如下&#xff1a; m117b45 {compatible "xxx,m117b";reg <0x45>;pinctrl-names "default";pinctrl-0 <&m117b_gpio>;pwdn-gpios <&a…

数据库数据更新:从内存到磁盘,一步步揭开数据的神秘面纱!

大家好&#xff0c;我是小米&#xff01;今天我要和大家分享一下数据库数据更新的流程。作为一名热衷于技术分享的小伙伴&#xff0c;我希望通过本篇文章&#xff0c;帮助大家更好地理解数据库数据更新的过程。废话不多说&#xff0c;让我们开始吧&#xff01; 获取数据 在数据…

PM3328BP-6电源模块PIONEER MAGNETICS

PM3328BP-6电源模块PIONEER MAGNETICS PM3328BP-6电源模块PIONEER MAGNETICS DCS中的先进控制技术 DCS在控制上的最大特点是依靠各种控制、运算模块的灵活组态&#xff0c;可实现多样化的控制策略以满足不同情况下的需要&#xff0c;使得在单元组合仪表实现起来相当繁琐与复杂…

基于GO实现的简易博客,附源码

1、简介 此博客系统主要是基于GO、Gin、Gorm进行开发&#xff0c;以及采用lay-ui框架进行前端界面的开发&#xff0c;项目包含功能众多&#xff0c;基本上涵盖了博客系统的大部分需求。 此项目适合开发者练手学习&#xff0c;同时也适合高校毕业设计的作品。 以下对作品进行…

#经验分享#消防电源强切故障

工业园火灾报警控制器显示&#xff0c;13#厂房电源强切报故障&#xff0c;经过紧急处理&#xff0c;成功解决了故障问题。 据了解&#xff0c;故障原因是71#强切模块被修复大门时损坏模块破碎无法进行修复&#xff0c; 只留有接线底座&#xff0c;测试并检查底座线路正常。 坏…

如何查看jar包的官网地址

https://mvnrepository.com/ 使用artifactId搜索 点击要查看的版本 查看HomePage LicenseApache 2.0CategoriesJSON LibrariesTagsformatjsonOrganizationAlibaba GroupHomePageGitHub - alibaba/fastjson2: &#x1f684; FASTJSON2 is a Java JSON library with excellent…

Citespace和vosviewer文献计量学可视化SCI论文高效写作方法

【基于Citespace和vosviewer文献计量学相关论文 】 文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体&#xff0c;注重量化的综合性知识体系。特别是&#xff0c;信息可视化技术手段和方法的运用&#xff…

tp6+企业付款到零钱

一 开通条件&#xff0c;就是首先要在微信平台设置好。 以下微信文档里有的&#xff0c;我这里大概掠几项比较重要的。 付款资金 企业付款到零钱资金使用商户号余额资金。 根据商户号的账户开通情况&#xff0c;实际出款账户有做区别&#xff1a; ◆ 默认情况下&#xff0c…

四、kafka集群与可靠性

Kafka集群的目标 1、高并发 2、高可用&#xff08;防数据丢失&#xff09; 3、动态伸缩 Kafka集群规模如何预估 吞吐量&#xff1a; 集群可以提高处理请求的能力。单个Broker的性能不足&#xff0c;可以通过扩展broker来解决。 磁盘空间&#xff1a; 比如&#xff0c;如…