avatar

swarm集群搭建,打通两地网络

缘起

很久之前就想写了,一直沉迷打游戏就一直咕咕咕了emmm~

前几天测试环境被污染所以借这个机会重建一下集群顺便写一下搭建过程。


本文使用 swarmoverlay 功能搭建docker集群并打通两台不同地域服务器的网络。

环境说明

出于安全考虑, 文章内使用1.1.1.1、2.2.2.2来代替两个公网IP

操作系统 docker版本 IP地址 IDC 节点角色
centos7.4 18.06.3.ce-3.el7 1.1.1.1 阿里云 工作节点
centos7.4 18.06.3.ce-3.el7 2.2.2.2 腾讯云 管理节点

PS: centos7默认的docker版本是1.13.1, 该版本在搭建时会出现一个问题,manager节点的Status:Addr默认是127.0.0.1,使用–advertise-addr进行指定也一样,也不知道是bug还是其它原因。

准备工作

  1. 配置防火墙规则

    80/443/8080可以选择开放

1
2
3
4
5
6
7
8
9
10
systemctl start firewalld
systemctl enable firewalld
firewall-cmd --zone=public --add-port=2377/tcp --permanent
firewall-cmd --zone=public --add-port=7946/tcp --permanent
firewall-cmd --zone=public --add-port=7946/udp --permanent
firewall-cmd --zone=public --add-port=4789/udp --permanent
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload
  1. 配置安全组

    不建议使用0.0.0.0/0来开放开放安全组

    应该使用IP/32的方式来开放安全组,避免不必要的外部访问

安装docker

  1. 添加docker的yum源
1
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

​ 如果找不到yum-config-manager命令 使用yum -y install yum-utils安装就可以了

  1. 查看可安装版本
1
yum list docker-ce --showduplicates
  1. 安装docker

    这里选用 18.06.3.ce-3.el7版本安装

1
yum install -y docker-ce-18.06.3.ce-3.el7

​ 检查一下版本

1
2
3
systemctl enable docker
systemctl start docker
docker version
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@**** ~]# docker version
Client:
Version: 18.06.3-ce
API version: 1.38
Go version: go1.10.3
Git commit: d7080c1
Built: Wed Feb 20 02:26:51 2019
OS/Arch: linux/amd64
Experimental: false

Server:
Engine:
Version: 18.06.3-ce
API version: 1.38 (minimum version 1.12)
Go version: go1.10.3
Git commit: d7080c1
Built: Wed Feb 20 02:28:17 2019
OS/Arch: linux/amd64
Experimental: false

创建集群/加入集群

​ IP请自行替换!!!

2.2.2.2

1
2
3
4
5
6
7
8
9
docker swarm init --advertise-addr 2.2.2.2:2377
# 执行后得到一串token
Swarm initialized: current node (********) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join --token *********** 2.2.2.2:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

​ 接下来到worker节点执行, 加入该集群

1.1.1.1

1
2
3
docker swarm join --advertise-addr 1.1.1.1:2377 --token ****** 2.2.2.2:2377
# 执行后提示
This node joined a swarm as a worker.

​ 回到2.2.2.2 验证worker节点是否已经加入

1
2
3
4
[root@***** ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
x2oiczqocyq4o64k3be9c30v1 * manage1 Ready Active Leader 18.06.3-ce
su2j074jt8v76n4m01qycto2h worker1 Ready Active 18.06.3-ce

创建覆盖网络

该命令需要在管理节点上进行创建。

docker network create -d overlay --gateway=192.168.0.1 --subnet=192.168.0.0/16 --attachable inside

加上–attachable参数是让容器可以附加到这个网络上, 即:docker run –network 可以附加该网络上

1
2
3
4
5
6
7
8
9
[root@****** ~]# docker network create -d overlay  --gateway=192.168.0.1 --subnet=192.168.0.0/16  inside
xs9v7kh8chzuz9db16rofhgrl
[root@****** ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
7e69c8bd8e84 bridge bridge local
5d4d130a9035 host host local
elwg90xugv9p ingress overlay swarm
xs9v7kh8chzu inside overlay swarm
fc1a51e880b7 none null local

测试集群网络互通

测试镜像:registry.cn-hangzhou.aliyuncs.com/lingdun/tengine:2.3.2

1
2
docker pull registry.cn-hangzhou.aliyuncs.com/lingdun/tengine:2.3.2
docker run -it --network=inside registry.cn-hangzhou.aliyuncs.com/lingdun/tengine:2.3.2 bash

分别在worker节点和manage节点跑一个容器,

worker中tengine容器IP:192.168.0.5

manage中tengine容器IP:192.168.0.4

  1. 在192.168.0.5容器中ping 192.168.0.4

[root@497b295e1655 /]#ping 192.168.0.4
PING 192.168.0.4 (192.168.0.4) 56(84) bytes of data.
64 bytes from 192.168.0.4: icmp_seq=1 ttl=64 time=13.2 ms
64 bytes from 192.168.0.4: icmp_seq=2 ttl=64 time=13.1 ms
64 bytes from 192.168.0.4: icmp_seq=3 ttl=64 time=13.1 ms

  1. 在192.168.0.4容器中ping 192.168.0.5

[root@0ad86d9c35ba /]# ping 192.168.0.5
PING 192.168.0.5 (192.168.0.5) 56(84) bytes of data.
64 bytes from 192.168.0.5: icmp_seq=1 ttl=64 time=13.1 ms
64 bytes from 192.168.0.5: icmp_seq=2 ttl=64 time=13.0 ms
64 bytes from 192.168.0.5: icmp_seq=3 ttl=64 time=13.0 ms

现在两个地域的服务器网络已经打通了。