目录
①、使用v2版的set命令向ETCD中保存flannel覆盖网络信息
5、 为flannel创建一个systemd服务(用于后台启动)
1、下载centos镜像,因为此镜像中其它软件及命令均有安装
一、容器间内部通信
-
bridge模式
-
host模式
-
自定义网络
-
Container模式
-
None模式
二、跨主机通信
Docker默认的网络环境下 , 单台主机上的 Docker 容器可以通过 docker0 网桥直接通信 , 而不同主机上 的Docker 容器之间只能通过在主机上做端口映射进行通信。 这种端口映射方式对很多集群应用来说极不方便。 如果能让 Docker 容器之间直接使用自己的 IP 地址进行通信 , 会解决很多问题。 按实现原理可分别直接路由方式、桥接方式( 如 pipework) 、 Overlay 隧道方式 ( 如 flannel 、 ovs+gre) 等
1、直接路由
2、Pipework
pipework是由Docker的工程师Jérôme Petazzoni开发的一个Docker网络配置工具,由200多行shell实现,方便易用。下面用三个场景来演示pipework的使用和工作原理。
3、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特点
-
使集群中的不同Node主机创建的Docker容器都具有全集群唯一的虚拟IP地址。
-
建立一个覆盖网络(overlay network),通过这个覆盖网络,将数据包原封不动的传递到目标容器。覆盖网络是建立在另一个网络之上并由其基础设施支持的虚拟网络。覆盖网络通过将
-
一个分组封装在另一个分组内来将网络服务与底层基础设施分离。在将封装的数据包转发到端点后,将其解封装。
-
创建一个新的虚拟网卡flannel0接收docker网桥的数据,通过维护路由表,对接收到的数据进行封包和转发(vxlan)。
-
etcd保证了所有node上flanned所看到的配置是一致的。同时每个node上的flanned监听etcd上的数据变化,实时感知集群中node的变化。
三、环境搭建
主机 | ip(根据主机的来) | 环境要求 |
---|---|---|
centos 7 | 192.168.232.135 | etcd,docker,flannel |
centos 7 | 192.168.232.135 | etcd,docker,flannel |
ETCD版本问题
ETCD3.4 版本中 ,ETCDCTL_API=3 和 etcd --enable-v2=false 成为了默认配置 flannel 操作 etcd 使用的是 v2 的 API, 而 kubernetes 操作 etcd 使用的 v3 的 API 为了兼容 flannel, 将默认开启 v2 版本 , 故配置文件中还要设置 :
①、修改配置文件
vi / etc / profile
export ETCDCTL_API=2 # 指定etcdctl命令的版本为v2