近期针对多台机器之间 Docker 容器网络互通进行了研究,发现多台机器同网段 Docker 容器互通需要划分网段并配置 iptables 路由转发才可通信,不同网段亦如此,而通过新增容器发现配置维护工作更多,思考于此,有没有三方插件可以帮助我们做这个事情呢?
通过 Docker 官网、Kubernetes 应用场景发现 Weave Net,遂对 Weave Net 预研整理总结。
Weave Net 背景
团队介绍
Weaveworks,成立于 2014 年, 是 Weave Cloud(一种 SaaS)的创建者,它简化了容器和微服务的部署、监控和管理。它扩展和补充了流行的编排器,使开发人员和 DevOps 能够进行更快的部署、有洞察力的监控、可视化和网络。过去两年,一直在运行 Weave Cloud,Kubernetes、Prometheus 和 Docker 在 AWS 上进行生产。
定位: 以开发者为中心的云原生运维
解决内容
定位:跨主机容器互联-Weave 方案,其实原理是在每台机器上跑一个自己写的 Router 程序起到路由器的作用,然后在路由器之间建立一个全打通的 PC 连接,接着在这张 TCP 的连接网里面互相跑路由协议,形成一个控制平面。
Weave Net 是一个多主机容器网络方案,支持去中心化的控制平面,各个 host 上的 wRouter 间通过建立 Full Mesh 的 TCP 链接,并通过 Gossip 来同步控制信息。这种方式省去了集中式的 K/V Store,能够在一定程度上减低部署的复杂性,Weave 将其称为“data centric”,而非 RAFT 或者 Paxos 的“algorithm centric”。
数据平面上,Weave 通过 UDP 封装实现 L2 Overlay。
数据封装支持两种模式:
- 运行在 user space 的 sleeve mode:通过 pcap 设备在 Linux bridge 上截获数据包并由 wRouter 完成 UDP 封装,支持对 L2 traffic 进行加密,还支持 Partial Connection,但是性能损失明显。
- 运行在 kernal space 的 fastpath mode:即通过 OVS 的 odp 封装 VxLAN 并完成转发,wRouter 不直接参与转发,而是通过下发 odp 流表的方式控制转发,这种方式可以明显地提升吞吐量,但是不支持加密等高级功能。
开发语言
GO、shell
Weave Net 概念
网络交换机
Weave Net 创建了一个虚拟网络,可以跨多个主机连接 Docker 容器并启用它们的自动发现,借助 Weave Net,由多个容器组成的基于微服务的可移植应用程序可以在任何地方运行:一台主机、多台主机,甚至跨云提供商和数据中心。
无忧配置
Weave Net 简化了容器网络的设置
服务发现
Weave Net 通过在每个节点提供一个快速的“微 DNS”服务器来实现服务发现。您只需命名容器,一切都“正常工作”,包括跨多个同名容器的负载平衡。
无需外部集群存储
所有其他 Docker 网络插件,包括 Docker 自己的“Overlay”驱动程序,都要求在使用它们之前为 Docker 设置一个集群存储--一个中央数据库
在部分连接的网络中运行
Weave Net 可以在节点之间转发流量
织网速度快
自动选择两台主机之间的最快路径,提供接近原生的吞吐量和延迟。采用快速数据路径。
网络操作友好
在主机之间使用行业标准的 VXLAN 封装
安全的
无需 TCP 插件即可穿越防火墙
Weave Net 使用 Daniel J. Bernstein 的 NaCl 库的 Go 版本实现加密和安全性,此外,在加密快速数据路径的情况下,使用 Linux 内核的加密框架。
Weave Net 可防止对等点之间转发的流量进行注入和重放攻击
在快速数据路径的情况下,数据平面流量使用 IPsec 的 ESP 进行加密 。加密过程由 Linux 内核处理,并通过 IP 转换框架 (XFRM) 进行控制。
组播支持
完全支持多播寻址和路由
数据可以发送到一个多播地址,并将自动广播给所有接收者
NAT 穿越
工作原理
通过子网隔离技术
Weaver
本质就是一个二进制文件,主要功能是:
- 连接容器的编织桥
- 管理 IP 地址分配
- 服务 DNS 请求
- weaver-> nsenter-> weaveutil
Weave Gossip 机制
- 基于流行病传播方式的节点或进程之间信息交换的协议。
- Goosip 协议的信息传播和扩散通常需要由种子节点发起。整个传播过程可能需要一定的时间,由于不能保证某个时刻所有节点都收到消息,但是理论上最终所有节点都会收到消息,因此它是一个最终一致性协议。
- 去中心化的分布式协议
Weavedb
- 关键 IPAM 数据以 BoltDB 文件的形式保存到磁盘
保存各种 Weave Net 组件的数据,包括:
(1)在对等体之间划分 IP 分配范围
(2)为本地对等点上的容器分配地址
- BoltDb 的介绍:
BoltDB 是一个纯粹的 Go 语言版的嵌入式 key/value 的数据库。BoltDB 类似于 LMDB,这个被认为是在现代 kye/value 存储中最好的。但是又不同于 LevelDB,BoltDB 支持完全可序列化的 ACID 事务,也不同于 SQLlite,BoltDB 没有查询语句,对于用户而言,更加易用。
BoltDB 将数据保存在一个单独的内存映射的文件里。它没有 wal、线程压缩和垃圾回收;它仅仅安全地处理一个文件。
BoltDB 使用一个单独的内存映射的文件,实现一个写入时拷贝的 B+树,这能让读取更快。而且,BoltDB 的载入时间很快,特别是在从 crash 恢复的时候,因为它不需要去通过读 log(其实它压根也没有)去找到上次成功的事务,它仅仅从两个 B+树的根节点读取 ID。
分布式共识
了解提议者、接收者、侦听者
WeaveDNS 设计
定位:负载平衡、故障恢复和热交换。
每个主机都有一个服务,该服务被通知主机名和主机上容器的编织地址,与 IPAM 一样,此服务嵌入在路由器中。它绑定到主机桥以回答来自本地容器的 DNS 查询;对于它无法回答的任何问题,它会使用主机 /etc/resolv.conf 中的信息来查询“备用”服务器。
Weave net 服务包括一个 DNS 服务器,它回答来自容器的所有 DNS 查询,以及一个主机名和 IP 的内存数据库。每个节点上的数据库包含集群中每个容器的主机名和 IP 的完整副本。
对于本地域中的主机名查询(默认 weave.local),DNS 服务器将查询内存数据库。对于反向查询,我们首先查询本地数据库,如果没有找到我们查询上游服务器。对于所有其他查询,我们咨询上游服务器
对内存数据库的更新会广播到集群中的其他 DNS 服务器。内存数据库仅包含来自连接的 DNS 服务器的条目;如果 DNS 服务器从集群中分区,则属于该服务器的条目将从集群中的每个节点中删除。当分区的 DNS 服务器重新连接时,条目会在集群周围重新广播。
Weave 控制面
Weave Router 通过 TCP 构成控制面,完全分布式、没有集中控制点,对等点之间采用 Gossip 协议进行交换拓扑结构。
主要进行心跳握手和拓扑信息交换。
Weave 数据面
Weave routers 间通过对等端点见的 UDP 连接构成了 Weave network 的数据面, Weave router 将捕获的数据包封装成 UDP 报文发出去。
完全工作在内核空间,目的地址为非本地容器的数据包被内核捕获并交给用户空间的 weave 网络路由器来处理,weave 路由器通过 UDP 转发到目的主机上的 weave 路由器,并注入到目的主机的内核空间,然后交给目的容器处理。
Open vSwitch(OVS)
定位:分布式虚拟多层交换机
Open vSwitch 既可以作为在虚拟机(VM)管理程序中运行的基于软件的网络交换机运行,也可以作为专用交换硬件的控制堆栈运行;因此,它已被移植到多个虚拟化平台、交换芯片组和网络硬件加速器。Open vSwitch 是 XenServer 虚拟化平台自其 6.0 版以来的默认网络交换机,以及通过其 XAPI 管理工具栈在 Xen 云平台中的默认网络交换机。 它还支持 Xen、Linux KVM、Proxmox VE 和 VirtualBox 虚拟机管理程序,同时还提供 Hyper-V 的端口。 Open vSwitch 还被集成到各种云计算软件平台和虚拟化管理系统中,包括 OpenStack、openQRM、OpenNebula 和 oVirt。
Open vSwitch 的 Linux 内核实现在 2012 年 3 月 18 日发布的内核版本 3.3 中并入内核主线;官方 Linux 软件包可用于 Debian、Fedora、openSUSE 和 Ubuntu。 截至 2014 年 1 月,FreeBSD 和 NetBSD 实现也可用,NetBSD 的实现完全在用户空间中运行。
数据加密
AES in GCM 采用 32 位密钥、4 位盐
Weave 社区
社区强大
开源多个项目,多提供与 k8s 使用
- Cortex(监控功能)
- EKSCTL(cli 工具)
- Flux (自动化部署)
- scope(自动检测进程、容器和主机)
- wksctl(KUBERNETES 配置管理 GITOPS 方式)
博客发布
Git Star
6.2k 持续在更新
Weave Net 验证
- 同宿主机同网段虚机 ✅
- 同宿主机不同网段虚机 ✅
- 不同宿主机同一网段虚机 ✅
- 不同宿主机不同网段虚机 ✅
- 动态配置网络(weave attach) ❌
初始不配置,后续配置网络,重启不生效,没存配置
- 负载 ❌
Weave DNS
- 通过外部未运行 Weave Net 的主机直接访问 weave 的网络 ✅
原理: ip route add via
- ping 能访问到
- telnet 端口也可以访问到
- 动态添加和删除主机,用到命令: ✅
weave connect $NEW_HOST
weave forget $DECOMMISSIONED_HOST
命令使用场景:防止对等方在与该主机的连接丢失后重新连接到该主机,并可用于从网络中以管理方式删除任何已退役的对等方
weave launch --resume
再次启动保留之前的连接
weave stop
weave reset
eval $(weave env --restore)
eval $(weave env )
- 支持容器 ip 规划(三种策略) ✅
- seed
这种方式目前出来的网络不可达
- consensus
deferred(推迟)
wait(等待)
achieved(已达成)
- observer
\
预研总结
\
到此,整个 Weave Net 的预研内容基本结束,Weave Net 功能很强大,可以在多台机器之间充当着虚拟网络交换机的作用,管理多台机器的整个网络,实现了跨主机容器互联。
下一章,我将从 Weave Net 的源码去分析 Weave Net 内部的细节,敬请期待。