Docker 跨主机网络方案分析

PS:文章首发公众号,欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家。

上篇文章介绍了容器网络的单主机网络,本文将进一步介绍多主机网络,也就是跨主机的网络。总结下来,多主机网络解决方案包括但不限于以下几种:overlay、macvlan、flannel、weave、cacico 等,下面将分别一一介绍这几种网络,

PS:本文仅从原理上对几种网络进行简单的对比总结,不涉及太多的细节。

overlay

俗称隧道网络,它是基于 VxLAN 协议来将二层数据包封装到 UDP 中进行传输的,目的是扩展二层网段,因为 VLAN 使用 12bit 标记 VLAN ID,最多支持 4094 个 VLAN,这对于大型云网络会成为瓶颈,而 VxLAN ID 使用 24bit 来标记,支持多达 16777216 个二层网段,所以 VxLAN 是扩展了 VLAN,也叫做大二层网络。

overlay 网络需要一个全局的“上帝”来记录它网络中的信息,比如主机地址,子网等,这个上帝在 Docker 中是由服务发现协议来完成的,服务发现本质上是一个 key-value 数据库,要使用它,首先需要向它告知(注册)一些必要的信息(如网络中需要通信的主机),然后它就会自动去收集、同步网络的信息,同时,还会维护一个 IP 地址池,分配给主机中的容器使用。Docker 中比较有名的服务发现有 Consul、Etcd 和 ZooKeeper。overlay 网络常用 Consul。

431521-20180429195031999-972865143.png

创建 overlay 网络会创建一个 Linux bridge br0,br0 会创建两个接口,一个 veth2 作为与容器的虚拟网卡相连的 veth pair,另一个 vxlan1 负责与其他 host 建立 VxLAN 隧道,跨主机的容器就通过这个隧道来进行通信。

为了保证 overlay 网络中的容器与外网互通,Docker 会创建另一个 Linux bridge docker_gwbridge,同样,该 bridge 也存在一对 veth pair,要与外围通信的容器可以通过这对 veth pair 到达 docker_gwbridge,进而通过主机 NAT 访问外网。

macvlan

macvlan 就如它的名字一样,是一种网卡虚拟化技术,它能够将一个物理网卡虚拟出多个接口,每个接口都可以配置 MAC 地址,同样每个接口也可以配自己的 IP,每个接口就像交换机的端口一样,可以为它划分 VLAN。

macvlan 的做法其实就是将这些虚拟出来的接口与 Docker 容器直连来达到通信的目的。一个 macvlan 网络对应一个接口,不同的 macvlan 网络分配不同的子网,因此,相同的 macvlan 之间可以互相通信,不同的 macvlan 网络之间在二层上不能通信,需要借助三层的路由器才能完成通信,如下,显示的就是两个不同的 macvlan 网络之间的通信流程。

431521-20180429195117713-2028389175.png

我们用一个 Linux 主机,通过配置其路由表和 iptables,将其配成一个路由器(当然是虚拟的),就可以完成不同 macvlan 网络之间的数据交换,当然用物理路由器也是没毛病的。

flannel

flannel 网络也需要借助一个全局的上帝来同步网络信息,一般使用的是 etcd。

flannel 网络不会创建新的 bridge,而是用默认的 docker0,但创建 flannel 网络会在主机上创建一个虚拟网卡,挂在 docker0 上,用于跨主机通信。

431521-20180429195144515-388946315.png

组件方式让 flannel 多了几分灵活性,它可以使用二层的 VxLAN 隧道来封装数据包完成跨主机通信,也可以使用纯三层的方案来通信,比如 host-gw,只需修改一个配置文件就可以完成转化。

weave

weave 网络没有借助服务发现协议,也没有 macvlan 那样的虚拟化技术,只需要在不同主机上启动 weave 组件就可以完成通信。

创建 weave 网络会创建两个网桥,一个是 Linux bridge weave,一个是 datapath,也就是 OVS,weave 负责将容器加入 weave 网络中,OVS 负责将跨主机通信的数据包封装成 VxLAN 包进行隧道传输。

431521-20180429195213393-1209241662.png

calico

calico 是一个纯三层的网络,它没有创建任何的网桥,它之所以能完成跨主机的通信,是因为它记住 etcd 将网络中各网段的路由信息写进了主机中,然后创建的一对的 veth pair,一块留在容器的 network namespace 中,一块成了主机中的虚拟网卡,加入到主机路由表中,从而打通不同主机中的容器通信。

431521-20180514165940183-1171083948.png

calico 相较其他几个网络方案最大优点是它提供 policy 机制,用户可以根据自己的需求自定义 policy,一个 policy 可能对应一条 ACL,用于控制进出容器的数据包,比如我们建立了多个 calico 网络,想控制其中几个网络可以互通,其余不能互通,就可以修改 policy 的配置文件来满足要求,这种方式大大增加了网络连通和隔离的灵活性。

总结

1、除了以上的几种方案,跨主机容器网络方案还有很多,比如:Romana,Contiv 等,本文就不作过多展开了,大家感兴趣可以查阅相关资料了解。

2、跨主机的容器网络通常要为不同主机的容器维护一个 IP 池,所以大多方案需要借助第三方的服务发现方案。

3、跨主机容器网络按传输方式可以分为纯二层网络,隧道网络(大二层网络),以及纯三层网络。


我的公众号 aCloudDeveloper 分享的内容包括但不限于云计算虚拟化、容器、OpenStack、K8S、雾计算、SDN、OVS、DPDK、Linux、Python、C/C++编程技术等内容,欢迎大家关注。

431521-20180429195432742-41921015.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451768.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

26-- 转换成小写字母

文章目录1.问题描述2.代码详情1.问题描述 实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串。 示例 1: 输入: “Hello” 输出: “hello” 示例 2:…

初学duboo+zookeeper

看了很多相关资料,其实都没有自己动手试一次印象更深刻一些。找了很多教程,下工具,花了几个小时终于让程序跑起来了,下面说下步骤:1.java环境也就安装jdk,我使用的是1.7版本,jdk安装就不在这复述…

Fedora 17 Beta 版发布

Fedora团队今天发布了Fedora 17 Beta版本,这是正式版本发布前的最后一个重要的里程碑版本。据该团队介绍,正式版将在今年5月发布,将主要修复Beta版中发现的关键性bug。针对普通用户的桌面改进: 采用GNOME 3.4,提升了用…

[转] 一文弄懂神经网络中的反向传播法——BackPropagation

在看CNN和RNN的相关算法TF实现,总感觉有些细枝末节理解不到位,浮在表面。那么就一点点扣细节吧。 这个作者讲方向传播也是没谁了,666~ 原文地址:https://www.cnblogs.com/charlotte77/p/5629865.html 最近在看深度学习…

FreeBSD 8.3 发布

近日,FreeBSD开发团队放出了8.x稳定分支的8.3版本。此次发行的版本将支持amd64、i386、pc98和 sparc64等处理器类型。FreeBSD是一种类UNIX操作系统,但不是真正意义上的 UNIX 操作系统,它是由经过 BSD、386BSD 和 4.4BSD 发展而来的 Unix 的一…

28--仅仅反转字母

文章目录1.问题描述2.代码详情1.问题描述 给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。 示例 1: 输入:“ab-cd” 输出:“dc-ba” 示例 2&…

Moving Average

移动平均算法Demo #!/usr/bin/python2.7 # Fetch data from BD and analyse.import json import urllib import traceback import numpy as np # import pandas as pd import matplotlib.pyplot as plt #from scipy import statsdef fetch_raw_data(url):try:response urllib.…

【前端工程师手册】JavaScript作用域拾遗

【前端工程师手册】JavaScript作用域拾遗 昨天总结了一些作用域的知识【前端工程师手册】JavaScript之作用域,但是发表完发现忘记了一些东西,今天拾个遗。 昨天说到了JavaScript中没有块级作用域,其实在es6中是有的。 es6中的块级作用域 先举…

游戏开发中的数据表示

声明:本文内容源自腾讯游戏学院程序公开课_服务端 一、数据表示的基础 什么是数据表示? 数据是信息的载体。 数据表示是一组操作,可以描述、显示、操作信息。 数据表示的要素 IDL - 接口描述语言 IDL是用来描述软件组件接口的一种计算机语言。…

29--反转字符串

文章目录1.问题描述2.代码详情1.问题描述 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数组中…

OpenBSD 5.1 正式版发布

OpenBSD 开发团队于近日发布了 5.1 正式版。 OpenBSD是一个从NetBSD衍生出来的类Unix操作系统。项目领导人Theo de Raadt在1995年发起了OpenBSD项目,希望创造一个注重安全的操作系统,此外OpenBSD也以高品质的文件、坚持开放程式码以及严格的软件授权著名…

PowerShell变量——PowerShell三分钟(七)

有了前面的PowerShell基础,今天我们来学习一个可以极大提升PowerShell效率的用法——变量简答来说呢,变量就是在内存中的一个带有名字的盒子~~~~~你可以把所有想存放的东西都放到这个“盒子”里。然后通过名字去访问这个盒子。在访问过程中,可…

Machine Learning - Coursera week6 Evaluating a learning algorithm

Evaluating a learning algorithm 1. Design what to do next 在预测房价的学习例子,假如你已经完成了正则化线性回归,也就是最小化代价函数J的值。假如在你得到你的学习参数以后把它应用到放到一组新的房屋样本上进行测试,发现在预测房价时产…

Tiny Core Linux 4.5 发布,微型 Linux 操作系统

世界上最小的Linux桌面发行版——Tiny Core Linux 今天发布了4.5版本。Tiny Core Linux是一个基于Linux2.6版本内核,采用BusyBox、Tiny X、FLTK 和其它小型软件构筑的带图形用户界面的微型Linux操作系统。由于体积很小,大约10MB,故采用整体装…

maven的web工程打包为war并部署到服务器

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1.在maven工程上右键 --> export --> 选择WAR file --> next 2. 点击Browse... 选择导出后存放位置 3. 将工程名改为ROOT.war…

Hive笔记之严格模式(strict mode)

Hive有一个严格模式,在严格模式下会对可能产生较大查询结果的语句做限制,禁止其提交执行。 一、切换严格模式 查看当前的模式:hive> set hive.mapred.mode; hive.mapred.mode is undefined 未定义即为false,即no-strict模式。 …

Notepad++ 6.0 发布,优化了大文件加载性能

开源编辑器Notepad今天发布了最新的6.0版本。 Notepad 是一款免费的开源跨平台代码编辑器。它支持包括中文在内的多国语言,功能强大,除了可以用来制作一般的纯文字说明文件外,也可以作为代码编辑器。Notepad不仅可以实现语法高亮显示&#x…

JDK下载地址、SecureCRT中JDK安装和环境配置、SecureCRT窗口编程、linux下命令运行小程序

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 下载linux版本的JDK。java SE、java EE JDK是通用的, 32位系统选Linux x86, 64位系统选Linux x64&#xff…

HTMLTestRunner 汉化版---来源一个大神的源码(加了失败截图,用例失败重新执行 功能)...

HTMLTestRunner 汉化版 20170925 测试报告完全汉化,包括错误日志的中文处理针对selenium UI测试增加失败自动截图功能增加失败自动重试功能增加饼图统计同时兼容python2.x 和3.x20180402 表格样式优化修复部分bug增加截图组,可展示多张截图,首…

PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilder

一.问题描述&#xff1a;pom.xml导入依赖时报错 PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilder 二.解决方法&#xff1a; 1.加入ali镜像源 <repositories><repository><id>maven-ali</id><url>https://mave…