网络术语概念

  二层交换技术:工作在OSI七层网络模型的第二层,通过MAC地址进行帧转发
三层交换技术:也称为IP交换技术,工作在OSI七层网络模型的第三层,通过IP地址进行包转发。它解决了局域网中网段规划之后,网段中子网必须依赖路由器进行管理的局面
网桥(Brideg):工作在OSI七层网络模型的第二层,根据MAC地址转发,类似于二层交换机。Linux网桥将不同的网络接口连接起来,连接的网络接口可以来自不同的局域网,网桥决定了接收的数据包是转发给同一个局域网内逐级还是别的网络上
VLAN(虚拟局域网):在物理网络(通常是路由器接口)基础上建立一个或多少逻辑子网,将一个大广播域切分成多个小的广播域。一个VLAN就是一个广播域,VLAN之间通信通过三层路由器或者交换机来完成。

  Overlay Network

覆盖网络,在基础网络上叠加一种虚拟网络技术模式,该网络中的主机通过虚拟链路连接起来
Overlay网络有以下三种实现方式:
VXLAN(Virtual Extensible Local Area Network,虚拟可扩展局域网),通过将物理服务器或虚拟机发出的数据包封装到UDP中,并使用物理网络的IP/MAC作为外层报文头进行封装,然后在IP网络上传输,到达目的地后由隧道端点解封装并将数据发送给目标物理服务器或虚拟机,扩展了大规模虚拟机网络通信。
由于VLAN Header头部限制长度是12bit,导致只能分配4095个VLAN,也就是4095个网段,在大规模虚拟网络。VXLAN标准定义Header限制长度24bit,可以支持1600万个VLAN,满足大规模虚拟机网络需求。
VXLAN有以下核心技术组成:
NVE(Network Vritual Endpoint,网络虚拟端点):实现网络虚拟化功能。报文经过NVE封装转换后,NVE间就可基于三层基础网络建立二层虚拟化网络。
VTEP(VXLAN Tunnel Endpoints,VXLAN隧道端点):封装在NVE中,用于VXLAN报文的封装和解封装。
VNI(VXLAN Network Identifier,VXLAN网络标识ID):类似于VLAN ID,用于区分VXLAN段,不同的VXLAN段不能直接二层

  

  其他两种实现方式

NVGRE(Network Virtual using Generic Routing Encapsulation,使用GRE虚拟网络):与VXLAN不同的是,NVGRE没有采用标准传输协议(TCP/UDP),而是借助通用路由封装协议(GRE)。采用24bit标识二层网络分段,与VXLAN一样可以支持1600万个虚拟网络。
STT(Stateless Transport Tunneling,无状态传输隧道):模拟TCP数据格式进行封装,改造了TCP传输机制,不维护TCP状态信息。
Overlay Network

  

  Docker主机之间容器通信解决方案

桥接宿主机网络
端口映射
Docker网络驱动
- Overlay:基于VXLAN封装实现原生Overlay网络
- Macvlan: Docker主机网卡接口逻辑上分为多个子接口,每个子接口标识一个VLAN。容器接口直接连接Docker主机网卡接口,通过路由策略转发到另一台Docker主机
第三方网络项目
隧道方案
- Flannel:支持UPD和VXLAN封装传输方式
- Weave: 支持UDP(sleeve模式)和VXLAN(优先fastdp模式)
- OpenSwitch: 支持VXLAN和GRE协议
路由方案
- CAlico: 支持BGP协议和IPIP隧道。每台宿主机作为虚拟路由,通过BGP谢谢实现不同主机容器间通信

  

  部署前提

Docker通过overlay网络驱动程序支持多主机容器网络通信。
要想使用Docker原生Overlay网络,需要满足以下任意条件:
Docker运行在Swarm模式
使用键值存储的Docker主机集群
我们这里演示第二种,需要满足以下条件:
1.集群中主机连接到键值存储,Docker支持Consul、Etcd和Zookeeper;
2.集群中主机运行一个Docker守护进程;
3.集群中主机必须具有唯一的主机名,因为键值存储使用主机名来标识集群成员;
4.集群中Linux主机内核版本3.12+,支持VXLAN数据包处理,否则可能无法通信。

  部署

  节点1 192.168.56.128 主机名 docker1 节点2 192.168.56.129主机名docker2

  查看内核版本大于3.12即可

uname -r

  安装只需要在一个节点安装即可(是一个命令直接可以使用)

wget https://releases.hashicorp.com/consul/0.9.2/consul_0.9.2_linux_amd64.zip
unzip consul_0.9.2_linux_amd64.zip
mv consul /usr/bin/consul && chmod +x /usr/bin/consul

  启动

nohup consul agent -server -bootstrap -ui -data-dir /var/lib/consul -client=192.168.56.128 -bind=192.168.56.128 &>/var/log/consul.log &

  日志跟踪

tail -f /var/log/consul.log

  

  节点配置守护进程连接consul

vi /lib/systemd/system/docker.service

  

ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --cluster-store consul://192.168.56.128:8500 --cluster-advertise 192.168.56.128:2375

  访问consul的web页面 http://192.168.56.128:8500

  重启docker 修改了配置文件需要加载一下在重启

systemctl daemon-reload
service docker restart

  修改节点2的配置

/lib/systemd/system/docker.service

  

ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --cluster-store consul://192.168.56.128:8500 --cluster-advertise 192.168.56.129:2375

  重启docker

  PS:如果节点加入到swarm模式需要删除

docker swarm leave

  

  查看

  节点2上创建overlay网络

 docker network create -d overlay multi_host

  在节点1再次创建会报错,网络已经同步了

Error response from daemon: network with name multi_host already exists

  查看网络

docker network ls

  查看网络属性信息

network inspect dc4cc9130f97

  

[
{
"Name": "multi_host",
"Id": "dc4cc9130f971707d833450e87d93433029b97fcc0541bfbf7ae15a4db8293a5",
"Created": "2018-12-21T18:22:05.983865969+08:00",
"Scope": "global",
"Driver": "overlay",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "10.0.0.0/24",
"Gateway": "10.0.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]

  测试互通

  节点1创建容器指定overlay网络

docker run -it --net=multi_host busybox

  节点2创建

  正常可以ping通 本次测试没有通

  

  Overlay工作流程

  安装查看桥接的工具

apt-get install bridge-utils

  使用命令查看

brctl show

  命名空间管理overlay网络

ln -s /var/run/docker/netns/ /var/run/netns

  启动的容器busybox不退出另外打开一个终端输入命令ip netns ls

  带-的是创建overlay网络时候创建的网络

  显示的IP和容器内是完全一样的

  

Docker多主机网络的更多相关文章

  1. docker多主机网络方案

    本文探讨Docker多主机网络的性能. 在过去的博文里,我测试过 Docker的网络 . MySQL服务器团队 提供了他们自己的结果,和我的观察是一致的. 本文里一系列的测试,想更多关注使用多主机的D ...

  2. Docker跨主机网络——overlay

    前言 在Docker网络--单host网络一文中,我为大家总结了Docker的单机网络相关知识和操作,单机网络比较容易.本文我为大家总结Docker跨主机通信相关知识.同样本文大部分内容以CloudM ...

  3. Docker多主机网络 OpenvSwitch

    一.Open vSwitch    Open vSwitch(以下简称为OVS),英文全称:OpenVirtual Switch,顾名思义,Open vSwitch就是开放虚拟交换.我们可以把他理解成 ...

  4. Docker 单主机网络

    PS:欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 当容器逐步向容器集群,容器云技术演进的时候,一个不得不面对的问题就是各 ...

  5. Docker 多主机网络总结(非常全)

    PS:文章首发公众号,欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 上篇文章介绍了容器网络的单主机网络,本文将进一步介绍多 ...

  6. Docker 跨主机网络方案分析

    PS:文章首发公众号,欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 上篇文章介绍了容器网络的单主机网络,本文将进一步介绍多 ...

  7. Docker 跨主机网络

    Docker提供两种原生的跨主机网络: Overlay  和  Macvlan libnetwork & CNM libnetwork 是 docker 容器网络库,最核心的内容是其定义的 C ...

  8. docker单主机网络

    当你安装Docker时,它会自动创建三个网络.你可以使用以下docker network ls命令列出这些网络: [root@localhost ~]# docker network ls NETWO ...

  9. Docker 跨主机网络 overlay(十六)

    目录 一.跨主机网络概述 二.准备 overlay 环境 1.环境描述 2.创建 consul 3.修改 docker 配置文件 4.准备就绪 三.创建 overlay 网络 1.在 host1 中创 ...

随机推荐

  1. 从n个元素中选择k个的所有组合(包含重复元素)

    LeetCode:Combinations这篇博客中给出了不包含重复元素求组合的5种解法.我们在这些解法的基础上修改以支持包含重复元素的情况.对于这种情况,首先肯定要对数组排序,以下不再强调 修改算法 ...

  2. ASP.NET MVC ViewBag/ViewData/TempData区别

    ViewBag/ViewData public dynamic ViewBag { get; } public ViewDataDictionary ViewData { get; set; } Vi ...

  3. 通过jarjar.jar来替换jar包名的详细介绍

    有时候我们根据一些场景 需要替换第三方jar包的包名,比如Android广告平台sdk,更换他们jar包包名的话,可以防止市场检测到有广告插件,所以,今天就介绍一下如何使用jarjar.jar工具来替 ...

  4. windows下JDK环境配置

    原文地址:http://blog.sina.com.cn/s/blog_618592ea0100oeif.html 一.JDK1.6下载 目前JDK最新版本是JDK1.6,到http://java.s ...

  5. [Android实例] Activity实例StartActivity出现NullPointer异常

    [Android实例] Activity实例StartActivity出现NullPointer异常 [android实例教程] 在Android低版本(如2.3.3)中出现如下“界面跳转”的错误: ...

  6. 升级python(linux)

    查看系统当前python版本 2: [root@wangyuelou ~]# python     Python 2.4.3 (#1, May  5 2011, 16:39:10)     [GCC ...

  7. React Native 进的第一个坑

    Bundling index.ios.js [development, non-minified, hmr disabled] 0.0% (0/1), failed. error: bundling ...

  8. java-信息安全(八)-迪菲-赫尔曼(DH)密钥交换

    概述 信息安全基本概念: DH(Diffie–Hellman key exchange,迪菲-赫尔曼密钥交换) DH 是一种安全协议,,一种确保共享KEY安全穿越不安全网络的方法,它是OAKLEY的一 ...

  9. Angular4学习笔记(十)- 组件间通信

    分类 父子组件通信 非父子组件通信 实现 父子 父子组件通信一般使用@Input和@Output即可实现,参考Angular4学习笔记(六)- Input和Output 通过Subject 代码如下: ...

  10. centos7 防火墙

    1.firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status f ...