Docker Swarm集群企业案例实战

news2024/11/24 16:34:18

1. Docker Swarm集群企业案例实战

  • Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合

1.1. Swarm概念剖析

  • Swarm是Docker公司自主研发的容器集群管理系统, Swarm在早期是作为一个独立服务存在, 在Docker Engine v1.12中集成了Swarm的集群管理和编排功能。可以通过初始化Swarm或加入现有Swarm来启用Docker引擎的Swarm模式。
  • Docker Engine CLI和API包括了管理Swarm节点命令,比如添加、删除节点,以及在Swarm中部署和编排服务。也增加了服务栈(Stack)、服务(Service)、任务(Task)概念
  • Swarm集群管理和任务编排功能已经集成到了Docker引擎中,通过使用swarmkit。swarmkit是一个独立的,专门用于Docker容器编排的项目,可以直接在Docker上使用。
  • Swarm集群是由多个运行swarm模式的Docker主机组成,关键的是,Docker默认集成了swarm mode。swarm集群中有manager(管理成员关系和选举)、worker(运行swarm service)
  • 一个Docker主机可以是Manager,也可以是Worker角色,当然,也可以既是Manager,同时也是Worker
  • 当你创建一个service时,你定义了它的理想状态(副本数、网络、存储资源、对外暴露的端口等)。Docker会维持它的状态,例如,如果一个worker node不可用了,Docker会调度不可用node的task到其他nodes上。
  • 运行在容器中的一个task,是swarm service的一部分,且通过swarm manager进行管理和调度,和独立的容器是截然不同的。
  • Swarm service相比单容器的一个最大优势就是,你能够修改一个服务的配置:包括网络、数据卷,不需要手工重启服务。Docker将会更新配置,把过期配置的task停掉,重新创建一个新配置的容器。
  • 当然,也许你会觉得docker Compose也能做swarm类似的事情,某些场景下是可以。但是Swarm相比docker compose,功能更加丰富,比如说自动扩容、缩容,分配至Task到不同的Nodes等。
  • 一个node是Swarm集群中的一个Docker引擎实例。你也可以认为这就是一个docker节点。你可以运行一个或多个节点在单台物理机或云服务器上,但是生产环境上,典型的部署方式是:Docker节点交叉分布式部署在多台物理机或云主机上。
  • 通过Swarm部署一个应用,你向manager节点提交一个service,然后manager节点分发工作(task)给worker node。Manager节点同时也会容器编排和集群管理功能,它会选举出一个leader来指挥编排任务。worker nodes接受和执行从manager分发过来的task
  • 一般地,Manager节点同时也是worker节点,但是,你也可以将manager节点配置成只进行管理的功能。Agent则运行在每个worker节点上,时刻等待着接受任务。worker node会上报manager node,分配给他的任务当前状态,这样manager node才能维持每个worker的工作状态。
  • Service就是在manager或woker节点上定义的tasks。service是swarm系统最核心的架构,同时也是和swarm最主要的交互者。当你创建一个service,你指定容器镜像以及在容器内部运行的命令。
  • 在副本集模式下,swarm manager将会基于你需要扩容的需求,把task分发到各个节点。对于全局service,swarm会在每个可用节点上运行一个task。
  • Task携带Docker引擎和一组命令让其运行在容器中。它是swarm的原子调度单元。manager节点在扩容的时候回交叉分配task到各个节点上,一旦一个task分配到一个node,它就不能移动到其他node。

1.2 Docker Swarm优点

  • Docker Engine集成集群管理
  1. 使用Docker Engine CLI 创建一个Docker Engine的Swarm模式,在集群中部署应用程序服务。
  • 去中心化设计
  1. Swarm角色分为Manager和Worker节点, Manager节点故障不影响应用使用。
  • 扩容缩容
  1. 可以声明每个服务运行的容器数量,通过添加或删除容器数自动调整期望的状态。
  • 期望状态协调
  1. Swarm Manager节点不断监视集群状态,并调整当前状态与期望状态之间的差异。
  • 多主机网络
  1. 可以为服务指定overlay网络。当初始化或更新应用程序时, Swarm manager会自动为overlay网络上的容器分配IP地址。
  • 服务发现
  1. Swarm manager节点为集群中的每个服务分配唯一的DNS记录和负载均衡VIP。可以通过Swarm内置的DNS服务器查询集群中每个运行的容器。
  • 负载均衡
  1. 实现服务副本负载均衡,提供入口访问。
  • 安全传输
  1. Swarm中的每个节点使用TLS相互验证和加密, 确保安全的其他节点通信
  • 滚动更新
  1. 升级时,逐步将应用服务更新到节点,如果出现问题,可以将任务回滚到先前版本。

2. Swarm负载均衡

  • Swarm manager使用 ingress负载均衡来暴露你需要让外部访问的服务。swarm manager能够自动的分配一个外部端口到service,当然,你也能够配置一个外部端口,你可以指定任意没有使用的port,如果你不指定端口,那么swarm manager会给service指定30000-32767之间任意一个端口。
  • Swarm模式有一个内部的DNS组件,它能够自动分发每个服务在swarm里面。swarm manager使用内部负载均衡机制来接受集群中节点的请求,基于DNS名字解析来实现。

2.1. Swarm架构图

在这里插入图片描述
Swarm manager:

  • API:接受命令,创建一个service(API输入)
  • orchestrator:service对象创建的task进行编排工作(编排)
  • allocater:为各个task分配IP地址(分配IP)
  • dispatcher:将task分发到nodes(分发任务)
  • scheduler:安排一个worker运行task(运行任务

Worker node:

  • 连接到分发器接受指定的task
  • 将task指派到对应的worker节点
    在这里插入图片描述
  • Swarm manager创建一个3个nginx副本集的service,他会将task分配到对应的node。

2.2. Swarm节点及防火墙设置

集群角色宿主机ip地址宿主机系统docker版本
manager192.168.2.10CentOS7.923.0.3
Node1192.168.2.20CentOS7.923.0.3
Node2192.168.2.30CentOS7.923.0.3
  • Manager、node1、node2节点进行如下配置
//添加hosts解析
[root@localhost ~]# vim /etc/hosts
添加如下:
192.168.2.10 manager
192.168.2.20 node1
192.168.2.30 node2

//临时关闭selinux和防火墙;
sed -i '/SELINUX/s/enforcing/disabled/g'  /etc/sysconfig/selinux
setenforce  0
systemctl   stop     firewalld.service
systemctl   disable   firewalld.service

//同步节点时间
yum install ntpdate -y
ntpdate  pool.ntp.org

//修改对应节点主机名
hostname `cat /etc/hosts|grep $(ifconfig|grep broadcast|tail -1|awk '{print $2}')|awk '{print $2}'`;su

//关闭swapoff
[root@manager ~]# swapoff -a
sed -ri 's/.*swap.*/#&/g' /etc/fstab    ---永久关闭

3. Docker安装

  • Manager、node1、node2节点进行如下配置
//安装依赖包
 yum -y install yum-utils device-mapper-persistent-data lvm2
//配置docker镜像源
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
//安装docker
yum -y install docker-ce

//修改docker配置文件
[root@manager ~]# vim /etc/docker/daemon.json
添加内容如下:

{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ],
  "registry-mirrors": ["https://uyah70su.mirror.aliyuncs.com"]
}

//注意,由于国内拉取镜像较慢,配置文件最后增加了registry-mirrors

mkdir -p /etc/systemd/system/docker.service.d
sed -i '/^ExecStart/s/dockerd/dockerd -H tcp:\/\/0.0.0.0:2375/g' /usr/lib/systemd/system/docker.service

//重启docker
[root@manager ~]# systemctl daemon-reload
[root@manager ~]# systemctl enable docker
[root@manager ~]# systemctl restart docker
ps -ef|grep -aiE docker

4. Swarm集群部署

  • 根据如上步骤,Docker平台准备完成,接下来部署Swarm集群,在Manager节点初始化集群,操作的方法和指令如下:
[root@manager ~]# docker swarm init --advertise-addr 192.168.2.10
Swarm initialized: current node (44bghdfflwgqhzywunoqfqgqf) is now a manager.

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

    docker swarm join --token SWMTKN-1-1ll2gomc2khm5b5yjah2mmr8llpqn7jlb68rb7kudfbtpj0coo-3ws55l597bu7144wg6xddweyj 192.168.2.10:2377

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

4.1. 将Node1节点加入Swarm集群,操作的方法和指令如下

//此操作在node1上操作:
 docker swarm join --token SWMTKN-1-1ll2gomc2khm5b5yjah2mmr8llpqn7jlb68rb7kudfbtpj0coo-3ws55l597bu7144wg6xddweyj 192.168.2.10:2377

4.2. 将Node2节点加入Swarm集群,操作的方法和指令如下:

//此操作在node2上操作:
[root@node2 ~]#  docker swarm join --token SWMTKN-1-1ll2gomc2khm5b5yjah2mmr8llpqn7jlb68rb7kudfbtpj0coo-3ws55l597bu7144wg6xddweyj 192.168.2.10:2377
This node joined a swarm as a worker.

4.3. 查看Swarm集群Node状态,命令操作如下:

[root@manager ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
44bghdfflwgqhzywunoqfqgqf *   manager    Ready     Active         Leader           23.0.3
heavfkcv59ed5bkikbxot7mus     node1      Ready     Active                          23.0.3
k9a71k4kzhl9nw53ijo6lx4y5     node2      Ready     Active                          23.0.3

5. Swarm部署Nginx服务

5.1. 基于Swarm集群来创建一台Nginx WEB服务,操作指令如下:

[root@manager ~]# docker service create --replicas 1 --name nginx-web nginx:latest
  • --replicas 副本集数
  • --name 服务名称

5.2. 查看Nginx服务,操作指令如下 :

[root@manager ~]# docker service ps nginx-web
ID             NAME          IMAGE          NODE      DESIRED STATE   CURRENT STATE           ERROR     PORTS
ixh4h670h4ws   nginx-web.1   nginx:latest   node1     Running         Running 2 minutes ago

5.3. 显示服务详细信息,操作指令如下

[root@manager ~]# docker service inspect --pretty nginx-web

ID:             st3o1iyv7whmn8eds87m35ozx
Name:           nginx-web
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:         nginx:latest@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
 Init:          false
Resources:
Endpoint Mode:  vip

5.4. 查看Json格式

[root@manager ~]# docker service inspect nginx-web
[
    {
        "ID": "st3o1iyv7whmn8eds87m35ozx",
        "Version": {
            "Index": 21
        },
        "CreatedAt": "2023-04-14T08:49:13.137753329Z",
        "UpdatedAt": "2023-04-14T08:49:13.137753329Z",
        "Spec": {
            "Name": "nginx-web",
            "Labels": {},
            "TaskTemplate": {
                "ContainerSpec": {
                    "Image": "nginx:latest@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31",
                    "Init": false,
                    "StopGracePeriod": 10000000000,
                    "DNSConfig": {},
                    "Isolation": "default"
                },
                "Resources": {
                    "Limits": {},
                    "Reservations": {}
                },
                "RestartPolicy": {
                    "Condition": "any",
                    "Delay": 5000000000,
                    "MaxAttempts": 0
                },
                "Placement": {
                    "Platforms": [
                        {
                            "Architecture": "amd64",
                            "OS": "linux"
                        },
                        {
                            "OS": "linux"
                        },
                        {
                            "OS": "linux"
                        },
                        {
                            "Architecture": "arm64",
                            "OS": "linux"
                        },
                        {
                            "Architecture": "386",
                            "OS": "linux"
                        },
                        {
                            "Architecture": "mips64le",
                            "OS": "linux"
                        },
                        {
                            "Architecture": "ppc64le",
                            "OS": "linux"
                        },
                        {
                            "Architecture": "s390x",
                            "OS": "linux"
                        }
                    ]
                },
                "ForceUpdate": 0,
                "Runtime": "container"
            },
            "Mode": {
                "Replicated": {
                    "Replicas": 1
                }
            },
            "UpdateConfig": {
                "Parallelism": 1,
                "FailureAction": "pause",
                "Monitor": 5000000000,
                "MaxFailureRatio": 0,
                "Order": "stop-first"
            },
            "RollbackConfig": {
                "Parallelism": 1,
                "FailureAction": "pause",
                "Monitor": 5000000000,
                "MaxFailureRatio": 0,
                "Order": "stop-first"
            },
            "EndpointSpec": {
                "Mode": "vip"
            }
        },
        "Endpoint": {
            "Spec": {}
        }
    }
]

6. Swarm服务扩容&升级

6.1. Nginx服务扩容和缩容,最终每个Node上分布了1个Nginx容器

[root@manager ~]# docker service scale nginx-web=3
nginx-web scaled to 3
overall progress: 3 out of 3 tasks
1/3: running   [==================================================>]
2/3: running   [==================================================>]
3/3: running   [==================================================>]
verify: Service converged

[root@manager ~]# docker service ls
ID             NAME        MODE         REPLICAS   IMAGE          PORTS
st3o1iyv7whm   nginx-web   replicated   3/3        nginx:latest

[root@manager ~]# docker service ps nginx-web
ID             NAME          IMAGE          NODE      DESIRED STATE   CURRENT STATE            ERROR     PORTS
ixh4h670h4ws   nginx-web.1   nginx:latest   node1     Running         Running 38 minutes ago
l0dobbkogr1l   nginx-web.2   nginx:latest   manager   Running         Running 57 seconds ago
oyh7urhu955q   nginx-web.3   nginx:latest   node2     Running         Running 57 seconds ago

6.2. 滚动更新服务

[root@manager ~]# docker service update --image tomcat nginx-web

[root@manager ~]# docker service ps -f 'DESIRED-STATE=running' nginx-web
ID             NAME          IMAGE           NODE      DESIRED STATE   CURRENT STATE           ERROR     PORTS
o9f4petj2bag   nginx-web.1   tomcat:latest   node1     Running         Running 9 minutes ago
xyotaj1ifj5b   nginx-web.2   tomcat:latest   manager   Running         Running 6 minutes ago
i92vie0nkps8   nginx-web.3   tomcat:latest   node2     Running         Running 4 minutes ago

6.3. 手动回滚

[root@manager ~]# docker service update --rollback nginx-web

[root@manager ~]# docker service ps -f 'DESIRED-STATE=running' nginx-web
ID             NAME          IMAGE          NODE      DESIRED STATE   CURRENT STATE           ERROR     PORTS
worhbabalj5c   nginx-web.1   nginx:latest   node1     Running         Running 2 minutes ago
ldgv6sagqa8u   nginx-web.2   nginx:latest   manager   Running         Running 2 minutes ago
qq7j0f2rks3i   nginx-web.3   nginx:latest   node2     Running         Running 2 minutes ago

7. Manager和Node角色切换

7.1. Manager和Node角色切换之前,查看节点状态信息

[root@manager ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
44bghdfflwgqhzywunoqfqgqf *   manager    Ready     Active         Leader           23.0.3
heavfkcv59ed5bkikbxot7mus     node1      Ready     Active                          23.0.3
k9a71k4kzhl9nw53ijo6lx4y5     node2      Ready     Active                          23.0.3

7.2. Manager和Node角色切换,停掉现有manager Docker引擎服务,操作指令如下:

//将node1升级为Manager
[root@manager ~]# docker node promote node1
Node node1 promoted to a manager in the swarm.

//将manager的docker服务停掉
[root@manager ~]# systemctl stop docker.socket
//在node1查看节点状态信息
[root@node1 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
44bghdfflwgqhzywunoqfqgqf     manager    Ready     Active         Unreachable      23.0.3
heavfkcv59ed5bkikbxot7mus *   node1      Ready     Active         Leader           23.0.3
k9a71k4kzhl9nw53ijo6lx4y5     node2      Ready     Active                          23.0.3

8. Swarm数据管理之Volume

  • Docker Swarm数据管理方式有很多,其中volume方式管理数据也比较常见,配置相对比较简单,其原理是:在宿主机上创建一个Volume,默认目录为:/var/lib/docker/volume/your_custom_volume/_data。
  • 将容器的某个目录(例如容器网站数据目录)映射到宿主机的volume上,即使容器挂了,数据还会依然保留在宿主机的volume上。
//创建Nginx服务,Volume映射
[root@node1 ~]# docker service create --replicas 1 --mount type=volume,src=nginx_data,dst=/usr/share/nginx/html  --name nginx-www nginx:latest

//查看nginx-www在哪台服务器创建
[root@node1 ~]# docker service inspect nginx-www

//查看数据卷;
[root@manager ~]# ls /var/lib/docker/volumes/
backingFsBlockDev  metadata.db  nginx_data

[root@manager ~]# ls -l /var/lib/docker/volumes/nginx_data/_data/
总用量 8
-rw-r--r-- 1 root root 497 1228 2021 50x.html
-rw-r--r-- 1 root root 615 1228 2021 index.html

-可以看到容器里面的nginx数据目录已经挂在到宿主机的nginx_data了

9. Swarm数据管理之Bind

  • Bind mount模式工作原理:将宿主机某个目录映射到docker容器,很适合于网站,同时把宿主机的这个目录作为git版本目录,每次update代码的时候,容器就会更新
  1. 分别在在mananger、node1、node2上创建web网站目录
mkdir -p /data/webapps/www/

  1. 创建服务,操作指令如下:
[root@node1 ~]# docker service create --replicas 1 --mount type=bind,src=/data/webapps/www,dst=/usr/share/nginx/html --name nginx-v1 nginx:latest
  1. 查看已创建的nginx-v1服务,操作指令如下
docker service ps nginx-v1
docker service inspect nginx-v1

  1. 测试宿主机的数据盘和容器是映射关系
[root@node1 ~]# ls /data/webapps/www/
[root@node1 ~]# echo www.sxy.com Test Pages >>/data/webapps/www/index.html

  1. 进入容器查看内容
[root@node1 ~]# docker exec -it nginx-v1.1.eq7qn5670ui64wab6u87mx5x1  /bin/bash
root@6df12eda8415:/# cat /usr/share/nginx/html/index.html
www.sxy.com Test Pages
- 可以看到我们在宿主机上创建的index.html已经挂在到容器上

10. Swarm数据管理之NFS

  • 如上两种方式都是单机Docker上数据共享方式,要是在集群中,这个就不适用了,我们必须使用共享存储或网络存储了。这里我们使用NFS来测试。

10.1. 安装NFS文件服务

[root@manager ~]# yum -y install nfs-utils.x86_64 rpcbind

10.2. 配置共享目录&权限

[root@manager ~]# vim /etc/exports
/data/  192.168.2.0/24(rw,sync,insecure,anonuid=1000,anongid=1000,no_root_squash)

10.3. 启动NFS服务

[root@manager ~]# systemctl enable rpcbind
[root@manager ~]# systemctl start rpcbind
[root@manager ~]# systemctl enable nfs-server
[root@manager ~]# systemctl start nfs-server
[root@manager ~]# exportfs -rv

10.4. 所有节点安装nfs客户端

yum -y install nfs-utils.x86_64

10.5.创建Nginx Volume名称:volume_test1,操作指令如下:

[root@node1 ~]# docker volume create --driver local  --opt type=nfs --opt o=addr=192.168.2.10,rw --opt device=/data/ volume_test
volume_test1

10.6. 创建Nginx服务,绑定volume_test1 nfs映射目录,操作指令如下

[root@node1 ~]# docker service create --mount type=volume,source=volume_test,destination=/usr/share/nginx/html/  --replicas 3 --name nginx-test  --publish 88:80  nginx:latest
zklzy25i5acr3srdcegi0b61e
overall progress: 3 out of 3 tasks
1/3: running   [==================================================>]
2/3: running   [==================================================>]
3/3: running   [==================================================>]
verify: Service converged

10.7.可以查看到nfs已经挂在到manager节点, 进入容器查看并创建内容

//查看nginx-test都在哪台服务器创建容器
[root@node1 ~]# docker service ps nginx-test
ID             NAME           IMAGE          NODE      DESIRED STATE   CURRENT STATE           ERROR     PORTS
m8mspt13wmfi   nginx-test.1   nginx:latest   node1     Running         Running 8 minutes ago
kfgvwn8j0vtk   nginx-test.2   nginx:latest   manager   Running         Running 8 minutes ago
kgpy17zjz865   nginx-test.3   nginx:latest   node2     Running         Running 8 minutes ago

[root@manager ~]# docker exec -it nginx-test.1.qv3g2fm8f73byv7mtcmn1zq55  /bin/bash
root@a38779c38ccc:/# cd /usr/share/nginx/html/
root@a38779c38ccc:/usr/share/nginx/html# ls
50x.html  index.html
root@a38779c38ccc:/usr/share/nginx/html# echo "wo shi ys" >> index.htm
root@a38779c38ccc:/usr/share/nginx/html# ls
50x.html  index.html  index.htm

10.8. 在Nginx容器中创建内容之后,退出容器,进入宿主机NFS服务器上,进入/data/目录,查看内容

[root@manager ~]# cd /data/
[root@manager data]# ls
50x.html  index.htm  index.html
[root@manager data]# cat index.htm
wo shi ys

11. Docker Swarm新增节点

  • Docker Swarm集群在生产环境正常运行中,随着企业业务飞速的增长,此时需要扩容Swarm节点,作为运维人员该如何操作呢?操作的方法和步骤如下:
  • 新增一台服务器,IP地址:192.168.2.40

11. 1. 在每台服务器上hosts文件中,添加Node3和IP绑定记录,操作指令如下:

 vim /etc/hosts
192.168.2.10 manager
192.168.2.20 node1
192.168.2.30 node2
192.168.2.40 node3
//注意:node3需要添加上面所有内容,其他主机只需添加node3的内容就好。

11.2. 在node3配置:

//关闭selinux和防火墙
sed -i '/SELINUX/s/enforcing/disabled/g'  /etc/sysconfig/selinux

setenforce  0

systemctl   stop     firewalld.service
systemctl   disable   firewalld.service

//同步节点时间;
yum install ntpdate -y
ntpdate  pool.ntp.org

//修改对应节点主机名
hostname node3;su

//关闭swapoff
swapoff -a
sed -ri 's/.*swap.*/#&/g' /etc/fstab    ---永久关闭

11.3. 在新节点node3上,部署Docker引擎服务

//安装依赖包
 yum -y install yum-utils device-mapper-persistent-data lvm2
//配置docker镜像源
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
//安装docker
yum -y install docker-ce

//修改docker配置文件
[root@manager ~]# vim /etc/docker/daemon.json
添加内容如下:

{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ],
  "registry-mirrors": ["https://uyah70su.mirror.aliyuncs.com"]
}

//注意,由于国内拉取镜像较慢,配置文件最后增加了registry-mirrors

mkdir -p /etc/systemd/system/docker.service.d

sed -i '/^ExecStart/s/dockerd/dockerd -H tcp:\/\/0.0.0.0:2375/g' /usr/lib/systemd/system/docker.service

//重启docker
[root@manager ~]# systemctl daemon-reload
[root@manager ~]# systemctl enable docker
[root@manager ~]# systemctl restart docker
ps -ef|grep -aiE docker

11.4. 在已经初始化的机器上(Manager)执行如下指令,获取客户端加入集群的命令

[root@node1 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-1ll2gomc2khm5b5yjah2mmr8llpqn7jlb68rb7kudfbtpj0coo-anqgw5qli4j1n6o3c9rmgylgp 192.168.2.20:2377


11.5. 将结果复制到新增Node3节点机器上执行即可

[root@node3 ~]# docker swarm join --token SWMTKN-1-1ll2gomc2khm5b5yjah2mmr8llpqn7jlb68rb7kudfbtpj0coo-anqgw5qli4j1n6o3c9rmgylgp 192.168.2.20:2377

11.6. 查看集群状态是否新增成功

[root@node1 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
44bghdfflwgqhzywunoqfqgqf     manager    Ready     Active         Reachable        23.0.3
heavfkcv59ed5bkikbxot7mus *   node1      Ready     Active         Leader           23.0.3
k9a71k4kzhl9nw53ijo6lx4y5     node2      Ready     Active                          23.0.3
s2tjb3vmazfk2cj5oy8fj90ca     node3      Ready     Active         Reachable        23.0.3
  • Leader ,意味着该节点是使得群的所有群管理和编排决策的主要管理器节点。
  • Reachable ,意味着节点是管理者节点正在参与Raft共识。如果领导节点不可用,则该节点有资格被选为新领导者。
  • Unavailable ,意味着节点是不能与其他管理器通信的管理器。如果管理器节点不可用,您应该将新的管理器节点加入群集,或者将工作器节点升级为管理器。
  • 节点AVAILABILITY列说明,显示调度程序是否可以将任务分配给节点
  • Active,意味着调度程序可以将任务分配给节点。
  • Pause,意味着调度程序不会将新任务分配给节点,但现有任务仍在运行。
  • Drain,意味着调度程序不会向节点分配新任务。调度程序关闭所有现有任务并在可用节点上调度它们。

12. Docker Swarm删除节点

  • Docker Swarm集群在生产环境正常运行中,随着服务器使用寿命长,难免有服务器过保,下架,此时需要删除Swarm节点,作为运维人员该如何操作呢?操作的方法和步骤如下:

12.1. 将Node3节点停用,该节点上的容器会迁移到其他节点,执行如下操作指令:

[root@node1 ~]# docker node  update --availability drain node3

12.2. 停止Node3 docker服务,删除节点前,需先停该节点的docker服务

[root@node3 ~]# systemctl stop docker.socket

12.3. 登录到Manager上,将节点node3降级成worker,然后删除。只能删除worker基本的节点。

[root@node1 ~]# docker node demote node3
Manager node3 demoted in the swarm.
[root@node1 ~]# docker node rm node3
node3
[root@node1 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
44bghdfflwgqhzywunoqfqgqf     manager    Ready     Active         Reachable        23.0.3
heavfkcv59ed5bkikbxot7mus *   node1      Ready     Active         Leader           23.0.3
k9a71k4kzhl9nw53ijo6lx4y5     node2      Ready     Active                          23.0.3

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

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

相关文章

驼峰式匹配-力扣1023-java

一、题目描述 如果我们可以将小写字母插入模式串 pattern 得到待查询项 query,那么待查询项与给定模式串匹配。(我们可以在任何位置插入每个字符,也可以插入 0 个字符。) 给定待查询列表 queries,和模式串 pattern&a…

未来技术方向——“乐高式”可组装式开发能力

技术正在改变各行各业的发展,Gartner的主要战略技术趋势一直是行业的技术风向标之一。近3年,Gartner在主要的战略技术趋势中都提到组装式技术,2021年首次提出组装式企业,2022年提出可组装式应用,2023年在2项主要战略技…

ModuleNotFoundError: No module named ‘d2l’

目录 1. 下载李沐老师分享的源代码 step1:下载李沐老师分享的源代码: step3:Anaconda Prompt中安装d2l(这个l是英文) step4:运行代码,成功: (番外)ModuleNotFoundError: No mod…

【微服务】5、声明式 HTTP 客户端 —— Feign

目录 一、RestTemplate 不好的地方二、Feign 是什么三、使用四、自定义 Feign 的配置(1) Feign 的几个常见配置(2) 配置 Feign 的日志级别① 通过配置文件② Java 代码配置日志级别 五、Feign 性能优化(1) 性能优化介绍(2) 修改 Feign 底层的 HTTP 请求客户端 六、Feign 的最佳…

C++:std::function模板类(前言):为什么有了函数指针还需要Functional

为什么有了函数指针还有 Functional 1: 函数指针定义2: 函数指针结论3:疑问4: Function来源5:Functional 特点 1: 函数指针定义 在C中可以使用指针指向一段代码,这个指针就叫函数指针,假设有下面一段代码 …

交友项目【首页推荐,今日佳人,佳人信息】

目录 1:首页推荐 1.1:接口地址 1.2:流程分析 1.3:代码实现 2:今日佳人 1.1:接口地址 1.2:流程分析 1.3:代码实现 3:佳人信息 1.1:接口地址 1.2&am…

计算机基础--MySQL--索引

参考文献 [MySQL索引连环18问!] https://zhuanlan.zhihu.com/p/364041898[深入理解MySQL索引] https://www.infoq.cn/article/ojkwyykjoyc2ygb0sj2c[聚集索引和非聚集索引的区别] https://juejin.cn/post/7001094401858469918[索引分类] https://blog.csdn.net/dd2…

【消费战略】解读100个食品品牌丨王小卤 4年10亿爆品破局

爆品破局 王小卤的聚焦发展! 王小卤创建于 2016 年,与饮料行业的独角兽元气森林同年。 相较于元气森林的快速增长,王小卤历经 三年坎坷之路,直至 2019 年才踏上高增长的赛道,实现四年十亿的增长。 “所有的消费品都值得重新 做…

RHCSA练习作业(二)

目录 题目一 题目二 题目三 第四题 第五题 题目一 文件查看:查看/opt/passwd文件的第六行(使用head和tail指令) 代码如下: head -6 /opt/passwd | tail -1 题目二 在/etc及其子目录中,查找host开头的文件&#x…

纯净Python环境的安装以及配置PyCharm编辑器

前言 优质的教程可以让我们少走很多弯路,这一点毋庸置疑。去年二月我接触了Python,并找到了一份优质的配置教程,让我能够快速上手Python的学习。现在,一年多过去了,我已经有了很大的进步和变化,这也让我更…

ARM kernel 内核的移植 - 从三星官方内核开始移植

一、内核移植初体验 1、三星官方移植版内核获取 (1) 从网盘下载源码包。 (2) 这个文件最初是来自于三星的 SMDKV210 开发板附带的光盘资料。 2、构建移植环境 (1) Windows下建立工程。 (2) ubuntu下解压。 3、配置编译下载尝试 (1) 检查 Makefile 中 ARCH 和 CROSS_COMPI…

手把手教你Python爬虫

前言 python爬虫技术在java开发工作中属于工具性的技术属性,所以我这里就只从爬取一个网站的数据为例作为教学内容,具体的基础学习与其它的扩展知识内容,我会以链接的形式给出,若有兴趣可自行点击学习。 python基础知识教学 Pyth…

怎么压缩图片的体积大小,4款软件分享

怎么压缩图片的体积大小?因为在日常生活和工作中,我们常常会遇到需要压缩图片大小的情况。图片的大小是由像素点数量和每个像素的颜色深度共同决定的,一般来说,像素点数量越多,每个像素的颜色深度越高,图片…

四百元以内哪种耳机音质好?2023便宜音质好的蓝牙耳机推荐

现如今,蓝牙耳机的发展速度越来越快,不少人对于其音质方面的要求也越来越高。最近看到很多人问,有没有便宜音质又好的蓝牙耳机?针对这个问题,我来给大家推荐几款便宜音质好的蓝牙耳机,一起来看看吧。 一、…

怎么远程控制电脑

为什么要从另一台电脑远程控制电脑? 如今,Splashtop已广泛应用于各个领域。 在很多情况下,您需要从另一台远程电脑控制一台电脑。 这里演示了两个例子: 1:当您不在同一楼层时,您的同事需要您的帮助来解决…

阿里云张献涛:云原生计算基础设施助力汽车行业数字化升级

2023 年阿里云峰会北京站《云上智能汽车》论坛,阿里云智能基础产品部副总裁、阿里云智能弹性计算 & 无影产品线总经理张献涛,发表了《云原生计算基础设施助力汽车行业数字化升级》的主题演讲。 当前,汽车行业的数字化浪潮已经渗透到汽车设…

System V 共享内存

System V 共享内存 共享内存是什么如何使用共享内存ftokshmgetshmatshmdtshmctl 共享内存的原理共享内存实现两个进程间通信共享内存的特点共享内存与管道配合使用两个进程间通信多个进程间通信 共享内存是什么 🚀共享内存是最快的IPC形式。一旦这样的内存映射到共…

【产品应用】一体化步进伺服电机在高速异形插件机的应用

随着科技的不断发展,自动化生产设备在各个行业中得到了广泛的应用。高速异形插件机作为自动化生产设备中的一种,其核心部件之一就是一体化步进伺服电机。本文将详细介绍一体化步进伺服电机在高速异形插件机中的应用。 01.设备简介 高速异形插件机是一种…

我们为什么要写作?

为什么要写书是一个很难回答的问题,因为从不同的角度,会有不同的答案。 最近ChatGPT很火!诸事不决,先问问ChatGPT,看看它是怎么回答的。 ChatGPT给出的答案还是比较全,虽然没有“一本正经的胡说八道”&…

PCB高频电路设计中的差分信号设计

目录 1、差分信号的定义 2、如何布置差分线路? 3、微带线和带状线的概念 4、布线中常用的匹配方法 1、差分信号的定义 什么是差分布线:差分布线主要是区别传统的信号线对应一根地线的信号传输方式,差分信号传输主要是两条线上都有信号传…