1. 规划网络拓扑图
2. 准备机器,配置ip和软件安装
1.准备5台centos7.9.2009的虚拟机
2.根据网络拓扑图配置ip地址(注意网络通信)
3. 开启nfs服务
- 在NFS虚拟机上下载NFS服务
[root@localhost ~] yum install nfs-utils -y
- 开启NFS服务并设置开机启动
[root@localhost ~] service nfs-server start
Redirecting to /bin/systemctl start nfs-server.service
[root@localhost ~] systemctl enable nfs-server
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
- 建立需要挂载的目录并且授权
[root@localhost ~] mkdir /web
[root@localhost ~] chmod 777 /web
[root@localhost ~] ll -d /web
drwxrwxrwx. 2 root root 6 8月 17 15:27 /web
4.更改配置文件,挂载文件夹
[root@localhost ~] cat /etc/exports
/web 192.168.174.0/24(rw,all_squash,sync)
[root@localhost ~] mount 192.168.174.128:/web /web
让客户机开机的时候自动挂载nfs共享的文件夹
[root@localhost~ web]# echo "mount 192.168.80.13:/web /web" >>/etc/rc.local
(docker集群都挂载以保证数据一致)
说明: /etc/exports是nfs默认的配置文件
说明:各项权限的说明:
rw:可读写
ro: 只读
no_root_squash:对root用户不压制,如果客户端以root用户写入,在服务端都映射为服务端的root用户
root_squash: nfs服务:默认情况使用的是相反参数root_squash,如果客户端是用户root操作,会被压制成nobody用户
all_squash: 不管客户端的使用nfs的用户是谁,都会压制成nobody用户
insecure: 允许从客户端过来的非授权访问
sync: 数据同步写入到内存和硬盘
async: 数据先写入内存,不直接写入到硬盘
anonuid: 指定uid的值,此uid必须存在于/etc/passwd中 --》 anonymous
anongid:指定gid的值
[root@localhost ~]# exportfs -rv
/web 192.168.174.0/24(rw,all_squash,sync)
[root@NFS-SERVER web]
说明:完成设置后,使用exportfs实用程序有选择地导出目录,而无需重新启动NFS服务
说明:exportfs的参数:
-r: Reexport all directories: 重新导出所有目录
-v: verbose,输出详情
[root@localhost ~b] exportfs -v
/web 192.168.174.0/24(rw,all_squash,sync)
4. 安装启动docker swarm集群
- 修改主机名
192.168.174.128 主机上执行
[root@manager1 ~] hostnamectl set-hostname manager1
192.168.174.131 主机上执行
[root@node2 ~] hostnamectl set-hostname node2
192.168.174.129 主机上执行
[root@node3 ~] hostnamectl set-hostname node3
- 配置hosts文件(可配置可不配置)
[root@manager1 ~] cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.174.128 manager1
192.168.174.131 node2
192.168.31.129 node3
使用scp复制到node主机
[root@manager1 ~] scp /etc/hosts root@192.168.174.131:/etc/hosts
[root@manager1 ~] scp /etc/hosts root@192.168.174.129:/etc/hosts
- 设置防火墙
关闭三台机器上的防火墙。如果开启防火墙,则需要在所有节点的防火墙上依次放行2377/tcp(管理端口)、7946/udp(节点间通信端口)、4789/udp(overlay 网络端口)端口。
[root@manager1 ~] systemctl disable firewalld.service
[root@manager1 ~] systemctl stop firewalld.service
- 安装启动docker(命令依次使用)
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docke
- 创建启动swarm服务
创建swarm(在manager1上)
[root@manager1 ~] docker swarm init --advertise-addr 192.168.174.128
Swarm initialized: current node (g8hyq7b24dsfy93s6l9mx3c6g) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-5y27v1oaiwrb9jvedcv9hssfxnqjw4mubjkd8vwwmyqdsaumbl-2gy1wvaraly12bko6hhe4qcy1 192.168.174.128:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
在node2,和node3上输入
docker swarm join --token SWMTKN-1-5y27v1oaiwrb9jvedcv9hssfxnqjw4mubjkd8vwwmyqdsaumbl-2gy1wvaraly12bko6hhe4qcy1 192.168.174.128:2377
创建网络
[root@manager1] docker network create -d overlay nginx_net
kuq50xm3jchwus2a39c00oz2o
使用swarm批量创建容器(同时创建卷并且挂载/web)
注意端口不要被占用
[root@manager1]docker service create -d \
--name nfs-service \
--mount 'type=volume,source=nfsvolume,target=/usr/share/nginx/html,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/web,"volume-opt=o=addr=192.168.174.136,rw,nfsvers=4,async"' \
--replicas 5 \
-p 80:80 \
nginx:latest
实现的功能:
‘type=volume,source=nfsvolume,target=/usr/share/nginx/html,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/web,“volume-opt=o=addr=192.168.174.136,rw,nfsvers=4,async”’
自动在整个swarm集群的所有的节点(worker和manager)上创建一个卷叫nfsvolume 挂载到192.168.174.136的/web目录下,挂载选项:rw,nfsvers=4,async
5. 配置最前面的负载均衡器
nginx负载均衡器里的配置
upstream mydownload {
server 192.168.174.128 weight=1;
server 192.168.174.131 weight=1;
server 192.168.174.129 weight=1;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://myweb1;
}