Edehuag

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

Docker之Swarm集群管理

Swarm简介

1、Swarm是一个集群化任务编排工具,使用声明式的配置,配置文件接近docker-compose
2、Swarm是Docker引擎内置(原生)的集群管理和编排工具,Docker Swarm是Docker官方三剑客项目之一(但现在用的不是特别多了)

Docker swarm的特点:
1、集群化任务编排工具
2、声明式配置方式
3、支持扩缩容
4、支持故障自愈
Docker swarm的概念图:

·task:最小部署单元(一个task代表一个实例)
·services:一个运行中的服务可以有多个task(副本)
·stack:Services服务的集合

Swarm运行机制

Swarm集群需要至少一个manager节点,manager将任务分配个woker节点,manager节点本身也可以处理任务

Swarm节点类型:
manager节点:管理集群
worker节点:运行容器任务
Swarm运行原理:
·manager节点收到任务会将任务调度到work节点
·work节点收到命令后启动任务
·如果任务数量少于期望值,会自动重建任务

Swarm应用部署模式:

Swarm有两种应用部署模式,副本应用和全局副本应用,下图显示三个副本服务(黄色)和全局服务(灰色)

副本服务:任何节点都可以部署满足期望值即可
全局副本:不需要指定期望值每一个节点自动会启用全局副本

Swarm集群搭建

准备环境
服务器准备
我的三台测试机

IP地址 角色 主机名
IP1 manager node1
IP2 worker node2
IP3 worker node3

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

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

2、测试环境直接禁用防火墙

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

3、初始化Swarm集群

#初始化Swarm集群
docker swarm init --advertise-addr 【本机IP地址】
#查看swarm节点
docker node ls
因为hostName不好区分,修改hostName
#修改主机名
hostnamectl set-hostname master
# 查看主机名
hostnamectl status

4、将其他节点加入master节点

docker swarm join --token SWMTKN-1-53p5t2rt9ud5j0owkl14boj2z8im6r60ddlzotgc4a8y93u1c2-8f6crxgyc9umayhxva1jv9t1w 【master节点IP】:2377

5、查看Swarm节点

docker node ls
AVAILABILITY状态说明
Active 意味着调度程序可以将任务分配给节点。
Pause 意味着调度程序不会将新任务分配给节点,但现有任务仍在运行。
Drain 意味着调度程序不会向节点分配新任务,调度程序关闭所有现有任务并在可用节点上调度它们。

MANAGER STATUS状态说明
显示节点是属于manager或者worker
没有值 :表示不参与群管理的工作节点。
Leader :意味着该节点是使得群的所有群管理和编排决策的主要管理器节点。
Reachable: 意味着节点是管理者节点正在参与Raft共识,如果领导节点不可用,则该节点有资格被选为新领导者。
Unavailable :意味着节点是不能与其他管理器通信的管理器,如果管理器节点不可用,您应该将新的管理器节点加入群集,或者将工作器节点升级为管理器。

5、添加节点标签
因为用到了节点约束,所以在启动服务之前需要添加节点标签
使用节点约束的意义:
比如某个节点下部署了mysql,当这个mysql容器异常时,Swarm会自动启动一个新的但是如果节点的位置从node1到了node2会造成数据丢失这种问题
所以需要添加节点约束,确保重新启动的节点只在有指点标签的节点上部署。这样mysql就跟节点进行了绑定确保不会出现异常问题

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

Swarm部署服务

方式一 手动部署

Swarm支持手动部署,就类似于手动命令运行Docker服务
所有操作在master节点下执行
1、创建overlay网络
需要在多个服务器中运行Docker容器集群,并使用overlay网络。
overlay网络用于连接不同机器上的docker容器,允许不同机器上的容器相互通信,同时支持对消息进行加密。

创建overlay网络
docker network create --driver overlay learn-docker-overlay-network
查看网络
docker node ls

2、

创建MYSQL配置文件:
mkdir -p /tmp/etc/mysql
编辑配置文件
vi /tmp/etc/mysql/my.cnf
配置内容:
[mysqld]
lower case table names=1

创建MYSQL挂载路径(数据目录):
mkdir -p /tmp/data/mysql

3、创建服务docker service create 创建MySQL服务

docker service create \
-e MYSQL_ROOT_PASSWORD=root \                                                      #-e指定环境变量参数
-p 3306:3306
--mount type=bind,source=/tmp/etc/mysql,destination=/etc/mysql/mysql.conf.d/ \     #mount type=宿主机路径,容器路径
--mount type=bind,source=/tmp/data/mysql,destination=/var/lib/mysql \
--replicas 1 \                                                                     #副本数
--constraint 'node.labels.role == data' \                                          #绑定角色data 数据库只能在该角色下运行
--name mysql \
--network learn-docker-overlay-network \
mysql:5.7.42                                                                       #镜像地址

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

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

5、查看swarm的进程

docker service ls

docker service ps mysql

docker service ps nacos
查看日志
docker service logs 【服务名】

Swarm扩缩容

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

扩容操作:将learn-docker-storage由两个容器变为三个容器
docker service scale learn-docker-storage=3

缩容操作:同样,使用该命令对learn-docker-storage进行缩容
docker service scale learn-docker-storage=2

补充:

删除服务:
docekr service rm 【服务名】

方式二使用申明方式进行部署(一般用该方式)

虽然Swarm可以通过手动部署,但是一般都是通过任务编排的方式部署服务的

1、创建资源清单
创建资源清单了实际上就是编写docker-compose.yml,只是需要3.X的版本

version: '3.9'                               #配置文件版本
services:                                    #代表多个服务的集合
  mysql:
    image: mysql:5.7.42                      #镜像地址
    ports:
      - "3306:3306"
    networks:
      - learn-docker-network
    volumes:
      - "/tmp/etc/mysql:/etc/mysql/mysql.conf.d/"
      - "/tmp/data/mysql:/var/lib/mysql"
    environment:
      MYSQL_ROOT_PASSWORD: 'root'
    deploy:                                   #代表需要进行集群部署
      mode: replicated                        #使用副本模式进行部署
      replicas: 1                             #副本期望值为1(代表只启动1个容器就可以)
      placement:
        constraints:                          #节点约束,代表该容器只能部署在有node.labels.role == data标签的节点里面
          - 'node.labels.role == data'
      restart_policy:                         #指定重启策略
        condition: on-failure
        delay: 5s
  nacos:
    image: nacos/nacos-server:2.0.1
    ports:
      - "8848:8848"
    networks:
      - learn-docker-network
    environment:
      MODE: 'standalone'
      JVM_XMS: '128m'
      JVM_XMX: '128m'
    deploy:
      mode: replicated
      replicas: 1
      restart_policy:
        condition: on-failure
        delay: 5s
  
  learn-docker-web:
    image: itcast.harbor.com/librarylearn-docker-web:1.0-SNAPSHOT
    networks:
      - learn-docker-network
    depends_on:                             #配置依赖关系,启动会让nacos、mysql优先
      - nacos
      - mysql
    deploy:
      mode: replicated
      replicas: 2
      restart_policy:
        condition: on-failure
        delay: 5s
  learn-docker-storage:
    image: itcast.harbor.com/librarylearn-docker-storage:1.0-SNAPSHOT
    networks:
      - learn-docker-network
    depends_on:
      - nacos
      - mysql
    deploy:
      mode: replicated
      replicas: 2
      restart_policy:
        condition: on-failure
        delay: 5s
  learn-docker-gateway:
    image: itcast.harbor.com/library/learn-docker-gateway:1.0-SNAPSHOT
    ports:
      - "8888:8888"
    networks:
      - learn-docker-network
    depends_on:
      - nacos
      - mysql
    deploy:
      mode: replicated
      replicas: 1
      restart_policy:
        condition: on-failure
        delay: 5s
  visualizer:                                   #支持可视化
    image: dockersamples/visualizer
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      mode: replicated
      replicas: 1
      restart_policy:
        condition: on-failure
        delay: 5s
networks:
  learn-docker-network:
    driver: overlay

2、部署应用

使用docker stack deploy命令部署:
docker stack deploy -c docker-compose.yml 【stack命名】
参数: 
-c 指定配置文件的名称

查看部署情况:
docker service ls

使用配置的方式进行扩缩容:(推荐)

修改docker-compose.yml文件:
将服务下的deply-repilcated的参数进行修改减少相当于缩容 ,增加相当于扩容
修改完成后重新部署:(stack名要与原来一致  要不相当于配置一个新的应用)
docker stack deploy -c docker-compose.yml 【stack命名】

删除stack服务:

查询stack服务
docker stack  ls
将stack服务删除,stack下的所有应用都会被删除
docker stack rm 【stack名称】

Swarm总结

Swarm的节点类型:
manager节点:Swarm集群需要至少一个manager节点用于管理集群,如果当前节点挂掉,会从工作节点选举
worker节点:实际运行服务的节点,实际上一个manager节点也能同时成为worker节点,承载任务运行
Swarm的功能:
1、管理集群微服务
2、服务自愈,如果集群的服务不满足期望值会启动新服务
3、支持集群的扩缩容

posted on   饿得慌~  阅读(107)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示