(0). 环境准备

宿主IP 容器网段 主机名称
10.211.55.100 172.17.0.1/24 master
10.211.55.101 172.17.0.1/24 node-1
10.211.55.102 172.17.0.1/24 node-2

(1). 前期准备工作

# 所有机器关闭防火墙
$ systemctl stop firewalld
$ systemctl disable firewalld

# 所有机器关闭selinux
$ sed -i 's/enforcing/disabled/' /etc/selinux/config 
$ setenforce 0

# 开启数据包转发功能
$ echo "1" > /proc/sys/net/ipv4/ip_forward

(2). Etcd集群搭建

“Etcd集群搭建”

# 查看集群成员列表
[root@master ~]# etcdctl  member list
65efecf6e9a81d9c: name=etcd-0 peerURLs=http://10.211.55.100:2380 clientURLs=http://10.211.55.100:2379,http://127.0.0.1:2379 isLeader=true
b175d3aa415c26ed: name=etcd-1 peerURLs=http://10.211.55.101:2380 clientURLs=http://10.211.55.101:2379,http://127.0.0.1:2379 isLeader=false
c1f2844c0614a5d1: name=etcd-2 peerURLs=http://10.211.55.102:2380 clientURLs=http://10.211.55.102:2379,http://127.0.0.1:2379 isLeader=false

# 查看集群状态
[root@master ~]# etcdctl cluster-health
member 65efecf6e9a81d9c is healthy: got healthy result from http://10.211.55.100:2379
member b175d3aa415c26ed is healthy: got healthy result from http://10.211.55.101:2379
member c1f2844c0614a5d1 is healthy: got healthy result from http://10.211.55.102:2379
cluster is healthy

# 查看是否有遗留数据
[root@master ~]# etcdctl ls /

# 清除遗留数据
# 可递归删除一个目录
# [root@master ~]# etcdctl rm -f /docker

(3). 安装Flannel

# 三台机器都要安装flannel
$ yum  -y install  flannel

(4). 配置Flannel配置文件

# flannel安装后,会创建一个配置文件(/etc/sysconfig/flanneld)
# 默认的ETCD URL是:http://127.0.0.1:2379
# 我这里不用配置,因为我本地有开启etcd
[root@node-2 system]# cat /etc/sysconfig/flanneld
	# Flanneld configuration options
	# etcd url location.  Point this to the server where etcd runs
	
	# ETCD的URL
	FLANNEL_ETCD_ENDPOINTS="http://127.0.0.1:2379"
	# etcd config key.  This is the configuration key that flannel queries
	# For address range assignment
	
	# Flannel在ETCD中的KEY前缀
	FLANNEL_ETCD_PREFIX="/atomic.io/network"
	
	# Any additional options that you want to pass
	#FLANNEL_OPTIONS=""

(5). 在ETCD中创建Flannel需要的配置文件

以下内容是往etcd创建配置文件,所以,仅需要在任意一台宿主机上执行就可以了.

# 创建flannel配置文件
[root@node-2 ~]# cat flannel-config.json
{
  "Network": "172.20.0.0/16",
  "SubnetMin": "172.20.10.0",
  "SubnetMax": "172.20.254.0",
  "Backend": {
    "Type":"vxlan"
  }
}

# 应用配置到etcd
[root@node-2 ~]# etcdctl set /atomic.io/network/config < flannel-config.json
{
  "Network": "172.20.0.0/16",
  "SubnetMin": "172.20.10.0",
  "SubnetMax": "172.20.254.0",
  "Backend": {
    "Type":"vxlan"
  }
}


# 检查配置文件是否已经成功
[root@node-2 ~]# etcdctl get /atomic.io/network/config
{
  "Network": "172.20.0.0/16",
  "SubnetMin": "172.20.10.0",
  "SubnetMax": "172.20.254.0",
  "Backend": {
    "Type":"vxlan"
  }
}

(6). 启动Flannel

# 三台宿主机器都要执行
$ systemctl  start flanneld

(7). 检查宿主机虚拟网卡(flannel.1)

# master
[root@master ~]# ip addr |grep flannel.1
13: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default
    inet 172.20.109.0/32 scope global flannel.1

# node-1
[root@node-1 ~]# ip addr |grep flannel.1
13: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default
    inet 172.20.106.0/32 scope global flannel.1

# node-2
[root@node-2 ~]# ip addr |grep flannel.1
13: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default
    inet 172.20.11.0/32 scope global flannel.1

(8). 检查宿主机上:/run/flannel/subnet.env

# master
[root@master ~]# cat /run/flannel/subnet.env
FLANNEL_NETWORK=172.20.0.0/16
FLANNEL_SUBNET=172.20.109.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=false

# node-1
[root@node-1 ~]# cat /run/flannel/subnet.env
FLANNEL_NETWORK=172.20.0.0/16
FLANNEL_SUBNET=172.20.106.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=false

# node-2
[root@node-2 ~]# cat /run/flannel/subnet.env
FLANNEL_NETWORK=172.20.0.0/16
FLANNEL_SUBNET=172.20.11.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=false

(9). 配置Docker环境变量(DOCKER_OPTS)

# 三台机器要都执行
# 该命令会在宿主机上创建:/run/docker_opts.env
$ /usr/libexec/flannel/mk-docker-opts.sh -c


# /run/docker_opts.env 实际就是配置DOCKER_OPTS
# bip会改变宿主机上docker0的网卡信息
# [root@node-2 ~]# cat /run/docker_opts.env
# DOCKER_OPTS=" --bip=172.20.11.1/24 --ip-masq=true --mtu=1450"

(10). 配置docker启动服务(/lib/systemd/system/docker.service)

三台机器都要进行配置,这一步:是让上一步生成的环境变量与docker绑定.

$ vi  /lib/systemd/system/docker.service
# 1. 在ExecStart变量前面,添加环境变量文件
EnvironmentFile=/run/docker_opts.env
# 2. 在启动命令中添加环境变量
ExecStart=/usr/bin/dockerd  $DOCKER_OPTS 

(11). 重启docker

$ systemctl daemon-reload
$ systemctl restart docker

(12). 检查docker0网卡信息

检查下docker0是否应用了环境变量的配置(/run/docker_opts.env)
即IP按照环境变量的配置生效了.

# master
[root@master ~]# ip addr
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:19:fa:e4:7a brd ff:ff:ff:ff:ff:ff
    inet 172.20.109.1/24 brd 172.20.109.255 scope global docker0
       valid_lft forever preferred_lft forever
13: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default
    link/ether 12:35:e1:43:87:af brd ff:ff:ff:ff:ff:ff
    inet 172.20.109.0/32 scope global flannel.1
	
# nod-1
[root@node-1 ~]# ip addr
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:09:b2:6c:1c brd ff:ff:ff:ff:ff:ff
    inet 172.20.106.1/24 brd 172.20.106.255 scope global docker0
       valid_lft forever preferred_lft forever
13: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default
    link/ether 06:c2:9a:d0:10:52 brd ff:ff:ff:ff:ff:ff
    inet 172.20.106.0/32 scope global flannel.1

# node-2
[root@node-2 ~]# ip addr
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:45:c8:77:a8 brd ff:ff:ff:ff:ff:ff
    inet 172.20.11.1/24 brd 172.20.11.255 scope global docker0
13: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default
    link/ether 16:89:d9:b5:af:b5 brd ff:ff:ff:ff:ff:ff
    inet 172.20.11.0/32 scope global flannel.1

(13). 创建容器

# master节点创建容器
[root@master ~]# docker run -d -it  --rm  --name linux_1 busybox:latest
3b99cc32b39a46f9ce9cc6dffc41343b002610c8f3dd8256900d566d74310826

# node-1节点创建容器
[root@node-1 ~]# docker run -d -it  --rm  --name linux_2 busybox:latest
d48800d863caddbf3d8ed53399ee1f21e27d3b7580408df5238ff829dda0a71d

# node-2节点创建容器
[root@node-2 ~]# docker run -d -it  --rm  --name linux_3 busybox:latest
e26d5aa87cda354b8af5c3a66ee4591b978a9282f6ba5853bd24a66199a20a80

(14). 进入容器内部查看容器IP

# 在master节hok进入容器内部
[root@master ~]# docker exec -it linux_1 sh
# 查看容器内部的IP地址
/ # ip addr
7: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue
    link/ether 02:42:ac:14:11:02 brd ff:ff:ff:ff:ff:ff
    inet 172.20.17.2/24 brd 172.20.17.255 scope global eth0
       valid_lft forever preferred_lft forever

# 在node-1节hok进入容器内部
[root@node-1 ~]# docker exec -it linux_2 sh
# 查看容器内部的IP地址
/ # ip addr
7: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue
    link/ether 02:42:ac:14:60:02 brd ff:ff:ff:ff:ff:ff
    inet 172.20.96.2/24 brd 172.20.96.255 scope global eth0
       valid_lft forever preferred_lft forever

# 在node-2节hok进入容器内部
[root@node-2 ~]# docker exec -it linux_3 sh
# 查看容器内部的IP地址
/ # ip addr
7: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue
    link/ether 02:42:ac:14:13:02 brd ff:ff:ff:ff:ff:ff
    inet 172.20.19.2/24 brd 172.20.19.255 scope global eth0
       valid_lft forever preferred_lft forever

(15). 容器内部互相ping

# 在master节点的linux_1容器内部测试,ping其它服务器(linux_2/linux_3)
# linux_2
/ # ping 172.20.96.2
PING 172.20.96.2 (172.20.96.2): 56 data bytes
64 bytes from 172.20.96.2: seq=0 ttl=62 time=0.618 ms

# linux_3
/ # ping 172.20.19.2
PING 172.20.19.2 (172.20.19.2): 56 data bytes
64 bytes from 172.20.19.2: seq=2 ttl=62 time=0.534 ms

# 测试ping域名,发现不能访问.
# 应该要自建DNS服务器了
/ # ping linux_1
ping: bad address 'linux_1'
/ # ping linux_2
ping: bad address 'linux_2'
/ # ping linux_3
ping: bad address 'linux_3'