Skip to main content

使用 Docker Swarm 安装

2. 服务器初始化#

2.1 系统磁盘分区#

# 磁盘分区格式化操作为高危,要小心
# ext4 格式化, 一般目录盘是 vdb, 因为 vda 是系统的根目录, 可以 cat /etc/fstab 看看
$ mkfs.ext4 /dev/vdb
# 找到 UUID, 如
$ blkid
/dev/sr0: UUID="2021-07-22-16-19-03-00" LABEL="config-2" TYPE="iso9660"
/dev/vda1: UUID="0fb6f32a-9a3c-4a88-b00e-d6a0cd7611c4" TYPE="ext4"
/dev/vdb: UUID="98edad31-77b1-4bae-9047-8fff9f573dde" TYPE="ext4"
# 修改 /etc/fstab 挂载分区至 /data,否则系统重启后不会自动挂盘
UUID=98edad31-77b1-4bae-9047-8fff9f573dde /data ext4 noatime 0 2

2.2 基于 setup-tools 部署 ( 自动 )#

2.2.1 生成 setup-tools 安装包#

make build.setup-tools -> ops/dist/ur.tar.gz

2.2.2 使用 setup-tools#

# 把 `ur.tar.gz` copy 至某一台服务器,一般是第一台应用服务器 `/data/` 下,解压之,可看到目录 `/data/setup-tools/`
$ cd /data/setup-tools/
# 修改 cli.env 里 HOST_CONFIG_PATH
$ vim cli.env
$ . cli.env
# 完成 setup-tools 初始化,使用时只需要更改 -c 参数即可, 如
$ cli scheduler -c conf/check-system-job.yml -p conf/params.yml
$ cli scheduler -c conf/init-system-job.yml -p conf/params.yml
# host.yml 和 params.yml 准备之后执行
$ sh -x ops/install/script/update_params_to_prod.sh

部署时可按以下顺序执行,资源有限因此会有共用的情况,默认方案以七台服务器作方案

Job / Config类别说明
host.yml (必须)主机配置把需要编排的服务器资源录入此,注意服务器不能同时成为 nfs server 和 client
params.yml (必须)参数变量执行 Job 所需要的一些参数
update_params_to_prod.sh (必须)执行脚本重要 依赖 params.yml, 把变量更新到 datebase.php, env, filebeat, lsyncd
init-system-job.yml (必须)所有服务器初始化系统,包括时钟同
app-server-job.yml (必须)应用服务器docker-compose 方案, 多台应用服务器需要手动更改 upstream
(TODO) app-server-swarm-job.yml应用服务器后续希望只使用 Swarm Mode, 支持多台服务器
ssh-copy-id-job.yml (应用服务器节点 >= 2 时必须)应用服务器lsyncd ssh 公钥认证,同步应用服务器导入导出附件目录,以达到应用层无状态
(TODO, ) nfs-backup-job.yml (服务器总数量 >=2 时建议)NFS Server按天备份附件,DB,ES snapshot
redis-server-job.yml (必须)Redis Server单节点
mysql-server-job.yml (必须)MySQL Server主从
elasticsearch-server-job.yml (必须)Elasticsearch Server最多支持三节点
check-system-job.yml (检测时用)检测系统CPU, 内存, 磁盘, 网络, 时钟同步等情况,执行后可以统一从日志里查看
check-resource-job.yml (检测时用)检测资源Redis, MySQL, ES 等可用性状态,执行后可以统一从日志里查看

2.4 Docker Swarm Mode#

  • Swarm Mode 解决多台应用服务器管理困难的问题,支持多节点,建议 >=3(此时高可用,可容忍一个节点失效)
  • 并且多节点情况下,发布 image 更新只需要在 manager 节点上执行一下即可,通常第一台 app server 一定是 manager

2.4.1 建立 Docker Swarm Mode 集群#

  • 在 app server 1 初始化 docker swarm init
  • 节点数量 <= 3,建议所有节点都加入到 manager 并且同时也是 worker docker swarm join-token manager, 获得 token 在其它应用服务器节点上执行即可,如 docker swarm join --token SWMTKN-1-xx 127.0.0.1:2377
  • 节点数量 > 3,建议保证 3 个 manager 节点,其它可以成为 worker docker swarm join-token worker, 后面操作同上
  • 查看当前集群 nodes,需要在 manager 节点执行 docker node ls
  • 把一个 worker 变为 manager docker node demote {node-id}
  • 把一个 manager 变为 worker docker node promote {node-id}
  • 让一个 manager 不参与 worker 的调度 docker node update --availability drain {node-id}
  • 让一个 manager 参与 worker 的调度 docker node update --availability active {node-id}

2.4.2 发布或更新 stack#

这里的 stack 可以理解为 K8s 里的一个命名空间下的很多个 deployment

  • docker login
  • 更新 .env, 在 manager /data/docker_env/ 执行 export $(cat .env) && docker stack deploy -c docker-swarm.yaml --with-registry-auth --prune app
  • 上述命令等价于 sh scripts/swarm.sh deploy
  • 查看 stack docker stack ls
  • 查看 stack 对应所有的运行容器 docker stack ps app
  • 查看 stack 对应所有的 service docker stack services app or docker service ls
  • 如果 .env 更新了,sh scripts/swarm.sh deploy 即可
  • 遇到问题,也可以删除 stack 并重新 deploy 之 docker stack rm app
  • 为了方便,我把一些常用命令集成到 scripts/swarm.sh 可参考之

2.5 数据初始化#

# 初始化 MySQL 和 ES
$ sh -x /data/docker_env/init.sh

参考 seed.sql, 初始账号:demo / 82fd7ff892db8

2.6 部署完成#

至此,部署完成,setup-tools 其它可以用脚本批处理之,但分步执行可以观察每个 job 的结果,更为放心一些。而 Docker Swarm Mode 设置目前为手动配置。

3.1 重启相关#

  • 部署全面完成,建议全部服务器重启一次看,看看系统各种服务是否运行 OK,防止对比机子重启导致问题