Docker Swarm 集群探索笔记
2020-2-29
| 2023-3-27
0  |  Read Time 0 min
type
status
date
slug
summary
tags
category
icon
password

前言

学校服务器要负载均衡,根据隔壁 TARI TARI 所说,就要搞双 Nginx 冗余服务器,加上两个后端服务器用来跑 PHP 程序,同时将学校服务器的程序都跑在 Docker 上以便管理,根据 U2 推荐,使用 Swarm 进行集群搭建,一共准备六台服务器。
由于是第一次使用 Docker Swarm,操作起来并不熟练,如果文章有哪里出现错误和问题麻烦大佬们在评论区指出,谢谢 QvQ
注:本篇文章由 TARI TARI 和 果果 共同创作

开始

先别管那么多,只要你是 CentOS,防火墙先安排上,不然服务从外面(指 Docker 外面)是连不通的。(一个个端口关太鬼麻烦了,先把防火墙关了以便后续操作,这玩意坑了老久)
如果你用 iptable 前方左转 Google

准备材料

  • Docker_Master
  • CentOS7-Worker-Haproxy * 2
  • CentOS-Worker-Web * 2
  • Ubuntu-Worker-DB

给各台主机修改 Hostname

为避免主机在之后的操作中难以识别的情况,先给每台主机修改 Hostname,确保主机名唯一

安装 Docker

在 CentOS 的五台服务器上运行(嫌麻烦的用 Ansible)
来都来了,那顺便把 docker-compose 给安排了吧

对 Swarm 主机进行初始化

执行命令前,给 Master 主机防火墙开启 2377(tcp)端口
给其余的节点主机和 Master 主机开启 7946(tcp & udp)、4789(udp)端口
同时做作地把 80、443 端口打开以免之后出现的问题
参考资料:
在 Swarm 主机上,执行命令
然后在其他主机(节点)上运行这段命令,就是中间 docker swarm join 这行

给节点贴标签

特定节点办特定事,给节点都贴上标签

部署 Portainer

为了方便观察和管理,这里用了 portainer
在 Master 主机上,放置 docker-compose.yml
运行 docker-compose up -d ,打开 http://xxx.xxx.xx.xxx:9000 进行配置

新建一个内网使用

docker默认网段 10.* , 然后本机如果是 10.*,则 docker 里 IP 可能会和咱内网冲突,导致无法访问到内网其他设备。 为了更方便管理,于是新建一个空闲网段
之后在docker-compose.yml 里面加入改网段就好了

Docker Stack 的启动

这里用到 metowolf/docker-lemp
放在 Master 机器上
同样,我也不知道这个是不是正确的食用方法,稍微改改
(此处 /var/www 放在 /home 是因为机器上分区就给 /home 挂了个较大容量的分区,不知道怎么想的(小声
(同时 /etc/php-fpm 就直接栽到 /etc 文件夹,避免其他人上来不知道丢哪了
输入
给 role 为 web 的两个节点分配任务
注:这么分配完了以后,由于 nginx.conf 写的是请求 php-fpm:9000 ,php-fpm 此时有两个host,所以nginx会选择性地去请求这两个其中的一个
注注:这里不用分配 80 和 443 端口,nginx 和 haproxy 的沟通通过 swarm 网络,将 haproxy 和 nginx 放在同一个 swarm 网络即可
然后到此时我感觉我 swarm 的用法是不是搞错了(小声嘀咕
 

部署Haproxy

在 Master 主机上,放置 docker-compose.yml
haproxy 服务器上
注意 用证书要把两个证书合并
可以在控制台运行
合并证书。

配置 Nginx 进行自我缓存(不建议)

参考资料:https://juejin.im/post/5af38e0c518825670c45ef6e (作者:我是leon)
本来是可以用 HaProxy + Vanish 来搭建缓存服务器的,闲太麻烦就直接用 nginx 搞了(
在 nginx.conf 中添加以下设置
(这里为了能够外部调用删除缓存写在 PHP 和 nginx 的公共目录下
 

部署 Syncthing

注意:此处不能按照此方法用swarm分配任务,或者你在 docker-compose 单独写两个 services 也行,并且将两个 services 分别分配到不同的端口,否则连接到 Syncthing 控制台时将会产生混乱。
原因:这里分配完端口后,会向 swarm 网络的所有节点打开端口,然后在任意节点上尝试连接该端口就会自动转发到对应的节点上。
为了让两台 Web 服务器的文件同步,同时也方便查看,这里使用 syncthing
先给所有服务器创建 /etc/syncthing 文件夹
我本来是想用 swarm 派的,结果发现创建完了以后,一台服务器的syncthing GUI总是喜欢去连接一下另一台,另一台总是喜欢去连接一下这台,瞎搞
编辑 docker-compose.yml
 

安装WordPress

配置 nginx, 先把 原来的 https 证书搬过来,换上
解析 网站根目录至 /var/www/wordpress
虽然物理主机上网站根目录的 /home/www 目录下, 但 docker 里的逻辑卷于 /var/www/
 

配置 nfs

此处配置 nfs 以便文件同步(?)
 

rsync 同步

(注:如果上面 Syncthing 不好用的话那还是用这个吧(
主服务器 以及 从服务器文件
 

数据库服务器允许新ip访问

如果是通过更换 ip 的方式迁移数据库这一步就不需要了
 

时间同步

 
关闭所有 debug 信息
配置好 nginx 把域名解析到新服务器ip应该问题不大了。

乱七八糟的问题

ailed to chown socket at step GROUP: No such process

解决方法:
添加docker用户组
 

Haproxy dns 解析问题

notion image
这里理论上是不应该出现的,出现这个问题先去看一下 开始 / 对 Swarm 主机进行初始化 这里是否配置正确
先进容器试试能不能 ping 通nginx,如果不能,关掉防火墙。
也有可能是 haproxy 版本问题,好像 ≤ 1.6 是没有 dns 解析功能的。
还是无法解决右转 Google
 
 
技术分享
  • 开发
  • 工具
  • Docker
  • 计算机网络原理实验三──三层交换机基本配置使用 Python 登录校园网的一次探索
    • GitTalk
    Catalog