赞
踩
Hello,大家好,我是留乘船,本篇博客是我系统的整理了有关Docker跨主机互连技术中的自定义网桥实现容器互连和Fannel网络技术实现互连操作。主要包括两个部分,认识Flannel和实际运用fannel的操作部分。
Flannel 是 CoreOS 团队针对 Kubernetes 设计的一个网络规划服务,让集群中的不同节点主机创建的Docker 容器能够获得“同属一个内网”且“不重复的”IP 地址,并让属于不同节点上的容器能够直接通过内网IP 通信。
Flannel 实质上是一种覆盖网络(overlay network),也就是将 TCP 数据包装在另一种网络包里面进行
路由转发和通信,目前已经支持 UDP、VxLAN、AWSVPC 和 GCE 路由等数据转发方式。
-Flannel 为每个 host 分配一个 subnet,容器从这个 subnet 中分配 IP,这些 IP 可以在 host 间路由,容器
间无需使用 nat 和端口映射即可实现跨主机通信。
默认的节点间数据通信方式是 UDP 转发,此时的网络数据包流向如图所示
(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 网卡
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)、在 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 节点上进行测试
这时我们看到两个不同节点上的容器之间成功实现互联。
(1) 安装 etcd
(2) 编辑配置文件/etc/etcd/etcd.conf
编辑配置文件/etc/etcd/etcd.conf,使客户端 200250229-node2 可以访问。
(3) 启动 etcd 服务
(4) 查看 etcd 服务进程
etcd 客户端连接工具 etcdctl 的应用。
查看 etcd 成员列表:
使用 etcdctl 连接 ectd 数据库:
查看 etcd 版本:
etcdctl 命令使用帮助
(1) 安装 Flannel
(2) 将 flannel 软件包中的 mk-docker-opts.sh 复制到/usr/bin/中
(3) 配置 flannel 网络
添加 flannel 网络配置信息到 etcd(一个键值对)
(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 启动
(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 服务
(1) 在主控端再次查看 etcd 中的数据
(2) 查看 docker0 虚拟网桥及 flannel.1 网卡信息
docker0 的 IP 是 10.16.11.1/24,flannel.1 网络是 10.16.11.0/32。
flannel.1 网卡的地址和 etcd 存储的地址一样,至此,被控端 flannel 网络配置完成
(1) 在主控端 200250229-node1 主机上利用 busybox 镜像生成容器,并测试与被控端 200250229-node2 主机 上容器的连通性
(2) 在被控端 200250229-node2 主机上利用 busybox 镜像生成容器,并测试与主控端 200250229-node1 主机 上容器的连通性
这样我们就可以实现在不同主机的容器之间实现互相通信。
最后,如果这篇博客对你有用的话,给个小赞足以,谢谢你的耐心阅读!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。