十三、部署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 配置工作节点
我们在 server02
和server03
上粘贴执行从管理节点输出的命令
docker swarm join --token SWMTKN-1-0wfd7530mmf4pbpe59s0gjfg7qf9nk54vujjyz17w8kolfxl5u-6upb500cbq1bz20ht6pi77yrv 10.154.0.110:2377
在server01
上查看集群,可以看到server01
是管理节点,有两个工作节点
docker node ls
集群基础配置就是这么简单,集群有了,那么就把服务装上,这样才能发挥集群的作用
三、部署服务
我们可以使用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
查看Nginx服务详情,可以看到在三台机器上都运行着nginx服务
查看Nginx服务的日志
因为在这个集群中三台机器都运行nginx服务,所以访问这三台机器都能访问nginx并产生访问日志
3.2 服务伸缩
当业务处于访问高峰期时,我们需要扩展服务运行的容器数量,处理访问请求。
比如像重大节假日,商家搞活动,淘宝买疯了,超出服务器处理请求极限,这时就要增加服务器来处理访问请求。
1)增加Nginx容器数量
docker service scale nginx=5
可以看到副本变为了5个
这5个Nginx服务随机分布在集群中,server01有2个Nginx容器,server02有1个Nginx容器,server03有1个Nginx容器。
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
即可看到各节点运行状态
4.2 查看服务
docker stack ls
可以看到wordpress项目运行了3个服务
可以看到db,visualizer容器分布在server01上,wordpress有三个分别分布在三台服务器上。
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 的安装与使用。
除此之外,还能写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) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。
图示如下
Swarm通用用于搭建小型服务器集群,例如10台以下的服务集群
大型服务器集群使用更加方便的k8s