用Weave Net 打开跨主机容器互联大门 | 社区征文
近期针对多台机器之间Docker容器网络互通进行了研究,发现多台机器同网段Docker 容器互通需要划分网段并配置iptables路由转发才可通信,不同网段亦如此,而通过新增容器发现配置维护工作更多,思考于此,有没有三方插件可以帮助我们做这个事情呢?
通过Docker官网、Kubernetes应用场景发现Weave Net,遂对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的介绍:
https://github.com/boltdb/bolt
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 DNS
原理: ip route add
ping能访问到
telnet端口也可以访问到
weave connect $NEW_HOST
weave forget $DECOMMISSIONED_HOST
命令使用场景:防止对等方在与该主机的连接丢失后重新连接到该主机,并可用于从网络中以管理方式删除任何已退役的对等方
weave launch --resume
再次启动保留之前的连接
weave stop
weave reset
eval $(weave env --restore)
eval $(weave env )
seed
这种方式目前出来的网络不可达
consensus
deferred(推迟)
wait(等待)
achieved(已达成)
observer
预研总结
到此,整个Weave Net的预研内容基本结束,Weave Net功能很强大,可以在多台机器之间充当着虚拟网络交换机的作用,管理多台机器的整个网络,实现了跨主机容器互联。
下一章,我将从Weave Net的源码去分析Weave Net内部的细节,敬请期待。