ovs-docker 原理及源码简析

ovs-docker结合openvswitch(ovs)和docker,为docker容器提供虚拟网络。该脚本通过ip link创建veth pair,连接ovs网桥和容器,实现网络隔离。ovs-docker提供添加、删除端口等功能,方便在docker中测试ovs网络拓扑。源码分析涉及netns,用于网络命名空间的隔离,以及ip netns工具,用于操作虚拟网络环境。
摘要由CSDN通过智能技术生成

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
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值