资讯专栏INFORMATION COLUMN

使用ovs构建docker网络,实现跨主机通信与网络隔离

Lorry_Lu / 3137人阅读

摘要:干的具体的事是容器的虚拟网卡设备划分处理的原理也非常简单,包进入到时打上,发出去时去掉,发出去的端口与包的不匹配时不处理,这便实现了二层隔离。

初始化环境
升级内核:
      rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
      rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
      yum --enablerepo=elrepo-kernel install  kernel-ml-devel kernel-ml
      awk -F" "$1=="menuentry " {print $2}" /etc/grub2.cfg
      grub2-set-default 0
      reboot
      uname -a

安装docker:
     yum install -y yum-utils
     yum-config-manager     --add-repo     https://download.docker.com/linux/centos/docker-ce.repo
     yum-config-manager --disable docker-ce-edge
     yum makecache fast
     yum install docker-ce
     service docker start


安装open vswitch:
     yum -y install wget openssl-devel gcc make python-devel openssl-devel kernel-devel graphviz kernel-debug-devel autoconf automake rpm-build redhat-rpm-config libtool python-twisted-core python-zope-interface PyQt4 desktop-file-utils libcap-ng-devel groff checkpolicy selinux-policy-devel
     adduser ovs
     su - ovs
     yum localinstall /home/ovs/rpmbuild/RPMS/x86_64/openvswitch-2.5.0-1.el7.centos.x86_64.rpm -y
     systemctl start openvswitch.service
     systemctl is-active openvswitch
     ovs-vsctl -V
     systemctl enable openvswitch

安装pipework:
     yum install git
     git clone https://github.com/jpetazzo/pipework
     cp pipework/pipework /bin

一些工具安装:
yum install bridge-utils # 如果brctl不能用

yum install net-tools # 如果route命令不能用

单节点上使用ovs vlan划分网络

启动四个容器:

docker run -itd --name con1 ubuntu:14.04 /bin/bash
docker run -itd --name con2 ubuntu:14.04 /bin/bash
docker run -itd --name con3 ubuntu:14.04 /bin/bash
docker run -itd --name con4 ubuntu:14.04 /bin/bash

创建ovs网桥并绑定端口

pipework ovs0 con1 192.168.0.1/24 @100
pipework ovs0 con2 192.168.0.2/24 @100

pipework ovs0 con3 192.168.0.3/24 @200
pipework ovs0 con4 192.168.0.4/24 @200

这样con1 和 con2是通的,con3和con4是通的,这个比较简单。pipework干的具体的事是:

ovs-vsctl add-port ovs0 [容器的虚拟网卡设备] tag=100

ovs划分vlan处理的原理也非常简单,包进入到switch时打上tag,发出去时去掉tag,发出去的端口与包的tag不匹配时不处理,这便实现了二层隔离。

access端口与trunk端口的区别是,trunk端口可接受多个tag。

跨主机vlan

准备两个主机,在host1上:

docker run -itd --name con1 ubuntu:14.04 /bin/bash
docker run -itd --name con2 ubuntu:14.04 /bin/bash
pipework ovs0 con1 192.168.0.1/24 @100
pipework ovs0 con2 192.168.0.2/24 @200

如果是单张网卡的话,把eth0桥接到switch上时会造成网络中断,所以以下几步不要通过ssh操作:
如果非得ssh去操作的话把以下命令放在一条命令中执行(用&&连接各个命令)

ovs-vsctl add-port ovs0 eth0
ifconfig ovs0 10.1.86.201 netmask 255.255.255.0   # 这里地址和掩码与eth0的配置一致
ifconfig ovs0 up
ifconfig eth0 0.0.0.0
route add default gw 10.1.86.1  # 执行之前看看eth0的gw是什么,保持一致,这样eth0就桥接到ovs0上去了。

查看switch端口:

[root@dev-86-204 ~]# ovs-vsctl show
c5ddf9e8-daac-4ed2-80f5-16e6365425fa
    Bridge "ovs0"
        Port "veth1pl41885"
            tag: 100
            Interface "veth1pl41885"
        Port "ovs0"
            Interface "ovs0"
                type: internal
        Port "eth0"
            Interface "eth0"
        Port "veth1pl41805"
            tag: 200
            Interface "veth1pl41805"
    ovs_version: "2.5.1"

在host2上:

docker run -itd --name con3 ubuntu:14.04 /bin/bash
docker run -itd --name con4 ubuntu:14.04 /bin/bash
pipework ovs0 con3 192.168.0.3/24 @100
pipework ovs0 con4 192.168.0.4/24 @200

同样要桥接eth0到ovs0上,同host1的操作,然后con1与con3可通,con2与con4可通.

GRE实现overlay网络

linux内核需要3.11以上,本尊在3.10内核上实践失败,在虚拟机中升级内核时虚拟机启动不了,CPU飙到100%,以后再试。

发现把容器直接挂ovs网桥上是可以通的

gre与下面的vxlan非常类似,只需要在添加往外连的端口时改成下面命令即可:

ovs-vsctl add-port ovs0 gre0 -- set interface gre0 type=gre options:remote_ip=172.31.244.185
Vxlan实现跨主机通信
   host1:10.1.86.203 
   ovs0
    |
    |-veth1 <-------> eth1 192.168.0.3  con3
    |
    |-vxlan1-------------+
    |                    |
                         |
    host2:10.1.86.204    |
    ovs0                 |
     |                   |
     |-vxlan1------------+
     |
     |-veth1 <--------> eth1 192.168.0.4 con4
     |

可以看到con3和con4在搭建vxlan之前是无法通信的。

在host1上:

[root@dev-86-203 ~]# docker run --name con3 -itd ubuntu:14.04 /bin/bash
[root@dev-86-203 ~]# ovs-vsctl add-br ovs0
[root@dev-86-203 ~]# pipework ovs0 con3 192.168.0.3/24   # 给容器分配地址并挂到ovs0上

[root@dev-86-203 ~]# ovs-vsctl add-port ovs0 vxlan1 -- set interface vxlan1 type=vxlan options:remote_ip=10.1.86.204 options:key=flow # 创建vxlan

[root@dev-86-203 ~]# ovs-vsctl show
5e371797-db70-451c-a0f2-d70c6d00cd05
    Bridge "ovs0"
        Port "veth1pl3342"
            Interface "veth1pl3342"
        Port "ovs0"
            Interface "ovs0"
                type: internal
        Port "vxlan1"
            Interface "vxlan1"
                type: vxlan
                options: {key=flow, remote_ip="10.1.86.204"}
    ovs_version: "2.5.1"

host2上同理:

[root@dev-86-204 ~]# docker run --name con4 -itd ubuntu:14.04 /bin/bash
[root@dev-86-204 ~]# ovs-vsctl add-br ovs0
[root@dev-86-204 ~]# pipework ovs0 con4 192.168.0.4/24   # 给容器分配地址并挂到ovs0上

[root@dev-86-204 ~]# ovs-vsctl add-port ovs0 vxlan1 -- set interface vxlan1 type=vxlan options:remote_ip=10.1.86.203 options:key=flow # 创建vxlan

[root@dev-86-204 ~]# ovs-vsctl show
c5ddf9e8-daac-4ed2-80f5-16e6365425fa
    Bridge "ovs0"
        Port "ovs0"
            Interface "ovs0"
                type: internal
        Port "veth1pl52846"
            Interface "veth1pl52846"
        Port "vxlan1"
            Interface "vxlan1"
                type: vxlan
                options: {key=flow, remote_ip="10.1.86.203"}
    ovs_version: "2.5.1"

验证:

[root@dev-86-204 ~]# docker exec con4 ping 192.168.0.3  # con4容器中ping con3的地址,可通
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.251 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.170 ms

更多问题欢迎联系我: https://github.com/fanux

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27038.html

相关文章

  • 使用ovs构建docker网络实现主机通信网络隔离

    摘要:干的具体的事是容器的虚拟网卡设备划分处理的原理也非常简单,包进入到时打上,发出去时去掉,发出去的端口与包的不匹配时不处理,这便实现了二层隔离。 初始化环境 升级内核: rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh http://www.elrepo.org/elrepo-r...

    LiuRhoRamen 评论0 收藏0
  • Docker网络

    摘要:容器与主机共享同一,共享同一套网络协议栈路由表及规则等。基本网络配置平台下,容器网络资源通过内核的机制实现隔离,不同的有各自的网络设备协议栈路由表防火墙规则等,反之,同一下的进程共享同一网络视图。设计的网络模型。 整理自《Docker进阶与实战》 Docker网络现状 为了解决容器网络性能低下、功能不足的问题,Docker启动了子项目Libnetwork。Libnetwork提出了新的...

    Euphoria 评论0 收藏0
  • 在ubuntu上部署Kubernetes管理docker集群示例

    摘要:部署环境及架构操作系统版本版本版本服务器信息在详细介绍部署集群前,先给大家展示下集群的逻辑架构。其他操作更新删除查看删除除此之外,你可以删除,如删除上的格式为服务名字,不必关心从哪个上删除了。 本文通过实际操作来演示Kubernetes的使用,因为环境有限,集群部署在本地3个ubuntu上,主要包括如下内容: 部署环境介绍,以及Kubernetes集群逻辑架构 安装部署Open v...

    BingqiChen 评论0 收藏0
  • 在ubuntu上部署Kubernetes管理docker集群示例

    摘要:部署环境及架构操作系统版本版本版本服务器信息在详细介绍部署集群前,先给大家展示下集群的逻辑架构。其他操作更新删除查看删除除此之外,你可以删除,如删除上的格式为服务名字,不必关心从哪个上删除了。 本文通过实际操作来演示Kubernetes的使用,因为环境有限,集群部署在本地3个ubuntu上,主要包括如下内容: 部署环境介绍,以及Kubernetes集群逻辑架构 安装部署Open v...

    codergarden 评论0 收藏0
  • Docker Mesos 的前生今世 | 数人云CTO肖德时@KVM分享实录

    摘要:今天小数给大家带来一篇技术正能量满满的分享来自社区线上群分享的实录,分享嘉宾是数人云肖德时。第二级调度由被称作的组件组成。它们是最小的部署单元,由统一创建调度管理。 今天小数给大家带来一篇技术正能量满满的分享——来自KVM社区线上群分享的实录,分享嘉宾是数人云CTO肖德时。 嘉宾介绍: 肖德时,数人云CTO 十五年计算机行业从业经验,曾为红帽 Engineering Service ...

    0x584a 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<