网络术语概念

  二层交换技术:工作在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. 微信小程序 多个视频播放器

    大致思路就是,wx:for="{{ list }}"下两个view,一个视频video,另一个封面image(客户需求,要可以自定义封面).主要控制变量是playIndex,当点击 ...

  2. :app:compileDebugJavaWithJavac

    org.gradle.initialization.ReportedException: org.gradle.internal.exceptions.LocationAwareException: ...

  3. zabbix监控k8s出现的pod error status

    配置zabbix客户端配置文件 vim /etc/zabbix/zabbix_agentd.conf 添加  Include=/etc/zabbix/zabbix_agentd.d/ #!/bin/b ...

  4. Mac MySQL 数据库配置(关系型数据库管理系统)

    前言 MySQL 关系型数据库管理系统. 1.配置准备工作 1)配置数据库准备工作 下载相关软件 mysql-5.7.21-1-macos10.13-x86_64.dmg mysql-workbenc ...

  5. 收藏清单: python测试数据生成及代码扫描最全工具列表

    Test Data manipulation 测试数据的操作和处理 faker - 生成假数据的python库 fake2db - 创建假数据库 ForgeryPy - 使用起来很简单的假数据生成库. ...

  6. python下申明式的对象关系DB映射器--Pony

    之前看到了Sails.js的waterline提供了声明式的关系型对象与DB的映射器,惊为天人,可以说是极大地提升了效率. 利用waterline的对象关系模型,用户可以直接使用javascript语 ...

  7. 深入理解Fsync

    1 介绍 数据库系统从诞生那天开始,就面对一个很棘手的问题,fsync的性能问题.组提交(group commit)就是为了解决fsync的问题.最近,遇到一个业务反映MySQL创建分区表很慢,仔细分 ...

  8. mariadb(MySql)设置远程访问权限

    [问题]mariadb(MySql)安装之后,本地连接mysql是可以的,但是远程的机器不能连接和访问. [解决]修改mysql远程连接的ip限制配置. [步骤]1.本地mysql客户端连接mysql ...

  9. 第三部分:Android 应用程序接口指南---第一节:应用程序组件---第一章1-1.Fragment

    第1-1章 Fragments 在Activity中的fragment代表的是一种行为或用户界面的一部分.你可以在activity中结合多个fragments创建一个多面板UI,并可以在多个activ ...

  10. 获取应用程序根目录物理路径(Web and Windows)

    这两个计划写一个小类库,需要在不同项目下任意调用.该类库需要对磁盘文件进行读写,所以就需要获取程序执行的磁盘路径,就简单的对获取磁盘路径的方法进行研究. 借助搜索引擎,我从网上搜罗来多种方法,都可以直 ...