ovs 与 docker
ovs 即 openvswitch 是一个开源虚拟交换机,支持 openflow ,具备丰富的功能。docker 是一个容器虚拟化技术,基于 Linux 容器技术(LXC),能够模拟出从用户角度是独立系统环境的容器,它主要利用了 Linux namespace 和 cgroups 实现。docker 起初在网络方面支持的不好,目前 docker 则提供了多种网络模式,其中网桥则是使用 Linux 自带的网桥实现。
作为虚拟网络的代表,docker 使用网桥可以通过 ovs 提供的脚本 ovs-docker 实现。源码很简单,主要是通过 ip link 创建 veth pair ,分别将两端添加给容器以及 ovs 网桥上,并连接上 ovs 的虚拟网桥, 以下将简单分析 ovs-docker 脚本.
通过 ovs-docker 可以用 docker 配合测试 ovs 的拓扑结构。
ovs-docker 脚本的功能
ovs-docker 只提供四个基本操作即,脚本需要主机安装 ip 工具包:
ovs-docker add-port , 给 docker 增加一个 interface
ovs-docker del-port , 删除 docker 的一个 interface
ovs-docker del-ports , 删除 docker 上的所有 interface
ovs-docker set-vlan , 设置一个 vlan
源码:
#!/bin/bash
# Copyright (C) 2014 Nicira, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Check for programs we'll need.
search_path () {
save_IFS=$IFS
IFS=:
for dir in $PATH; do
IFS=$save_IFS
if test -x "$dir/$1"; then
return 0
fi
done
IFS=$save_IFS
echo >&2 "$0: $1 not found in \$PATH, please install and try again"
exit 1
}
ovs_vsctl () {
ovs-vsctl --timeout=60 "$@"
}
create_netns_link () {
mkdir -p /var/run/netns
if [ ! -e /var/run/netns/"$PID" ]; then
ln -s /proc/"$PID"/ns/net /var/run/netns/"$PID"
trap 'delete_netns_link' 0
for signal in 1 2 3 13 14 15; do
trap 'delete_netns_link; trap - $signal; kill -$signal $$' $signal
done
fi
}
delete_netns_link () {
rm -f /var/run/netns/"$PID"
}
get_port_for_container_interface () {
CONTAINER="$1"
INTERFACE="$2"
PORT=`ovs_vsctl --data=bare --no-heading --columns=name find interface \
external_ids:container_id="$CONTAINER" \
external_ids:container_iface="$INTERFACE"`
if [ -z "$POR