十三、部署Swarm集群

于2021年10月11日学习

一、简介

Swarm是Docker 引擎内置的原生集群管理和编排工具。

跟k8s一样都是集群管理工具,区别在于Swarm是docker引擎内置的工具。

集群就不说了吧,就跟nginx负载均衡集群一样,实现高可用,宕机了一台服务器,其他服务器就能顶上。

好了,该知道的都让你知道完了,现在开始配置Swarm集群

二、配置集群

2.1 实验环境

这里交待一下我的环境,每台服务器上都需要安装docker

主机名 IP
server01 10.154.0.110
server02 10.154.0.111
server03 10.154.0.112

如果使用的xshell,工具-->发送键输入到所有会话,可以进行同步安装,很方便

2.2 初始化集群

配置集群前先要进行初始化,执行初始化命令的节点将会自动成为管理节点。

我们在 server01上进行初始化

docker swarm init

#如果服务器有多网卡,可以指定IP
docker swarm init --advertise-addr 192.168.99.100

初始化之后,我们得到了一串命令,复制这个命令在其他docker主机上执行就能以工作节点的身份加入这个集群

这里出现管理节点的概念,有管理节点就有工作节点,顾名思义,管理节点就是领导,工作节点就是打工仔

2.3 配置工作节点

我们在 server02server03上粘贴执行从管理节点输出的命令

docker swarm join --token SWMTKN-1-0wfd7530mmf4pbpe59s0gjfg7qf9nk54vujjyz17w8kolfxl5u-6upb500cbq1bz20ht6pi77yrv 10.154.0.110:2377

server01上查看集群,可以看到server01是管理节点,有两个工作节点

docker node ls

image-20211012121441313

集群基础配置就是这么简单,集群有了,那么就把服务装上,这样才能发挥集群的作用

三、部署服务

我们可以使用docker service命令来管理 Swarm 集群中的服务,该命令只能在管理节点运行。

3.1 新建服务

先来新键一个nginx服务,然后在server01上查看

docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13.7-alpine

:'
--replicas:指定副本数,我这里有3台机器组成的集群,这里写3就表示3台机器都会运行nginx服务
'

查看命令

 docker service ls
 docker service ps nginx
 docker service logs

查看当前 Swarm 集群运行的服务,可以看到副本为3

image-20211012165225516

查看Nginx服务详情,可以看到在三台机器上都运行着nginx服务

image-20211012165614197

查看Nginx服务的日志

image-20211012165816677

因为在这个集群中三台机器都运行nginx服务,所以访问这三台机器都能访问nginx并产生访问日志

3.2 服务伸缩

当业务处于访问高峰期时,我们需要扩展服务运行的容器数量,处理访问请求。

比如像重大节假日,商家搞活动,淘宝买疯了,超出服务器处理请求极限,这时就要增加服务器来处理访问请求。

1)增加Nginx容器数量

docker service scale nginx=5

可以看到副本变为了5个

image-20211012170622813

这5个Nginx服务随机分布在集群中,server01有2个Nginx容器,server02有1个Nginx容器,server03有1个Nginx容器。

image-20211012170707994

2)减少Nginx容器数量

能伸就能缩,当业务平稳时,我们需要减少服务运行的容器数量。

docker service scale nginx=2

3.3 删除服务

docker service rm nginx

四、使用 compose 文件

4.1 部署服务

前面我们使用docker service create 一次只能部署一个服务,这次使用 docker-compose.yml 我们可以一次启动多个关联的服务。

以部署之前部署过的wordpress博客网站为例

1)创建wordpress文件夹

mkdir wordpress
cd wordpress/

2)编辑docker-compose.yml文件

vim docker-compose.yml
version: "3"

services:
  wordpress:
    image: wordpress
    ports:
      - 80:80
    networks:
      - overlay
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
    deploy:
      mode: replicated
      replicas: 3

  db:
    image: mysql
    networks:
       - overlay
    volumes:
      - db-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    deploy:
      placement:
        constraints: [node.role == manager]

  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]

volumes:
  db-data:
networks:
  overlay:

在这里我们写了三个服务,分别是wordpress、db和visualizer,visualizer容器是一个提供可视化界面方便我们查看集群中各个服务运行节点状态的容器。

3)部署服务

docker stack deploy -c docker-compose.yml wordpress

:"
部署服务使用docker stack deploy命令
-c:指定compose文件名
"
docker stack ls

4)查看效果

打开浏览器输入 任一节点IP:8080 即可看到各节点运行状态

image-20211012172627417

4.2 查看服务

docker stack ls

可以看到wordpress项目运行了3个服务

image-20211012172747649

可以看到db,visualizer容器分布在server01上,wordpress有三个分别分布在三台服务器上。

image-20211012173004230

4.3 删除服务

删除wordpress服务

docker stack down wordpress

五、管理密钥

我们以前将密钥、证书等敏感信息放入镜像中或者设置环境变量以及volume 动态挂载都是不安全的方式。

所以docker提供了secrets来管理密钥,它不仅能在Swarm集群中安全的管理密钥,还能在多个 Docker 容器实例之间共享访问指定的敏感数据。

还能在Docker Compose 中使用。

5.1 使用secret

1)创建secret

创建密码secret文件,创建成功后会返回ID号

#这里创建的wp跟mysql的root密码
echo "wordpress" | docker secret create wp_db_password -
echo "root" | docker secret create mysql_root_password -

#书中这里是随机生成的密码,强烈不建议使用
openssl rand -base64 20 | docker secret create mysql_password -
openssl rand -base64 20 | docker secret create mysql_root_password -

2)查看secret

docker secret ls

5.2 案例

1)部署Mysql服务

创建一个名为mysql_private的overlay网络

docker network create -d overlay mysql_private

创建mysql服务

docker service create \
     --name mysql \
     --replicas 1 \
     --network mysql_private \
     --mount type=volume,source=mydata,destination=/var/lib/mysql \
     --secret source=mysql_root_password,target=mysql_root_password \
     --secret source=wp_db_password,target=wp_db_password \
     -e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password" \
     -e MYSQL_PASSWORD_FILE="/run/secrets/wp_db_password" \
     -e MYSQL_USER="wordpress" \
     -e MYSQL_DATABASE="wordpress" \
     mysql:latest

这里挂载了数据卷,如果之前创建了同名数据一定要删除,切记,一定要删除,不然mysql是登录不上的,有残留数据。

还有你没有在 target 中指定路径时,secret 默认通过 tmpfs 文件系统挂载到容器的 /run/secrets 目录中。

2)部署wordpress服务

docker service create \
     --name wordpress \
     --replicas 1 \
     --network mysql_private \
     -p published=8080,target=80 \
     --mount type=volume,source=wpdata,destination=/var/www/html \
     --secret source=wp_db_password,target=wp_db_password \
     -e WORDPRESS_DB_USER="wordpress" \
     -e WORDPRESS_DB_PASSWORD_FILE="/run/secrets/wp_db_password" \
     -e WORDPRESS_DB_HOST="mysql:3306" \
     -e WORDPRESS_DB_NAME="wordpress" \
     wordpress:latest

这里要注意-p选项,书中是版本较老的写法,新版本的docker对此有些改动。

书中指定了权限mode=0400,不要指定权限

书中这个案例还有字段名写错了,要注意

3)查看服务

docker service ls

4)访问效果

浏览器访问,开始 WordPress 的安装与使用。

image-20211012235925757

除此之外,还能写compose文件,可参考secret案例secret使用

六、管理配置信息

除了之前介绍的使用secret管理密钥,这里还能使用config管理配置文件。

使用 docker config 子命令来管理集群中的配置信息,以后无需将配置文件放入镜像或挂载到容器中就可实现对服务的配置。

6.1 使用config

1)编辑redis配置文件,让redis监听6380端口

mkdir redis
cd redis/
echo "port 6380" > redis.conf

2)创建config

docker config create redis.conf redis.conf

3)查看config

docker config ls

6.2 案例

1)部署redis服务

docker service create \
     --name redis \
     # --config source=redis.conf,target=/etc/redis.conf \
     --config redis.conf \
     -p 6379:6380 \
     redis:latest \
     redis-server /redis.conf

看注释那一行,如果没有在 target 中显式的指定路径,默认的 redis.conf 会以 tmpfs 文件系统挂载到容器的 /config.conf。

采用 docker config 来管理服务的配置信息,我们只需修改在集群中的管理节点创建的config,集群会自动的将配置文件分发到运行服务的各个节点中,大大降低了配置信息的管理和分发难度。

另外需要注意的是,config命令仅能在 Swarm 集群中使用。

七、滚动升级

在Swarm升级服务版本,将Nginx1.13.7版本升级为Nginx1.13.12,可以使用docker service update命令实现。

7.1 升级

docker service update \
    --image nginx:1.13.12-alpine \
    nginx
:'
--image:选择服务更新的镜像
--secret-add:增加一个密钥
--secret-rm:移除一个密钥
'

7.2 回退

升级后出现问题,可以使用ocker service rollback一键回退。

docker service rollback nginx

#查看nginx服务详情
docker service ps nginx

八、总结

  • 节点分为管理 (manager) 节点和工作 (worker) 节点。

  • 一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader,leader 通过 raft 协议实现。

  • 工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。

图示如下

img

Swarm通用用于搭建小型服务器集群,例如10台以下的服务集群

大型服务器集群使用更加方便的k8s

九、参考资料

官方文档

Docker入门到实践

posted @ 2020-02-02 22:20  努力吧阿团  阅读(373)  评论(0编辑  收藏  举报