目录
④.当需要与其他主机上的容器进行通信时,查找etcd数据库,找到目的容器的子网所对应的outip(目的宿主机的IP);
⑤.将原始数据包封装在VXLAN或UDP数据包中,IP层以outip为目的IP进行封装;
⑦.VXLAN或UDP数据包到达目的宿主机解封装,解出原始数据包,最终到达目的容器。
1. 使集群中的不同Node主机创建的Docker容器都具有全集群唯一的虚拟IP地址。
2. 建立一个覆盖网络(overlay network),通过这个覆盖网络,将数据包原封不动的传递到目标容器。覆盖网络是建立在另一个网络之上并由其基础设施支持的虚拟网络。覆盖网络通过将
一个分组封装在另一个分组内来将网络服务与底层基础设施分离。在将封装的数据包转发到端点后,将其解封装。
3. 创建一个新的虚拟网卡flannel0接收docker网桥的数据,通过维护路由表,对接收到的数据进行封包和转发(vxlan)。
4. etcd保证了所有node上flanned所看到的配置是一致的。同时每个node上的flanned监听etcd上的数据变化,实时感知集群中node的变化。
1.docker安装与配置(Docker.概述与安装_m0_54546762的博客-CSDN博客)
2.etcd安装与集群搭建(微服务自动化.etcd集群搭建_m0_54546762的博客-CSDN博客)
1.使用v2版的set(而非put)命令向ETCD中保存flannel覆盖网络信息
2.Network: 用于指定Flannel地址池, 整个overlay(覆盖)网络为10.0.0.0/16网段.
3.SubnetLen: 用于指定分配给单个宿主机的docker0的ip段的子网掩码的长度,默认值也是24
6.Backend: 用于指定数据包以什么方式转发,默认为udp模式, 这里使用的是vxlan模式.因为为vxlan比起预设的udp性能相对好一些
一.容器间内部通信
1.bridge模式
2.host模式
3.自定义网络
4.Container模式
5.None模式
二.跨主机通信
1.直接路由
2.Flannel
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的变化。
四.环境搭建
1.docker安装与配置(Docker.概述与安装_m0_54546762的博客-CSDN博客)
2.etcd安装与集群搭建(微服务自动化.etcd集群搭建_m0_54546762的博客-CSDN博客)
3.ETCD版本问题
vi / etc / profile
export ETCDCTL_API=2 # 指定etcdctl命令的版本为v2
source /etc/profile
etcdctl2和etcdctl3是不兼容的,两者的api参数也不一样,最关键的是“v2/v3的数据是不互通的”
api 2 使用方法
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
五.ETCD中保存网络信息
1.使用v2版的set(而非put)命令向ETCD中保存flannel覆盖网络信息
ETCDCTL_API = 2 etcdctl \-- endpoints "http://192.168.208.137:2379,http://192.168.208.139: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"}}'
2.Network: 用于指定Flannel地址池, 整个overlay(覆盖)网络为10.0.0.0/16网段.
3.SubnetLen: 用于指定分配给单个宿主机的docker0的ip段的子网掩码的长度,默认值也是24
4.SubnetMin: 用于指定最小能够分配的ip段
5.SudbnetMax: 用于指定最大能够分配的ip段,在上面的示例中,表示每个宿主机可以分配一个24位掩码长度的子网,可以分配的子网从10.0.1.0/24到10.0.20.0/24,也就意味着在这个网段中,最多只能有20台宿主机
6.Backend: 用于指定数据包以什么方式转发,默认为udp模式, 这里使用的是vxlan模式.因为为vxlan比起预设的udp性能相对好一些
flannel访问etcd时使用的key默认为:/coreos.com/network,可修改,但必须重新配置flanneld.conf的参数etcd-prefix,例如-etcd-prefix=/zy.com/network
六.flannel安装与配置
下载或上传flannel安装包
mkdir - p / opt / flannel
解压到安装目录
tar xzf flannel - v0 . 11.0 - linux - amd64 . tar . gz - C / opt / flannel
查看解压后文件
cd / opt / flannel && ls
flanneld 为主要的执行文件sh 脚本用于生成 Docker 启动参数
为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.208.137:2379,http://192.168.208.139:2379 \
--etcd-prefix=/coreos.com/network \
--iface=ens33 \
--ip-masq
Restart=on-failure
Type=notify
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
systemctl daemon-reload && systemctl restart flanneld
验证flannel网络
ifconfig
如果看到flannel.1网卡的地址和etcd中存储的地址一样,这样flannel网络配置完成
七.docker配置
cat / run / flannel / subnet . env
创建Docker运行参数(使用flannel提供的脚本将subnet.env转写成Docker启动参数)
/ opt / flannel / mk - docker - opts . sh - d / run / flannel / docker_opts . env - c
创建好的启动参数位于 /run/flannel/docker_opts.env 文件中 , 可使用 cat 命令查看cat /run/flannel/docker_opts.env
修改Docker启动参数
vim /lib/systemd/system/docker.service
下面是docker.service要修改的地方
[Service] 节点中指定启动参数所在的文件位置 ( 这个配置是新增的 )EnvironmentFile=/run/flannel/docker_opts.env在原有 ExecStart 后面添加 $DOCKER_OPTS修改前 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock修改后 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock $DOCKER_OPTS
重新加载systemd配置,并重启Docker
systemctl daemon - reload && systemctl restart docker && systemctl status docker
查看是否应用成功
ifconfig
观察docker0的网卡ip地址已经处于flannel网卡网段中
下载centos镜像,因为此镜像中其它软件及命令均有安装
docker run -it --name=centos centos bash
依次查看集群内容器的flannel.1网络IP
cat / etc / hosts
docker inspect bridge
从不同宿主机容器到其他宿主机容器
ping - c3 192.168 . 208.139
ping -c3 10.0.16.2
解决flannel下容器无法跨主机互通问题
经测试 , 发现是防火墙的问题 , 关闭防火墙后问题解决 , 但作为服务的防火墙是不能关闭的 , 如何解决呢。这是由于 linux 还有底层的 iptables, 所以在 node 上分别执行 :
iptables - P INPUT ACCEPTiptables - P FORWARD ACCEPTiptables - Fiptables - L - n