flannel默认使用8285端口作为UDP
封装报文的端口,VxLan使用8472端口
那么一条网络报文是怎么从一个容器发送到另外一个容器的呢?
veth pair
被发送到vethXXX
。vethXXX
是直接连接到虚拟交换机docker0
的,报文通过虚拟bridge docker0
发送出去。flannel0
虚拟网卡,这是一个P2P
的虚拟网卡,然后报文就被转发到监听在另一端的flanneld
。flanneld
通过etcd
维护了各个节点之间的路由表,把原来的报文UDP
封装一层,通过配置的iface
发送出去。flanneld
程序处理。flannel0
虚拟网卡。docker0
。docker0
找到连到自己的容器,把报文发送过去。环境准备
一共三台机器:一个etcd集群,三台机器安装flannel和Docker。
节点名称 | IP地址 | 软件环境 |
---|---|---|
etcd1 | 192.168.2.210 | etcd、flannel、docker |
etcd2 | 192.168.2.211 | etcd、flannel、docker |
etcd3 | 192.168.2.212 | etcd、flannel、docker |
安装etcd:参考上面的blog
1. 安装flannel
三个节点都需安装配置flannel,这里以etcd1节点为例。
flannel和etcd一样,直接从官方下载二进制执行文件就可以用了。当然,你也可以自己编译
下载 https://github.com/coreos/flannel/releases flannel flannel-v0.10.0-linux-amd64.tar.gz
2. 解压缩 tar xzf flannel-v0.10.0-linux-amd64.tar.gz -C /local/flannel
解压后主要有flanneld、mk-docker-opts.sh这两个文件,其中flanneld为主要的执行文件,sh脚本用于生成Docker启动参数。
3. 配置flannel
由于flannel
需要依赖etcd
来保证集群IP分配不冲突的问题,所以首先要在etcd
中设置 flannel
节点所使用的IP段。
etcdctl --endpoints "http://172.20.72.55:2379" \
set /coreos.com/network/config '{"NetWork":"10.0.0.0/16", "SubnetMin": "10.0.1.0", "SubnetMax": "10.0.200.0","Backend": {"Type": "vxlan"}}'
flannel预设的backend type
是udp,如果想要使用vxlan
作为backend
,可以加上backend
参数,flannel backend为vxlan比起预设的udp性能相对好一些。
在一台机器上设置后,在其他机器上都能看到
查看设置的:
etcdctl --endpoints "http://172.20.72.55:2379" get /coreos.com/network/config
etcdctl --endpoints "http://172.20.72.48:2379" get /coreos.com/network/config
4. 启动flannel
1> 命令行方式运行
flanneld --etcd-endpoints="http://172.20.72.55:2379,http://172.20.72.50:2379,http://172.20.72.48:2379" --ip-masq=true >> /local/flannel/log/flanneld.log 2>&1 &
2> 后台服务方式运行
给flannel创建一个systemd服务,方便以后管理。创建flannel配置文件:
cat <
参数为要绑定的网卡的IP地址,请根据实际情况修改。
启动flannel服务 systemctl start flanneld
flannel启动过程解析
flannel服务需要先于Docker启动。flannel服务启动时主要做了以下几步的工作:
- 从etcd中获取network的配置信息。
- 划分subnet,并在etcd中进行注册。
- 将子网信息记录到
/run/flannel/subnet.env
中。
验证flannel网络
在etcd1节点上看etcd中的内容
etcdctl --endpoints "http://172.20.72.55:2379" ls /coreos.com/network/subnets
查看flannel0的网络情况
ifconfig
flannel.1: flags=4163 mtu 1450
inet 10.0.20.0 netmask 255.255.255.255 broadcast 0.0.0.0
inet6 fe80::cce3:3aff:feaa:3eaf prefixlen 64 scopeid 0x20
ether ce:e3:3a:aa:3e:af txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 8 overruns 0 carrier 0 collisions 0
可以看到flannel0网卡的地址和etcd中存储的地址一样,这样flannel网络配置完成。
配置Docker
在各个节点安装好以后最后要更改Docker
的启动参数,使其能够使用flannel
进行IP分配,以及网络通讯。
flannel
运行后会生成一个环境变量文件,包含了当前主机要使用flannel
通讯的相关参数。
- 查看flannel分配的网络参数
-
$ cat /run/flannel/subnet.env
FLANNEL_NETWORK=10.0.0.0/16
FLANNEL_SUBNET=10.0.2.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=true
- 创建Docker运行参数
-
使用flannel提供的脚本将subnet.env转写成Docker启动参数,创建好的启动参数位于/run/docker_opts.env
文件中。
$ /opt/flannel/mk-docker-opts.sh -d /run/docker_opts.env -c
$ cat /run/docker_opts.env
DOCKER_OPTS=" --bip=10.0.2.1/24 --ip-masq=false --mtu=1472"
- 修改Docker启动参数
修改docker的启动参数,并使其启动后使用由flannel生成的配置参数,修改如下:
# 编辑 systemd service 配置文件
$ vim /lib/systemd/system/docker.service
# 在启动时增加flannel提供的启动参数
ExecStart=/usr/bin/dockerd $DOCKER_OPTS
# 指定这些启动参数所在的文件位置(这个配置是新增的,同样放在Service标签下)
EnvironmentFile=/run/docker_opts.env
然后重新加载systemd配置,并重启Docker
即可
$ systemctl daemon-reload
$ systemctl restart docker
此时可以看到docker0
的网卡ip地址已经处于flannel
网卡网段之内。
docker0: flags=4099 mtu 1500
inet 10.0.20.1 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::42:7aff:fef8:cc8f prefixlen 64 scopeid 0x20
ether 02:42:7a:f8:cc:8f txqueuelen 0 (Ethernet)
RX packets 8 bytes 536 (536.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 648 (648.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0: flags=4163 mtu 1500
inet 1.1.1.1 netmask 255.255.252.0 broadcast 172.20.75.255
inet6 fe80::f816:3eff:fe3c:edb prefixlen 64 scopeid 0x20
ether fa:16:3e:3c:0e:db txqueuelen 1000 (Ethernet)
RX packets 692165330 bytes 233649765548 (217.6 GiB)
RX errors 0 dropped 4 overruns 0 frame 0
TX packets 688307647 bytes 264840991343 (246.6 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
flannel.1: flags=4163 mtu 1450
inet 10.0.20.0 netmask 255.255.255.255 broadcast 0.0.0.0
inet6 fe80::cce3:3aff:feaa:3eaf prefixlen 64 scopeid 0x20
ether ce:e3:3a:aa:3e:af txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 8 overruns 0 carrier 0 collisions 0
到此节点etcd1的flannel安装配置完成了,其它两节点按以上方法配置完成就行了。
测试flannel
三台机器都配置好了之后,我们在三台机器上分别开启一个docker容器,测试它们的网络是否可相互联通的。
- 从容器到到跨宿主机容器
- 查看容器的ip cat /etc/hosts
-
PING 10.0.5.2 (10.0.5.2): 56 data bytes
你可能感兴趣的:(k8,docker)