Docker 节点在 ODL 控制下的 OVS 网桥连接

来源:互联网 发布:mac共享windows文件夹 编辑:程序博客网 时间:2024/05/21 19:36

Docker 节点在 ODL 控制下的 OVS 网桥连接

成文时间
2017年2月15日

软件配置
ODL:Boron SR2
OVS:2.6.1
Docker:1.13.1

作者信息
白威挺

版权说明
本文版权归作者所有,欢迎加入讨论,转载注明出处


目录

  • Docker 节点在 ODL 控制下的 OVS 网桥连接
    • 目录
    • Docker 的安装
      • 在 Windows 上安装
      • 在 Linux 上安装
    • Container 连接 OVS
    • OVS 与 ODL 连接并下发流表
    • 使用 RESTful API 查看流表


Docker 的安装

这里分为主要的两种情况,在 Windows 系统(本文以 Windows 10 为例)上安装和在 Linux 系统(本文以 Ubuntu 为例)上安装。

在 Windows 上安装

下载 Windows 版 Docker,直接安装即可。但是要注意当前操作系统版本及 Hyper-V 特征是否启用。Docker 目前在桌面级 Windows 上只支持 Windows 10 专业版以上系统,并且需要开启 Hyper-V。详细信息参见在 Windows 上安装 Docker。

在 Windows Server 2016 上安装 Docker
请参见 MSDN 上关于该问题的专题文档。请注意,在 Windows Server 2016 上的 Docker 只支持 Windows 容器,不支持 Linux 容器。而 Windows 10 上可以安装 Linux 容器,也可以使用 Windows 容器(需要转换模式)。

在 Linux 上安装

第一步,保证在root用户权限下执行命令。

第二步,建立存储点。执行如下命令:

apt-get install -y --no-install-recommends \    apt-transport-https \    ca-certificates \    curl \    software-properties-common

第三步,添加 Docker GPG 公钥到本地。执行如下命令:

curl -fsSL https://apt.dockerproject.org/gpg | sudo apt-key add -

确认公钥是58118E89F3A912897C070ADBF76221572C52609D,然后执行添加命令:

apt-key fingerprint 58118E89F3A912897C070ADBF76221572C52609D

第四步,添加稳定版储存地址。执行如下命令:

add-apt-repository \    "deb https://apt.dockerproject.org/repo/ \    ubuntu-$(lsb_release -cs) \    main"

第五步,更新系统系统软件目录。执行如下命令:

apt-get update

第六步,安装最新版本 Docker 引擎。执行如下命令:

apt-get -y install docker-engine

第七步,确认已经安装完毕。执行命令:

docker run hello-world

安装特定版本的 Docker
先执行如下命令:

apt-cache madison docker-engine

系统将会输出一系列版本信息,选择合适的版本输入如下命令:

apt-get -y install docker-engine=<VERSION_STRING>

Container 连接 OVS

首先建立一个网桥:

ovs-vsctl add-br br0

随后启动两个 Ubuntu 14.04 容器(启动两个不同的shell):

docker run --net=none --privileged=true -it ubuntu:14.04 bash

你将会得到类似这样的shell

root@52204b2d75b4:/# 

记住返回的ID号(本例是52204b2d75b4)在返回的shell中执行如下命令:

ifconfig

应该会返回一个本地环回端口lo。在最新版的 Docker 中已经包含了 ovs-docker 工具,执行如下命令:

ovs-docker add-port br0 eth0 52204b2d75b4

52204b2d75b4添加一个eth0端口,同时将eth0连接到br0上。两个 Container 上都要执行这样的操作。再在容器中执行ifconfig命令,查看添加的eth0端口。目前eth0上没有 IP 地址,我们添加一个:

ifconfig eth0 172.66.66.1/24

另一个容器设为172.66.66.3/24。将本地br0网桥设置为172.66.66.2/24

ip addr add 172.66.66.2/24 dev br0

然后容器互ping,应该是能够ping通,这便完成了容器与 OVS 的连接。


OVS 与 ODL 连接并下发流表

首先启动 ODL:

 cd /usr/opendaylight/distribution-karaf-0.4.2-Beryllium-SR2/bin ./karaf

然后登陆 WEB 页面 http://127.0.0.1:8181/index.html,进入拓扑查看界面。默认账户密码均为 admin

将网桥 br0 连接到 ODL 控制器,执行命令

 ovs-vsctl set-controller br0 tcp:127.0.0.1:6633

然后容器互ping,发现不能ping通,因为在 OVS 连接 ODL 后就从 L2 Switch 变为了 Open Flow 交换机,在交换机内没有流表,而 Open Flow 的默认动作就是drop,必然不能互相ping通。

在 ODL 的node界面中查看node connectors,观察端口编号和 Node 编号(本例中是openflow:33868190936130),本例中两个 container 链接到br0的编号为 1 和 2 的两个端口。

下面在br0添加一条单向流表:

ovs-ofctl add-flow br0 priority=12,in_port=1,actions=output:2

现在继续容器互ping,发现不能ping通,因为无法返回消息。再添加一条单向流表:

ovs-ofctl add-flow br0 priority=12,in_port=2,actions=output:1

现在继续容器互ping,发现成功ping通。


使用 RESTful API 查看流表

在 FireFox 浏览器中安装HttpRequester。然后在url框中输入:

http://127.0.0.1:8181/restconf/operational/opendaylight-inventory:nodes/node/openflow:33868190936130/flow-node-inventory:table/0

使用GET模式,单击Submit则可以在右侧输出栏中看到目前交换机内的流表信息。在本例中如下:

{    "flow-node-inventory:table": [        {            "id": 0,            "opendaylight-flow-table-statistics:flow-table-statistics": {                "active-flows": 2,                "packets-looked-up": 80,                "packets-matched": 68            },            "flow": [                {                    "id": "#UF$TABLE*0-2",                    "idle-timeout": 0,                    "cookie": 0,                    "flags": "NO_BYT_COUNTS",                    "hard-timeout": 0,                    "instructions": {                        "instruction": [                            {                                "order": 0,                                "apply-actions": {                                    "action": [                                        {                                            "order": 0,                                            "output-action": {                                                "output-node-connector": "1",                                                "max-length": 0                                            }                                        }                                    ]                                }                            }                        ]                    },                    "opendaylight-flow-statistics:flow-statistics": {                        "duration": {                            "nanosecond": 479000000,                            "second": 1134                        },                        "byte-count": 2898,                        "packet-count": 53                    },                    "priority": 12,                    "table_id": 0,                    "match": {                        "in-port": "openflow:33868190936130:2"                    }                },                {                    "id": "#UF$TABLE*0-3",                    "idle-timeout": 0,                    "cookie": 0,                    "flags": "NO_BYT_COUNTS",                    "hard-timeout": 0,                    "instructions": {                        "instruction": [                            {                                "order": 0,                                "apply-actions": {                                    "action": [                                        {                                            "order": 0,                                            "output-action": {                                                "output-node-connector": "2",                                                "max-length": 0                                            }                                        }                                    ]                                }                            }                        ]                    },                    "opendaylight-flow-statistics:flow-statistics": {                        "duration": {                            "nanosecond": 731000000,                            "second": 1014                        },                        "byte-count": 1218,                        "packet-count": 13                    },                    "priority": 12,                    "table_id": 0,                    "match": {                        "in-port": "openflow:33868190936130:1"                    }                }            ]        }    ]}

可以发现和添加的流表信息一致。

0 0