docker 跨主机互连技术看这篇就够

docker 跨主机互连技术

博客导读:

Hello,大家好,我是留乘船,本篇博客是我系统的整理了有关Docker跨主机互连技术中的自定义网桥实现容器互连和Fannel网络技术实现互连操作。主要包括两个部分,认识Flannel和实际运用fannel的操作部分。

认识flannel

1.Flannel简述

Flannel 是 CoreOS 团队针对 Kubernetes 设计的一个网络规划服务,让集群中的不同节点主机创建的Docker 容器能够获得“同属一个内网”且“不重复的”IP 地址,并让属于不同节点上的容器能够直接通过内网IP 通信。

必须了解的Flannel知识
  • Flannel 是一种基于 overlay 网络的跨主机容器网络解决方案,也就是将 TCP 数据包封装在另一种网络
    包里面进行路由转发和通信。
  • Flannel 是 CoreOS 开发,专门用于 docker 多机互联的一个工具,让集群中的不同节点主机创建的容器
    都具有全集群唯一的虚拟 IP 地址。
  • Flannel 使用 Go 语言编写

2.Flannel工作原理

Flannel 实质上是一种覆盖网络(overlay network),也就是将 TCP 数据包装在另一种网络包里面进行
路由转发和通信,目前已经支持 UDP、VxLAN、AWSVPC 和 GCE 路由等数据转发方式。

-Flannel 为每个 host 分配一个 subnet,容器从这个 subnet 中分配 IP,这些 IP 可以在 host 间路由,容器
间无需使用 nat 和端口映射即可实现跨主机通信。

  • 每个 subnet 都是从一个更大的 IP 池中划分的,flannel 会在每个主机上运行一个叫 flanneld 的 agent,
    其职责就是从池子中分配 subnet。
  • Flannel 使用 etcd 存放网络配置、已分配的 subnet、host 的 IP 等信息。
  • Flannel 数据包在主机间转发是由 backend 实现的,目前已经支持 UDP、VxLAN、host-gw、AWSVPC 和
    GCE 路由等多种 backend。

3.Flannel网络结构

在这里插入图片描述

4.Flannel数据转发流程

默认的节点间数据通信方式是 UDP 转发,此时的网络数据包流向如图所示
在这里插入图片描述

Flannel数据转发说明
  • 数据从源容器中发出后,经由所在主机的 docker0 虚拟网卡转发到 flannel0 虚拟网卡,这是个 P2P 的
    虚拟网卡,flanneld 服务监听在网卡的另外一端
  • Flannel 通过 Etcd 服务维护了一张节点间的路由表,把原来的报文 UDP 封装一层,通过配置的 iface 发
    送出去。
  • 源主机 flanneld 服务将原本的数据 UDP 封装后,根据自己的路由表投递给目的节点的 flanneld 服务,
    数据到达以后被解包,然后直接进入目的节点的 flannel0 虚拟网卡,然后被转发到目的主机的 docker0
    虚拟网卡,最后就像本机容器通信一样由 docker0 路由到达目标容器。
    至此,整个数据包的传递就完成了。
常用问题解答

(1).UDP 封装是怎么回事?
在 UDP 的数据内容部分其实是另一个 ICMP(也就是 ping 命令)的数据包。原始数据是在起始节点的
flannel 服务上进行 UDP 封装的,投递到目的节点后就被另一端的 flannel 服务还原成了原始的数据包,跨
主机的 Docker 服务都感觉不到这个过程的存在.
(2).为什么每个节点上的Docker会使用到不同的IP地址段
这个事情看起来很诡异,其实是因为 flannel 通过 Etcd 分配了每个节点可用的 IP 地址段后,修改了
Docker 的启动参数,从而限制了所在节点容器获得的 IP 范围。这个 IP 范围是由 flannel 自动分配的,由
flannel 通过保存在 Etcd 服务中的记录确保它们不会重复。
(3).为什么在发送节点上的数据会从 docker0 路由到 flannel0 虚拟网卡,在目的节点会从 flannel0 路由到
docker0 虚拟网卡?

例如,现在有一个数据包要从 IP 为 172.19.18.2 的容器发送到 IP 为 172.19.44.2 的容器。根据数据发送
节点的路由表,它只与 172.19.0.0/16 匹配这条记录匹配,因此数据从 docker0 出来以后就被投递到了
flannel0。同理,在目标节点由于投递的地址是一个容器,因此目的地址一定会落在 docker0 对应的
172.19.44.0/24 这个记录上,自然的被投递到了 docker0 网卡

5.Docker Network网络子命令

docker network 命令用于管理网络。可以使用 docker network 的子命令创建、列出、检查、删除、连接
和断开网络
语法格式:docker network COMMAND
常用的Docker网络子命令

子命令说明
docker network connect将容器连接到网络。
docker network create创建新的 Docker 网络。默认情况下,在 Windows 上会采用 NAT 驱动,在 Linux 上会采用 Bridge 驱动。可以使用-d 参数指定驱动(网络类型)
docker network disconnect断开容器的网络。
docker network inspect提供 Docker 网络的详细配置信息。
docker network ls用于列出运行在本地 Docker 主机上的全部网络。
docker network prune删除 Docker 主机上全部未使用的网络。
docker network rm删除 Docker 主机上指定网络

实际运用操作

一、.利用自定义网桥实现容器互连

1、创建自定义网桥

(1)、在 200250229-node1 节点上创建自定义网桥及容器。
在这里插入图片描述
查看自定义网桥详细信息。
在这里插入图片描述
(2)、在 200250229-node1 节点上建立容器,并设置容器的 IP 地址为 172.101.0.101/24
在这里插入图片描述
利用 ip address 命令查看容器的 IP 地址为 172.101.0.101。
并测试 node1-busybox 容器与 200250229-node1 节点的连通性。
在这里插入图片描述
显示结果表明和 200250229-node1 节点是连通的。
(3)、在 200250229-node2 节点上创建自定义网桥,为其分配网段 172.102.0.0/24
在这里插入图片描述
在这里插入图片描述
显示结果表明和 200250229-node2 节点是连通的。
测试 200250229-node2 节点上的 node2-busybox 容器与 200250229-node1 节点上的 node1-busybox 容器 与是否可以连通。
在 200250229-node1 节点上进行测试:
在这里插入图片描述
此时,node1-busybox 容器和 node2-busybox 容器无法连通。

(5)、在 200250229-node1 节点和 200250229-node2 节点上配置路由表和 iptable 规则。

在 200250229-node1 节点上执行以下命令:
在这里插入图片描述
在 200250229-node2 节点上执行以下命令:
在这里插入图片描述
(6)、再次测试 200250229-node1 节点上的 node1-busybox 容200250229-node2 节点上的 node2-busybox 容器与是否可以连通。
在 200250229-node1 节点上进行测试
在这里插入图片描述
这时我们看到两个不同节点上的容器之间成功实现互联。

二、定义Flannel网络实现容器互联

1.主控端 Etcd 安装配置

(1) 安装 etcd
在这里插入图片描述
(2) 编辑配置文件/etc/etcd/etcd.conf
编辑配置文件/etc/etcd/etcd.conf,使客户端 200250229-node2 可以访问。
在这里插入图片描述
(3) 启动 etcd 服务
在这里插入图片描述
(4) 查看 etcd 服务进程
在这里插入图片描述
etcd 客户端连接工具 etcdctl 的应用。
查看 etcd 成员列表:
在这里插入图片描述
使用 etcdctl 连接 ectd 数据库:
在这里插入图片描述
查看 etcd 版本:
在这里插入图片描述
etcdctl 命令使用帮助
在这里插入图片描述
在这里插入图片描述

2. 主控端 Flannel 安装配置

(1) 安装 Flannel
在这里插入图片描述
(2) 将 flannel 软件包中的 mk-docker-opts.sh 复制到/usr/bin/中
在这里插入图片描述
(3) 配置 flannel 网络
添加 flannel 网络配置信息到 etcd(一个键值对)
在这里插入图片描述

  • Network:用于指定 Flannel 地址池
  • SubnetLen:用于指定分配给单个宿主机的 docker0 的 ip 段的子网掩码的长度
  • SubnetMin:用于指定最小能够分配的 IP 段
  • SudbnetMax:用于指定最大能够分配的 IP 段,上面的示例表示每个宿主机可以分配一个 24 位 掩码长度的子网,可以分配的子网从 10.16.1.0/24 到 10.16.20.0/24,也就意味着在这个网段中, 最多只能有 20 台宿主机
  • Backend:用于指定数据包以什么方式转发,默认为 udp 模式,host-gw 模式性能最好,但不能 跨宿主机网络
  • CoreOS 是基于 Linux 内核的云原生发行版,作为一个容器操作系统,CoreOS 提供运行现代基础 架构堆栈所需的功能,包括容器运行所需要的基础功能环境以及一系列内建的服务发现和共享
    配置的工具。
  • CoreOS 附带有两个容器运行时(例如 Docker 和 Rocket),它们可以在每个节点上自动配置。其 中,etcd 作为 CoreOS 的一个分布式键值缓存服务器,它被 Kubernetes,Cloud Foundry 等许多项 目使用,可以使用 etcd 进行简单的服务发现,等等。
    (4) 获取 flannel 网络配置信息
    在这里插入图片描述
    (5) 配置 flanneld 文件
    在这里插入图片描述
    改为 flannel 配置的网络“/coreos.com/network”。
    (6) 启动 flanneld 服务
    在这里插入图片描述
    (7) 查看 flannel.1 网卡信息
    在这里插入图片描述
    (8) 查看 flannel 服务进程
    在这里插入图片描述
    (9) 修改 Docker 启动参数
    使用 flannel 提供的脚本将/run/flannel/subnet.env 转写为 Docker 启动参数,并默认生成在 /run/docker_opts.env 中。
    在这里插入图片描述
    修改 Docker 配置文件/usr/lib/systemd/system/docker.service,把上述生成的文件加到启动项。
    在这里插入图片描述
    (10) 重新加载守护进程,重启 Docker 服务
    在这里插入图片描述
3. 验证主控端 Flannel 网络

(1) 查看 etcd 中的数据
在这里插入图片描述
(2) 查看 docker0 虚拟网桥及 flannel.1 网卡信息
在这里插入图片描述
由上述可知,flannel.1 网卡的地址和 etcd 存储的地址一样,至此,flannel 网络配置完成。
Flannel 启动过程解析:
(1) 从 etcd 中获取 network 的配置信息;
(2) 划分 subnet,并在 etcd 中进行注册;
(3) 将子网信息记录到/run/flannel/subnet.env 中;
(4) Flannel 必须先于 Docker 启动

4. 被控端 Flannel 安装配置

(1) 安装 flannel
在这里插入图片描述
(2) 将 flannel 软件包中的 mk-docker-opts.sh 复制到/usr/local/bin/中
在这里插入图片描述
(3) 配置 flanneld 文件
在这里插入图片描述
改为主控端 flannel 配置的网络“/coreos.com/network”。
(4) 启动 flanneld 服务
在这里插入图片描述
(5) 查看 flannel.1 网卡信息
在这里插入图片描述
(6) 查看 flannel 服务进程
在这里插入图片描述
(7) 修改 Docker 启动参数
使用 flannel 提供的脚将/run/flannel/subnet.env 转写为 Docker 启动参数,并默认生成在
/run/docker_opts.env 中。
在这里插入图片描述
修改 Docker 配置文件/usr/lib/systemd/system/docker.service,把上述生成的文件加到启动项
在这里插入图片描述
(8) 重新加载守护进程,重启 Docker 服务
在这里插入图片描述

5. 验证被控端 Flannel 网络

(1) 在主控端再次查看 etcd 中的数据
在这里插入图片描述
(2) 查看 docker0 虚拟网桥及 flannel.1 网卡信息
在这里插入图片描述
docker0 的 IP 是 10.16.11.1/24,flannel.1 网络是 10.16.11.0/32。
flannel.1 网卡的地址和 etcd 存储的地址一样,至此,被控端 flannel 网络配置完成

6. 验证跨主机容器互通

(1) 在主控端 200250229-node1 主机上利用 busybox 镜像生成容器,并测试与被控端 200250229-node2 主机 上容器的连通性
在这里插入图片描述
(2) 在被控端 200250229-node2 主机上利用 busybox 镜像生成容器,并测试与主控端 200250229-node1 主机 上容器的连通性
在这里插入图片描述
这样我们就可以实现在不同主机的容器之间实现互相通信。
最后,如果这篇博客对你有用的话,给个小赞足以,谢谢你的耐心阅读!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值