当前位置: 首页 > news >正文

(八)Docker网络跨主机通讯vxlan和vlan

基于OpenvSwitch实现跨主机通信:

环境描述:

计算机名称IP

Docker01

eth0:192.168.130.128/24

eth1:172.16.100.10/24

docker0:172.17.0.1/24(默认)



Docker02

eth0:192.168.130.129/24

eth1:172.16.100.20/24

docker0:172.17.0.1/24(默认)




安装OpenvSwitch

检查内核文件

1
2
ll  /lib/modules/ ` uname  -r` /build
ll -d  /usr/src/kernels/ `un

wKioL1k7ihaQddQoAAEYnHXBN_c407.png

下载openvswitch源码包并制作RPM包

1
2
3
4
5
6
7
mkdir  -p  /root/rpmbuild/SOURCES
cd  /root/rpmbuild/SOURCES
wget http: //openvswitch .org /releases/openvswitch-2 .5.2. tar .gz
tar  -xzf openvswitch-2.5.2. tar .gz
sed  's/openvswitch-kmod, //g'  openvswitch-2.5.2 /rhel/openvswitch .spec > openvswitch-2.5.2 /rhel/openvswitch_no_kmod .spec
cd  /root
rpmbuild -bb --nocheck . /rpmbuild/SOURCES/openvswitch-2 .5.2 /rhel/openvswitch_no_kmod .spec

制作好的RPM安装包在/root/rpmbuild/RPMS/x86_64目录下

wKioL1k7jMihAlZfAAC97V1P9aQ653.png

在2台机器上都安装

1
yum -y localinstall . /openvswitch-2 .5.2-1.x86_64.rpm

wKiom1k860nRAqLFAAFFmndTXNM230.png

启动服务和查看服务状态

1
2
systemctl start openvswitch
systemctl status openvswitch

wKiom1k87n-DI2vsAARkprLSAas844.png

注意:需要关闭SELinux和防火墙。

为什么要在用户家目录下建立一个叫做rpmbuild的目录?

1
rpmbuild --showrc |  grep  topdir

wKioL1li2H6jje6bAABX0Muxp8E048.jpg

上图可以看到rpmbuild是制作RPM包默认的工作目录,在每个用户家目录下,这个目录通常没有,需要自己建立,这些信息是通过一个叫做%_topdir的宏变量定义的,虽然你可以修改但是官方推荐不要直接修改,而是在用户家目录下建立一个隐藏文件

1
2
3
touch  .rpmmacros
#定义目录
%_topdir    PATH

在%_topdir目录下通常有以下6个目录:

目录说明宏名称
BUILD编译RPM包时的临时目录%_buildir
BUILDROOT编译后乘车的软件临时安装目录%_buildrootdir
RPMS最终生成的可安装RPM包存放目录%_rpmdir
SOURCES所有源代码和补丁文件存放目录%_sourcedir
SPECS存放SPECS文件的目录,很重要%_specdir
SRPMS
软件最终的RPM源码个数存放路径%_srcrpmdir


openvswitch核心组件及常用命令说明

组件说明
ovs-vswitchdOVS守护进程是OVS核心组件,实现交换功能和Linux内核模块协同完成基于流的交换。它和上层的controller通信遵从OPENFLOW协议,它与ovsdb-server通信使用OVSDB协议,它和内核模块通过netlink通信,它支持多个独立的datapath(网桥),通过更改flow table实现了绑定和VLAN等功能。
ovsdb-serverOVS轻量级的数据库服务器,用于整个OVS的配置信息,包括接口,交换内容,VLAN 等等。ovs-vswitchd 根据数据库中的配置信息工作。它于 manager 和 ovs-vswitchd 交换信息使用了OVSDB(JSON-RPC)的方式
ovsdb-client
ovsdb-tool
ovs-docker
ovs-dpctl一个工具,用来配置交换机内核模块,可以控制转发规则
ovs-vsctl主要是获取或者更改ovs-vswitchd的配置信息,此工具操作的时候会更新ovsdb-server中的数据库
ovsdmmonitorGUI工具来显示ovsdb-server中数据信息。(Ubuntu下是可以使用apt-get安装,可以远程获取OVS数据库和OpenFlow的流表)
ovs-controller一个简单的OpenFlow控制器
ovs-ofctl
用来控制OVS作为OpenFlow交换机工作时候的流表内容
ovs-pki
OpenFlow交换机创建和管理公钥框架
ovs-tcpdundump
tcpdump的补丁,解析OpenFlow的消息
ovs-appctl主要是向OVS守护进程发送命令的,一般用不上。 a utility that sends commands to running Open vSwitch daemons (ovs-vswitchd)


命令说明
ovs-vsctl add-br [BRNAME]创建名为BRNAME的网桥
ovs-vsctl list-br显示所有网桥
ovs-vsctl add-port [BRNAME] [NIC1] [NIC2]关联网络接口(NIC,可以是物理的也可以是虚拟的)到名为BRNAME的网桥。一个物理网卡作为网桥的一部分是无法再拥有IP的,你想象一下Hyper-V宿主机,创建虚拟网卡(其实这个网卡就是虚拟交换机上的一个接口)之后,你原来的物理网卡是不是没有IP了,而原来的IP就跑到那个虚拟网卡上了,但是你仍然可以通过那个IP访问宿主机。所以你一旦把一个物理网卡绑定到一个网桥,你就需要去掉原来网卡的IP,然后给那个和网桥同名的虚拟网卡配置上原来的IP。只不过在hyper-v中是自动完成的,你只需要指定基于那个网卡来创建虚拟交换机,其余的创建交换机、把物理网卡绑定到虚拟交换机、把原来物理网卡IP移植到虚拟网卡上。在Linux中你需要手动做这些步骤。你可以绑定多个网卡到网桥,但要注意广播风暴,解决办法就是开启生成树协议。
ovs-vsctl set bridge [BRNAME] stp_enable=true|false关闭或开启指定网桥的STP功能,也就是生成树功能
ovs-vsctl del-port [BRNAME] [NIC]解除物理网卡与网桥的绑定
ovs-vsctl add-bond [BRNDNAME] [NIC1] [NIC2] 多网卡绑定,然后和指定网桥绑定,这样可以提高带宽,而且不会产生广播风暴。
ovs-vsctl del-br [BRNAME] 删除一个名为BRNAME的网桥,如果这个网桥不存在则会有错误提示。那么你可以加上--if-exists参数。
ovs-vsctl list-ports [BRNAME]列出在名为BRNAME上绑定的接口
ovs-vsctl port-to-br [NIC] 列出所有挂到该物理网卡上的网桥
ovs-vsctl show查看网桥绑定的接口
ovs-ofctl show BRNAME
查看指定网桥内部状态


实验目标:

前提:如果你没有额外的为容器分配IP的工具则建议你使用docker默认产生的网桥也就是docker0,并且通过修改配置文件,增加--dip参数来设置不同主机上的docker0网桥IP,因为毕竟默认都是一样的。但如果使用这种方式,那么你的网络结构设置将会受到一定限制,不过对于中小企业来说已经够用了。如果你有其他分配IP机制,那么完全可以不用默认的docker0网桥而是通过openvswitch来新建功能更加强大的网桥。

比如你可以选修ovs+valn的方式,在宿主机上建立OVS网桥,把一个物理网口变成trunk口,允许所有VLAN或者指定VALN通过,容器获取的就是你物理网络中的不同VLAN的地址,当然你外部需要有一个DHCP服务器,不过你最多也只能使用4096个VLAN,对于中等规模的互联网公司也足够了,但是对于大型互联网公司或者公有云则有IP就有很大限制,通常会使用NVGRE或Vxlan等隧道技术。


拓扑如下:

虽然拓扑结构是3台,但我的环境中只有2台容器宿主机这个是为了说明三台是怎样的一个结构。道理是一样的。

wKioL1ll057R0wgLAAU1kScKDw4659.jpg

下面是在Docker01服务器上执行:

注意:要先关闭两台主机的防火墙

1
2
systemctl stop firewalld
systemctl disable firewalld

还要设置允许IPV4转发

1
2
3
4
#临时生效
sysctl -a net.ipv4.ip_forward = 1
#永久生效在下面的文件中添加 net.ipv4.ip_forward = 1
vim  /usr/lib/sysctl .d /50-default .conf


网桥设置

我在这里修改默认网桥的IP地址范围,当然你也可以新建一个,然后使用新建的网桥。修改daemon.json文件,其实fixed-cidr可以省略,修改完重启docker服务

下面是配置文件

wKiom1lq5puiuTEBAABwTMf7jqQ544.png

下面是docker0的IP

wKiom1lq5r_SbSpHAAEXrKQG5QU726.png

默认bridge的网络设置

wKioL1lq5tiC0MeNAAIUw2BAMH0506.png

自定义docker0网桥网络


虚拟交换机设置

1
ovs-vsctl add-br ovsBridge0

wKioL1lrGmDR0M1wAAA4RVkLcts384.jpg

建立到对端也就是docker02服务器的隧道

1
ovs-vsctl add-port ovsBridge0 vxlan0 --  set  Interface vxlan0  type =vxlan options:remote_ip=172.16.100.30

wKioL1lrGprhJplJAABcSJEhSmA601.jpg

默认docker0网桥设置

把新建立的ovsBridge0网桥绑定到docker0网桥上

1
brctl addif docker0 ovsBridge0

wKiom1lrGs6TO6w7AAAq_VXvty4228.jpg

添加路由

添加大段的路由,我们容器的IP地址段是10.0.1.0/24,我们添加的路由是16位掩码的

1
ip route add 10.0.0.0 /16  dev docker0

wKiom1lrGx_iNOu-AABf3miN4UU883.jpg

下面是在Docker02服务器上执行:

执行和docker01服务器相同的操作

1
2
3
4
5
vs-vsctl add-br ovsBridge0
ovs-vsctl add-port ovsBridge0 vxlan0 --  set  Interface vxlan0  type =vxlan options:remote_ip=172.16.100.20
brctl addif docker0 ovsBridge0 
ovs-vsctl show
ip route add 10.0.0.0 /16  dev docker0


启用ovs网桥:

两边服务器都设置好后,就该启用ovsBridge0网桥,默认该我们建立的ovsBridge0网桥是DOWN状态的,不过执行了下面的命令它的状态也不是UP,而是UNKNOWN的状态。但是你不执行则肯定不通

1
ip link  set  dev ovsBridge0 up

wKiom1lrIN6TEM9UAAEJHcax2Cc063.jpg


测试:

wKiom1lrHROTgW8zAABgB1hPwOU871.jpgwKioL1lrHSbDOTk9AAEed7unnAg423.jpg

从docker02主机的容器上PING

wKioL1lrHXPQ6AIBAADCqprSWEU601.jpg


基于Vlan的夸主机通讯:

计算机名称IP

Docker01

eth0:192.168.130.128/24

eth1:172.16.10.1/24

docker0:172.17.0.1/24(默认)



Docker02

eth0:192.168.130.129/24

eth1:172.16.20.1/24

docker0:172.17.0.1/24(默认)




拓扑如下:

wKiom1ll1D7SRIxQAAS6cDMh0Js520.jpg

忽略上面的实验,重新开始。同样需要关闭防火墙和开启IPV4转发。

实验目标:

让容器获得和物理机同样网段的IP地址通过外部的路由设备通常是三层交换机来实现路由。每个物理服务器上可以跑多少个容器取决于你的子网划分,我们这里每台物理机都是一个网段容器与物理机处在同一网段,能有多少可用IP取决于你的子网划分。因为环境中没有三层交换机所以使用Windows Server 2008 R2的路由和远程访问实现路由功能。另外在这个环境中忽略主机上的192的地址。你只需要关注172的那个地址即可。


在Docker01上执行:

首先修改docker配置文件

修改后重启docker服务

wKiom1lrNa7CghGXAAAuUU1te1U753.jpg

意思是默认的docker0的IP是172.16.10.1,容器的IP是从这个网段划分,但是容器的网关地址则是172.16.10.254,这个地址是三层交换机上配置的,我这个环境中是Windows Server 2008 R2上的一个网卡的地址。

wKioL1lrNnawtgxnAACquo0EzqQ104.jpg

去掉物理网卡eth1的IP地址

这个网卡的地址是172段的也就是真实IP,这时候我们要去掉这个IP地址,物理网卡将作为一个docker0网桥的一个端口而且网桥地址就是物理IP,所以物理网卡没有必要再使用IP。

1
ifconfig  eth1 0

wKioL1lrNtDxZBDYAABbByI4XrU648.jpg

绑定eth1网卡到docker0网桥

这样做的原因是在网桥上添加一个物理端口

1
brctl addif docker0 eth1

wKiom1lrN1WB6X_bAABHYXWYUws248.jpg

设置路由

先删除默认路由因为需要把路由指向三层交换机我这里是WIN2K8R2机器,所以要删除原有的路由然后添加一条新的路由

1
route del default gw 0.0.0.0

添加默认路由

1
route add -net 0.0.0.0 gw 172.16.10.254

wKioL1lrOLahe18KAAC_N-OwxBI201.jpg

在Docker02上执行:

在该机器上做同样的操作,不过IP要进行更换。

修改配置文件

wKiom1lrOWCRY5kiAAAmO5aOPBI923.jpg

1
2
3
4
ifconfig  eth1 0
brctl addif docker0 eth1
route del default gw 0.0.0.0
route add -net 0.0.0.0 gw 172.16.20.254

wKiom1lrOdbT1_LAAABG7ERZWgA981.jpg

配置Windows服务器:

wKioL1lrOoDAlca1AABgftQDGm0828.jpg

安装路由和远程访问过程略,很简单默认安装就好。

配置路由和远程访问:

wKiom1lrOuHTYpcgAACLNO7DjXE465.jpg

wKioL1lrO0vR2f_GAADGxOEA8d8126.jpg

wKioL1lrO0zC3fT2AACDezP165E585.jpg

wKiom1lrO0zisEMRAACKmrYuSm8870.jpg

wKiom1lrO02gJth5AACg0ZVWsco104.jpg

到这里就配置好了

测试:

宿主机测试

wKiom1lrO6nxJci5AACeBf4LKJI483.jpg

容器测试--从docker01上的容器PING在docker02上的容器

wKioL1lrPKyj9va-AAE4jIm-W1M556.jpg

容器测试--从docker02上的容器PING在docker01上的容器

wKiom1lrPK3wpMtgAADjk1lqlQI480.jpg

我这里没有配置DNS所以到不了外网,你可以在docker配置文件中指定DNS服务器







      本文转自linuxjavachen  51CTO博客,原文链接:http://blog.51cto.com/littledevil/1946741,如需转载请自行联系原作者





相关文章:

  • 全栈测试实战:用Jest测试Vue+Koa全栈应用
  • 实战部署MySQL用户认证的Postfix邮件系统(2)
  • arcgis api for flex 高级主题(二) 自定义控件的开发
  • Table Dragger - 简单的 JS 拖放排序表格插件
  • 算法数据结构复习[单链表]
  • Openstack Swift 原理、架构与 API 介绍
  • RHEL5+postfix+mysql+extmai(源代码)续
  • 超级网管员——网络设备
  • linux RTC 驱动模型分析【转】
  • 互连网拒绝色情,该不该拒绝庸俗?
  • 5种方法让你成为php开发高手!
  • jQuery 使用收集
  • Chrome 63 Beta新特性介绍
  • AIX 5.3 安装 Oracle 10g R2(64)
  • 项目经理成长日记(3)——给自己的定位
  • 【刷算法】从上往下打印二叉树
  • dva中组件的懒加载
  • ES学习笔记(12)--Symbol
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • JS学习笔记——闭包
  • PHP的Ev教程三(Periodic watcher)
  • Rancher-k8s加速安装文档
  • React的组件模式
  • Sass 快速入门教程
  • spring学习第二天
  • vue2.0项目引入element-ui
  • 测试如何在敏捷团队中工作?
  • 读懂package.json -- 依赖管理
  • 番外篇1:在Windows环境下安装JDK
  • 给新手的新浪微博 SDK 集成教程【一】
  • 今年的LC3大会没了?
  • 前端技术周刊 2019-01-14:客户端存储
  • 小李飞刀:SQL题目刷起来!
  • 赢得Docker挑战最佳实践
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 再谈express与koa的对比
  • 终端用户监控:真实用户监控还是模拟监控?
  • 【干货分享】dos命令大全
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • # Panda3d 碰撞检测系统介绍
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (七)c52学习之旅-中断
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (译)计算距离、方位和更多经纬度之间的点
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • .NET 4.0中使用内存映射文件实现进程通讯