KVM虚拟机&openVSwitch杂记(1)

本文介绍如何在CentOS7环境下配置Open vSwitch (OVS),包括搭建OVS环境、构建RPM包、安装及配置OVS服务、创建内部通信网桥、设置虚拟机并进行跨交换机测试等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、openVSwitch(CentOS7)

master1(192.168.1.1),master2(192.168.1.2)作为运行虚拟机的计算节点,master3(10.201.106.133)作为网络节点

1、配置两个计算节点

1.1 每个计算节点准备两块网卡

KVM虚拟机&openVSwitch杂记(1)

KVM虚拟机&openVSwitch杂记(1)

KVM虚拟机&openVSwitch杂记(1)

1.2 配置网关(网络)节点,master3(192.168.1.254)

同样拥有两块网卡,一块连接内部网络,一块连接外网nat转换。

KVM虚拟机&openVSwitch杂记(1)

KVM虚拟机&openVSwitch杂记(1)

打开路由转发功能:
[root@master3 ~]# vim /etc/sysctl.conf 

net.ipv4.ip_forward = 1
立即生效:
[root@master3 ~]# sysctl -p
net.ipv4.ip_forward = 1

做nat转换
[root@master3 ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j SNAT --to-source 10.201.106.133

测试:master1,2已经可以联通外网

KVM虚拟机&openVSwitch杂记(1)

KVM虚拟机&openVSwitch杂记(1)

1.3 master1,2安装openvswitch

安装依赖包:
yum -y install make gcc openssl-devel autoconf automake rpm-build redhat-rpm-config 

1.3.1 下载包:
[root@master1 ~]# wget http://openvswitch.org/releases/openvswitch-2.5.0.tar.gz

1.3.2 准备构建rpm包
[root@master1 ~]# mkdir -p ~/rpmbuild/SOURCES
[root@master1 ~]# cp openvswitch-2.5.0.tar.gz ~/rpmbuild/SOURCES/

解压:
[root@master1 ~]# tar xf openvswitch-2.5.0.tar.gz 

修改配置文件
[root@master1 ~]# sed 's/openvswitch-kmod, //g' openvswitch-2.5.0/rhel/openvswitch.spec > openvswitch-2.5.0/rhel/openvswitch_no_kmod.spec

1.3.3 构建RPM包:
[root@master1 ~]#rpmbuild -bb --nocheck ~/openvswitch-2.5.0/rhel/openvswitch_no_kmod.spec 

1.3.4 安装
yum localinstall ~/rpmbuild/RPMS/x86_64/openvswitch-2.5.0-1.x86_64.rpm

1.3.5 启动服务
[root@master1 ~]# systemctl start openvswitch.service

master2节点同上配置即可。

查看安装了哪些文件:
[root@master1 ~]# rpm -ql openvswitch

2、openVSwitch配置

2.1 杂项

查看当前ovs版本:
[root@master1 ~]# ovs-vsctl show
85eb6797-6dd5-4c5f-aaf8-b7b242b633ae
    ovs_version: "2.5.0"

查看ovs使用帮助
[root@master1 ~]# ovs-vsctl --help

2.2 添加内部通信网桥

[root@master1 ~]# ovs-vsctl add-br br-in
[root@master1 ~]# ovs-vsctl show
85eb6797-6dd5-4c5f-aaf8-b7b242b633ae
    Bridge br-in
        Port br-in
            Interface br-in
                type: internal

打开内部网桥:
[root@master1 ~]# ifconfig br-in up

显示所有桥:
[root@master1 ~]# ovs-vsctl list-br
br-in

将eth1网卡添加进内部网桥br-in
[root@master1 ~]# ovs-vsctl add-port br-in eth1
[root@master1 ~]# ovs-vsctl list-ports br-in
eth1

查看接口:
[root@master1 ~]# ovs-vsctl list-ifaces br-in
eth1

2.3 查看ovs数据库信息

查看interface表信息:
[root@master1 ~]# ovs-vsctl list Interface

只查看interface表中eth1的信息:
[root@master1 ~]# ovs-vsctl list Interface eth1

显示端口表信息:
[root@master1 ~]# ovs-vsctl list Port

通过条件查找,表里面的信息:
[root@master1 ~]# ovs-vsctl find Port name='eth1'

3、启动两个虚拟机,并桥接到内部桥接口

由于暂时不需要两台宿主机(计算节点)通信,先从内部桥移除eth1
[root@master1 ~]# ovs-vsctl del-port br-in eth1

3.1 创建虚拟机

安装qemu-kvm
[root@master1 ~]# yum install  qemu-kvm

创建存放磁盘映像的目录:
[root@master1 ~]# mkdir -pv /vm/images
mkdir: 已创建目录 "/vm"
mkdir: 已创建目录 "/vm/images"
[root@master1 ~]# cd /vm/images/

[root@master1 images]# ls
cirros-no_cloud-0.3.0-i386-disk.img  cirros-no_cloud-0.3.0-x86_64-disk.img

启动网卡脚本:
# vim /etc/if-up
#!/bin/bash

bridge=br-in
if [ -n "$1" ]; then
    ip link set $1 up
    sleep 1
    ovs-vsctl add-port $bridge $1
    [ $? -eq 0 ] && exit 0 || exit 1
else
    echo "Error:no port specified."
    exit 2
fi
给脚本添加执行权限:
[root@master1 ~]# chmod +x /etc/if-up 

移除网卡脚本:
[root@master1 ~]# cat /etc/if-down 
#!/bin/bash

bridge=br-in
if [ -n "$1" ]; then
    ip link set $1 down
    sleep 1
    ovs-vsctl del-port $bridge $1
    [ $? -eq 0 ] && exit 0 || exit 1
else
    echo "Error:no port specified."
    exit 2
fi

[root@master1 ~]# chmod +x /etc/if-down

创建第一台虚拟机(放到后台运行):
[root@master1 images]# qemu-kvm -name "c1" -m 128 -smp 1 -drive file=/vm/images/cirros-no_cloud-0.3.0-i386-disk.img,media=disk,if=virtio -net nic,model=virtio,macaddr=52:54:00:00:00:01 -net tap,ifname=vif1.0,script=/etc/if-up,downscript=/etc/if-down -daemonize
VNC server running on `::1:5900'

安装vnc客户端
[root@master1 ~]# yum install tigervnc

vnc连接查看:
[root@master1 ~]# vncviewer :5900

KVM虚拟机&openVSwitch杂记(1)

启动第二个虚拟机:
[root@master1 ~]# qemu-kvm -name "c2" -m 128 -smp 1 -drive file=/vm/images/cirros-no_cloud-0.3.0-x86_64-disk.img,media=disk,if=virtio -net nic,model=virtio,macaddr=52:54:00:00:00:02 -net tap,ifname=vif2.0,script=/etc/if-up,downscript=/etc/if-down -daemonize   
VNC server running on `::1:5901'

查看内部网桥:
[root@master1 ~]# ovs-vsctl show
85eb6797-6dd5-4c5f-aaf8-b7b242b633ae
    Bridge br-in
        Port "vif2.0"
            Interface "vif2.0"
        Port "vif1.0"
            Interface "vif1.0"
        Port br-in
            Interface br-in
                type: internal

3.2 两个虚拟机配置IP互通

KVM虚拟机&openVSwitch杂记(1)

3.3 设置两个虚拟机处于不同VLAN中

修改tag(vlan ID号)
[root@master1 ~]# ovs-vsctl set port vif1.0 tag=10

[root@master1 ~]# ovs-vsctl list port vif1.0 | grep tag
tag                 : 10

已经无法ping通:

KVM虚拟机&openVSwitch杂记(1)

把vif2.0网口也设置vlan10后又可以ping通了

[root@master1 ~]# ovs-vsctl set port vif2.0 tag=10

KVM虚拟机&openVSwitch杂记(1)

4、跨交换机(桥)测试【同一宿主机】

4.1 创建第二台交换机(桥)

修改脚本
[root@master1 ~]# cp -a /etc/if-up /etc/if-up2
[root@master1 ~]# cp -a /etc/if-down /etc/if-down2

[root@master1 ~]# vim /etc/if-up2

#!/bin/bash

bridge="br-test"

[root@master1 ~]# vim /etc/if-down2

#!/bin/bash

bridge="br-test"

创建第二个交换机(桥)
[root@master1 ~]# ovs-vsctl add-br br-test
[root@master1 ~]# ovs-vsctl list-br
br-in
br-test

4.2 创建第三台虚拟机加入br-test桥

拷贝磁盘映像文件:
[root@master1 ~]# cp /vm/images/cirros-no_cloud-0.3.0-i386-disk.img /vm/images/c3.img

[root@master1 ~]# qemu-kvm -name "c3" -m 128 -smp 1 -drive file=/vm/images/c3.img,media=disk,if=virtio -net nic,model=virtio,macaddr=52:54:00:00:00:03 -net tap,ifname=vif3.0,script=/etc/if-up2,downscript=/etc/if-down2 -daemonize
VNC server running on `::1:5902'

[root@master1 ~]# ovs-vsctl show
85eb6797-6dd5-4c5f-aaf8-b7b242b633ae
    Bridge br-in
        Port "vif2.0"
            tag: 10
            Interface "vif2.0"
        Port "vif1.0"
            tag: 10
            Interface "vif1.0"
        Port br-in
            Interface br-in
                type: internal
    Bridge br-test
        Port br-test
            Interface br-test
                type: internal
        Port "vif3.0"
            Interface "vif3.0"

4.3 设置C3虚拟机的IP在同一网段和同个VLAN号

KVM虚拟机&openVSwitch杂记(1)

设置vif3.0网口的vlan号为10
[root@master1 ~]# ovs-vsctl set port vif3.0 tag=10

4.4 将两个交换机(网桥)互联

创建一对网卡名为s0和s1,s0在br-in,s1在br-test,即可实现互联功能

[root@master1 ~]# ip link add s0 type veth peer name s1
[root@master1 ~]# ip link show | egrep "s0|s1"
17: s1@s0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
18: s0@s1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000

激活网卡:
[root@master1 ~]# ip link set s0 up
[root@master1 ~]# ip link set s1 up

将网卡添加至对应交换机(网桥):
[root@master1 ~]# ovs-vsctl add-port br-in s0
[root@master1 ~]# ovs-vsctl add-port br-test s1
[root@master1 ~]# ovs-vsctl show
85eb6797-6dd5-4c5f-aaf8-b7b242b633ae
    Bridge br-in
        Port "vif2.0"
            tag: 10
            Interface "vif2.0"
        Port "s0"
            Interface "s0"
        Port "vif1.0"
            tag: 10
            Interface "vif1.0"
        Port br-in
            Interface br-in
                type: internal
    Bridge br-test
        Port br-test
            Interface br-test
                type: internal
        Port "s1"
            Interface "s1"
        Port "vif3.0"
            tag: 10
            Interface "vif3.0"

从C3测试网络又通了:

KVM虚拟机&openVSwitch杂记(1)

PS:移除vlan tag:
[root@master1 ~]# ovs-vsctl remove port vif3.0 tag 10
重新添加:
[root@master1 ~]# ovs-vsctl set port vif3.0 tag=10

4.5 设置两个交换机(网桥)互联口为trunk模式,并放行相应vlan

####刚才默认应该是trunk模式,所以两个交换机的虚拟机只要处于同个vlan号就能互相通信

[root@master1 ~]# ovs-vsctl set port s0 trunks=10
[root@master1 ~]# ovs-vsctl set port s1 trunks=10

转载于:https://blog.51cto.com/zhongle21/2096561

<think>嗯,用户想了解如何在Docker虚拟机里安装Open vSwitch。首先,我需要确定用户的环境。Docker通常运行在Linux系统上,但用户提到的是虚拟机,可能是在Windows或Mac上使用Docker Desktop,这时候Docker实际上是运行在一个Linux虚拟机里的。或者用户可能是在一个Linux虚拟机里直接安装Docker。两种情况可能需要不同的步骤。 接下来,安装Open vSwitch(OVS)通常需要内核模块的支持。但在Docker容器中,直接加载内核模块可能会遇到权限问题,因为容器默认是隔离的。用户可能需要特权模式运行容器,或者挂载相关设备文件。 另外,用户可能希望了解在容器内部安装OVS,还是在宿主机上安装并通过Docker容器进行管理。如果是前者,可能需要一个基于适当Linux发行版的Docker镜像,比如Ubuntu或CentOS,然后在里面安装OVS的软件包。同时,要考虑容器是否需要持久化存储,避免重启后配置丢失。 然后,步骤可能包括:准备Docker镜像,安装OVS依赖项,下载并编译OVS(如果需要),或者直接通过包管理器安装。还要考虑网络配置,因为OVS需要管理虚拟网络设备,可能需要调整容器的网络命名空间或者使用host网络模式。 还可能存在常见问题,比如权限不足,内核模块未加载,或者网络接口无法创建。需要提醒用户检查日志,使用正确的运行参数,比如--privileged,或者挂载/dev和/lib/modules。 最后,是否需要验证安装,比如启动OVS服务,创建网桥,添加端口等操作,确保OVS正常运行。可能还需要配置开机启动,但容器通常是临时性的,可能需要通过Dockerfile或启动脚本来自动化这些步骤。 总结步骤大概如下:选择基础镜像,安装依赖,安装OVS,配置权限和网络,测试验证。同时提供示例命令,比如Dockerfile和运行命令,让用户能直接复制使用。还要注意安全性,特权模式的风险,以及替代方案,比如在宿主机安装OVS,容器通过socket进行控制。</think>以下是在Docker中安装Open vSwitch(OVS)的逐步指南: --- ### **1. 基础环境准备** #### 1.1 选择基础镜像 建议使用支持systemd的Linux发行版镜像(如Ubuntu/CentOS): ```Dockerfile FROM ubuntu:22.04 ``` #### 1.2 安装依赖包 ```dockerfile RUN apt-get update && apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ gnupg \ software-properties-common \ build-essential \ linux-headers-generic \ automake \ libtool ``` --- ### **2. 安装Open vSwitch** #### 2.1 通过源码编译安装(推荐) ```dockerfile RUN curl -O https://www.openvswitch.org/releases/openvswitch-3.1.0.tar.gz \ && tar -xzvf openvswitch-3.1.0.tar.gz \ && cd openvswitch-3.1.0 \ && ./configure --prefix=/usr --localstatedir=/var \ && make \ && make install ``` #### 2.2 或通过包管理器安装 ```dockerfile RUN apt-get install -y openvswitch-switch ``` --- ### **3. Docker容器权限配置** 必须赋予容器特权模式以操作网络设备: ```bash docker run -it --privileged --name ovs-container your-image-name ``` 或通过设备挂载: ```bash docker run -it --cap-add NET_ADMIN --device /dev/net/tun:/dev/net/tun your-image-name ``` --- ### **4. 初始化OVS服务** 在容器内执行: ```bash # 创建OVS数据库 ovsdb-tool create /etc/openvswitch/conf.db # 启动OVS数据库服务 ovsdb-server --remote=punix:/var/run/openvswitch/db.sock \ --private-key=db:Open_vSwitch,SSL,private_key \ --certificate=db:Open_vSwitch,SSL,certificate \ --bootstrap-ca-cert=db:OpenvSwitch,SSL,ca_cert \ --pidfile --detach # 初始化数据库 ovs-vsctl --no-wait init # 启动主守护进程 ovs-vswitchd --pidfile --detach ``` --- ### **5. 验证安装** ```bash ovs-vsctl show ``` 成功输出示例: ``` f8674d5a-...-a32c1d0ca995 ovs_version: "3.1.0" ``` --- ### **6. 创建虚拟网络** ```bash # 创建网桥 ovs-vsctl add-br ovs-br0 # 添加虚拟端口 ovs-vsctl add-port ovs-br0 veth0 ``` --- ### **常见问题解决** 1. **权限错误** 确保容器以`--privileged`模式运行,或添加`NET_ADMIN`能力 2. **内核模块缺失** 需挂载主机内核模块目录: ```bash -v /lib/modules:/lib/modules:ro ``` 3. **OVS服务启动失败** 检查日志: ```bash tail -f /var/log/openvswitch/ovs-vswitchd.log ``` --- ### **完整Dockerfile示例** ```dockerfile FROM ubuntu:22.04 RUN apt-get update && apt-get install -y \ curl build-essential linux-headers-generic \ automake libtool RUN curl -O https://www.openvswitch.org/releases/openvswitch-3.1.0.tar.gz \ && tar xzf openvswitch-3.1.0.tar.gz \ && cd openvswitch-3.1.0 \ && ./configure --prefix=/usr \ && make && make install CMD ["/bin/bash"] ``` --- ### **关键注意事项** - 容器重启后OVS配置会丢失,建议通过卷挂载持久化`/etc/openvswitch` - 生产环境建议直接使用宿主机的OVS,通过`--network=host`共享网络命名空间 - 可使用官方OVS Docker镜像简化流程: ```bash docker pull openvswitch/ovs ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值