一、Flannel
每个主机上安装并运行 etcd 和 flannel ;在 etcd 中规划配置所有主机的 docker0 子网范围;每个主机上的 flannel 根据 etcd 中的配置 , 为本主机的 docker0 分配子网 , 保证所有主机上的 docker0 网段不重复 , 并将结果 ( 即本主机上的 docker0 子网信息和本主机 IP 的对应关系 ) 存入etcd 库中 , 这样 etcd 库中就保存了所有主机上的 docker 子网信息和本主机 IP 的对应关系;当需要与其他主机上的容器进行通信时 , 查找 etcd 数据库 , 找到目的容器的子网所对应的 outip( 目的宿主机的 IP) ;将原始数据包封装在 VXLAN 或 UDP 数据包中 ,IP 层以 outip 为目的 IP 进行封装;由于目的 IP 是宿主机 IP, 因此路由是可达的;VXLAN 或 UDP 数据包到达目的宿主机解封装 , 解出原始数据包 , 最终到达目的容器。

Flannel特点:
1. 使集群中的不同 Node 主机创建的 Docker 容器都具有全集群唯一的虚拟 IP 地址。2. 建立一个覆盖网络 (overlay network), 通过这个覆盖网络 , 将数据包原封不动的传递到目标容器。覆盖网络是建立在另一个网络之上并由其基础设施支持的虚拟网络。覆盖网络通过将一个分组封装在另一个分组内来将网络服务与底层基础设施分离。在将封装的数据包转发到端点后 , 将其解封装。3. 创建一个新的虚拟网卡 flannel0 接收 docker 网桥的数据 , 通过维护路由表 , 对接收到的数据进行封包和转发 (vxlan) 。4. etcd 保证了所有 node 上 flanned 所看到的配置是一致的。同时每个 node 上的 flanned 监听 etcd 上的数据变化 , 实时感知集群中 node 的变化。
二、环境搭建
环境要求:etcd、docker、flannel
vi / etc / profile
1.在最后添加,指定使用v2
export ETCDCTL_API=2 # 指定etcdctl命令的版本为v2
2.更新配置文件
source /etc/profile
3. 使用api2
ETCDCTL_API = 2 etcdctl set key valueETCDCTL_API = 2 etcdctl ls /ETCDCTL_API = 2 etcdctl del / -- prefix
api 3 使用方法
ETCDCTL_API = 3 etcdctl put key valueETCDCTL_API = 3 etcdctl get /ETCDCTL_API = 3 etcdctl del / -- prefix
4.ETCD中保存网络信息
下面两个ip为不同主机对应的ip
ETCDCTL_API = 2 etcdctl \-- endpoints "http://192.168.95.110:2379,http://192.168.95.120:2379" \set / coreos . com / network / config \'{"NetWork":"10.0.0.0/16","SubnetMin": "10.0.1.0","SubnetMax": "10.0.20.0","Backend": {"Type": "vxlan"}}'
Network: 用于指定 Flannel 地址池 , 整个 overlay( 覆盖 ) 网络为 10.0.0.0/16 网段 .SubnetLen: 用于指定分配给单个宿主机的 docker0 的 ip 段的子网掩码的长度 , 默认值也是 24SubnetMin: 用于指定最小能够分配的 ip 段SudbnetMax: 用于指定最大能够分配的 ip 段 , 在上面的示例中 , 表示每个宿主机可以分配一个 24 位掩码长度的子网 , 可以分配的子网从 10.0.1.0/24 到 10.0.20.0/24, 也就意味着在这个网段中 , 最多只能有 20 台宿主机Backend: 用于指定数据包以什么方式转发 , 默认为 udp 模式 , 这里使用的是 vxlan 模式 . 因为为 vxlan 比起预设的 udp 性能相对好一些
三、flannel安装与配置
1.下载或上传flannel安装包
2.创建flannel安装目录
mkdir -p /opt/flannel
3.解压到安装目录
tar xzf flannel-v0.11.0-linux-amd64.tar.gz -C /opt/flannel
4.查看解压后文件
cd /opt/flannel && ls
5.为flannel创建一个systemd服务,用于后台启动
vim /etc/systemd/system/flanneld.service
flanneld.service 文件
[Unit]
Description=Flanneld
After=network.target
After=network-online.target
Wants=network-online.target
##1.flannel服务需要先于Docker启动,后于etcd启动
After=etcd.service
Before=docker.service
[Service]
User=root
##2.ExecStart即flanneld启动程序位置
##3.--etcd-endpoints参数为ectd集群客户端地址
##4.--iface参数为要绑定的网卡的IP地址,或是网卡名(ifconfig查看获得)请根据实际情况修改
ExecStart=/opt/flannel/flanneld \
--etcd-endpoints=http://192.168.95.110:2379,http://192.168.95.120:2379 \
--etcd-prefix=/coreos.com/network \
--iface=ens33 \
--ip-masq
Restart=on-failure
Type=notify
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
注意:ip要对应
6.刷新并重启
systemctl daemon-reload && systemctl restart flanneld
7.验证ip
ifconfig
四、docker配置
在各个节点安装好Docker,然后更改Docker的启动参数,使其能够使用flannel进行IP分配,以及网络通讯
cat / run / flannel / subnet . env
2.创建Docker运行参数(使用flannel提供的脚本将subnet.env转写成Docker启动参数)
/opt/flannel/mk-docker-opts.sh -d /run/flannel/docker_opts.env -c
3.修改Docker启动参数
vim /lib/systemd/system/docker.service
4.重新加载systemd配置,并重启Docker
systemctl daemon-reload && systemctl restart docker && systemctl status docker
5.查看是否应用成功
ifconfig
五、测试flannel
1.下载centos镜像,因为此镜像中其它软件及命令均有安装
docker run -it --name=centos centos bash
2.依次查看集群内容器的flannel.1网络IP
cat /etc/hosts
docker inspect bridge
3.从不同宿主机容器到其他宿主机容器
ping -c3 10.0.14.2
4.解决flannel下容器无法跨主机互通问题
iptables - P INPUT ACCEPTiptables - P FORWARD ACCEPTiptables - Fiptables - L - n