打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
flannel安装与配置
容器间内部通信
bridge模式
host模式
自定义网络
Container模式
None模式
跨主机通信
Docker默认的网络环境下,单台主机上的Docker容器可以通过docker0网桥直接通信,而不同主机上的Docker容器之间只能通过在主机上做端口映射进行通信。
这种端口映射方式对很多集群应用来说极不方便。 如果能让Docker容器之间直接使用自己的IP地址进行通信,会解决很多问题。
按实现原理可分别直接路由方式、桥接方式(如pipework)、Overlay隧道方式(如flannel、ovs+gre)等。
直接路由
Flannel
Flannel实质上是一种覆盖网络(overlay network),即表示运行在一个网上的网(应用层网络),并不依靠ip地址来传递消息, 而是采用一种映射机制,把ip地址和identifiers做映射来资源定位。
也就是将TCP数据包装在另一种网络包里面进行路由转发和通信, 目前已经支持UDP、VxLAN、AWS VPC和GCE路由等数据转发方式。
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的变化。
环境搭建
主机ip环境要求
CentOS01192.168.23.131etcd,docker,flannel
CentOS02192.168.23.132etcd,docker,flannel
docker安装与配置
etcd安装与集群搭建
ETCD版本问题:
当重新启动 执行 etcdctl member list 列出所有集群节点信息时 报错了
原因:
ETCD3.4版本中,ETCDCTL_API=3和etcd --enable-v2=false成为了默认配置。
flannel操作etcd使用的是v2的API,而kubernetes操作etcd使用的v3的API
为了兼容flannel,将默认开启v2版本,故配置文件中还要设置:
1.修改系统环境变量
vi /etc/profile
2.将指定etcdctl命令的版本为v2的加进去
export ETCDCTL_API=2
3.刷新系统环境
source /etc/profile
注:etcdctl2和etcdctl3是不兼容的,两者的api参数也不一样,最关键的是“v2/v3的数据是不互通的”
api 2 使用方法
ETCDCTL_API=2 etcdctl set key value
ETCDCTL_API=2 etcdctl ls /
ETCDCTL_API=2 etcdctl del / --prefix
api 3 使用方法
ETCDCTL_API=3 etcdctl put key value
ETCDCTL_API=3 etcdctl get /
ETCDCTL_API=3 etcdctl del / --prefix
ETCD中保存网络信息
使用v2版的set(而非put)命令向ETCD中保存flannel覆盖网络信息
ETCDCTL_API=2 etcdctl \ --endpoints "http://192.168.23.131:2379,http://192.168.23.132: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段的子网掩码的长度,默认值也是24
SubnetMin: 用于指定最小能够分配的ip段
SudbnetMax: 用于指定最大能够分配的ip段,在上面的示例中,表示每个宿主机可以分配一个24位掩码长度的子网,可以分配的子网从10.0.1.0/24到10.0.20.0/24,也就意味着在这个网 段中,最多只能有20台宿主机
Backend: 用于指定数据包以什么方式转发,默认为udp模式, 这里使用的是vxlan模式.因为为vxlan比起预设的udp性能相对好一些
注:flannel访问etcd时使用的key默认为:/coreos.com/network,可修改,但必须重新配置flanneld.conf的参数etcd-prefix,例如-etcd-prefix=/zking.com/network
flannel安装与配置
下载或上传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
systemctl daemon-reload && systemctl restart flanneld
验证flannel网络
ifconfig
如果看到flannel.1网卡的地址和etcd中存储的地址一样,这样flannel网络配置完成
docker配置
在各个节点安装好Docker,然后更改Docker的启动参数,使其能够使用flannel进行IP分配,以及网络通讯。
查看flannel分配的网络参数(在Flannel运行之后,会生成一个环境变量文件,包含了当前主机要使用flannel通讯的相关参数)
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网卡网段中
测试flannel
下载centos镜像,因为此镜像中其它软件及命令均有安装
docker run -it --name=centos centos bash
依次查看集群内容器的flannel.1网络IP
cat /etc/hosts
docker inspect bridge
从不同宿主机容器到其他宿主机容器
ping -c3 192.168.23.132
ping -c3 10.0.20.2
解决flannel下容器无法跨主机互通问题
经测试,发现是防火墙的问题,关闭防火墙后问题解决,但作为服务的防火墙是不能关闭的,如何解决呢。 这是由于linux还有底层的iptables,所以在node上分别执行:
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
iptables -L -n
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
flannel原理简析及安装 | 运维之美
一分钟看懂Docker的网络模式和跨主机通信
Kubernetes在CentOS7下二进制文件离线安装
docker kubernetes dashboard安装部署详细介绍
Docker学习笔记——Flannel介绍
容器云平台网络架构设计及优化
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服