Open vSwitch实践 -- 利用dnsmasq为虚机分配IP地址

来源:互联网 发布:起点09服饰淘宝店 编辑:程序博客网 时间:2024/06/03 14:06

OpenStack里的所创建虚机的虚拟网卡都会先attach到一个linux bridge(主要是为了通过iptable实现安全组),然后再attach到集成网桥(br-int)上,并通过网络节点上attach到br-int的dhcp tap设备获得IP地址。这里我们通过纯手工的方式模拟一下这个过程,为了简单起见,我们将排除linux bridge和namespace的影响,将虚拟网卡和dhcp设备直接attach到同一个主机的br-int上,如下图所示:


其中,VM1和VM2的虚机网卡的名字分别叫做tap1和tap2。DHCP设备的名字叫tap-qdhcp。


下面是详细的实现过程:


1. 安装并启动Open vSwitch。

# yum -y install openvswitch# systemctl start openvswitch# systemctl enable openvswitch

2. 创建集成网桥br-int。

# ovs-vsctl add-br br-int

3. 将DHCP设备tap-qdhcp添加到br-int。注意一定要加上"-- set Interface tap-qdhcp type=internal",否则命令会报错找不到tap-qdhcp设备。

# ovs-vsctl add-port br-int tap-qdhcp -- set Interface tap-qdhcp type=internal

4. 为tap-qdhcp配置IP地址

# ifconfig tap-qdhcp 10.0.0.1 netmask 255.255.255.0 up# ifconfig tap-qdhcptap-qdhcp: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        inet 10.0.0.1  netmask 255.255.255.0  broadcast 10.0.0.255        inet6 fe80::2c37:27ff:fe72:e296  prefixlen 64  scopeid 0x20<link>        ether 2e:37:27:72:e2:96  txqueuelen 0  (Ethernet)        RX packets 0  bytes 0 (0.0 B)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 10  bytes 732 (732.0 B)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

5. 安装dnsmasq,并在tap-qdhcp上启动一个dnsmasq的监听,dnsmasq负责监听并响应dhcp请求。

# yum install dnsmasq# mkdir /var/run/dnsmasq/# /usr/sbin/dnsmasq --strict-order --bind-interfaces --except-interface lo --interface tap-qdhcp --dhcp-range 10.0.0.10,10.0.0.100 --dhcp-leasefile=/var/run/dnsmasq/tap-qdhcp.pid --dhcp-lease-max=253 --dhcp-no-override --log-queries --log-facility=/tmp/dnsmasq.log# ps -ef|grep dnsmasqnobody    1196     1  0 18:04 ?        00:00:00 /usr/sbin/dnsmasq --strict-order --bind-interfaces --except-interface lo --interface tap-qdhcp --dhcp-range 10.0.0.10,10.0.0.100 --dhcp-leasefile=/var/run/dnsmasq/tap-qdhcp.pid --dhcp-lease-max=253 --dhcp-no-override --log-queries --log-facility=/tmp/dnsmasq.log

6. 安装libvirt, virt-install, qemu-kvm,并启动libvirtd

# yum -y install libvirt virt-install qemu-kvm# systemctl start libvirtd# systemctl enable libvirtd


7. 用virt-install创建两个虚机,分别命名为vm1和vm2。为了简单起见,用cirros作为disk image。需要提前将image文件cirros-0.3.1-x86_64-disk.img上传到/tmp/vm1/和/tmp/vm2/下面。这里用到的network就是安装libvirt时自动创建的网络default。

# virt-install --connect=qemu:///system --name=vm1 --ram=50 --vcpus=1 --virt-type qemu --disk \path=/tmp/vm1/cirros-0.3.1-x86_64-disk.img,format=qcow2 --import --network network:default# virt-install --connect=qemu:///system --name=vm2 --ram=50 --vcpus=1 --virt-type qemu --disk \path=/tmp/vm2/cirros-0.3.1-x86_64-disk.img,format=qcow2 --import --network network:default# virsh list --all Id    名称                         状态---------------------------------------------------- 3     vm1                            running 4     vm2                            running


8. 为了让新创建的vm1和vm2使用br-int,需要对两个虚机的配置文件进行重新编辑:

首先停止两个虚机:

# virsh destroy vm1# virsh destroy vm2

然后编辑/etc/libvirt/qemu/vm1.xml,原始的需要替换的部分如下:

    <interface type='network'>      <mac address='52:54:00:99:81:00'/>      <source network='default'/>      <model type='rtl8139'/>      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>    </interface>
最终需要将其替换为如下内容:
    <interface type='bridge'>      <source bridge='br-int'/>      <virtualport type='openvswitch'/>      <target dev='tap1'/>      <model type='virtio'/>    </interface>
然后对/etc/libvirt/qemu/vm2.xml做同样修改,修改后的内容片段如下:
    <interface type='bridge'>      <source bridge='br-int'/>      <virtualport type='openvswitch'/>      <target dev='tap2'/>      <model type='virtio'/>    </interface>

9. 使用修改后的虚机配置文件来重新定义虚机

首先将vm1.xml和vm2.xml拷贝到/tmp/下面:

# cp /etc/libvirt/qemu/vm1.xml /tmp/# cp /etc/libvirt/qemu/vm2.xml /tmp/
删除之前创建的旧的虚机的定义:
# virsh undefine vm1# virsh undefine vm2
将/tmp/vm1.xml和/tmp/vm2.xml拷贝回/etc/libvirt/qemu:
# cp /tmp/vm*.xml /etc/libvirt/qemu/
使用新的配置文件重新定义虚机:
# virsh define /etc/libvirt/qemu/vm1.xml# virsh define /etc/libvirt/qemu/vm2.xml

10. 启动虚拟机,可以在console上看到在启动过程中得到了dhcp分配的IP地址,如下:

# virsh start vm1 --console......Starting network...udhcpc (v1.20.1) startedSending discover...Sending select for 10.0.0.92...Lease of 10.0.0.92 obtained, lease time 3600# virsh start vm2 --console......Starting network...udhcpc (v1.20.1) startedSending discover...Sending select for 10.0.0.42...Lease of 10.0.0.42 obtained, lease time 3600

11. 登陆vm1,可以能够ping通vm2

# ifconfig eth0eth0      Link encap:Ethernet  HWaddr 52:54:00:E2:05:18            inet addr:10.0.0.92  Bcast:10.0.0.255  Mask:255.255.255.0          inet6 addr: fe80::5054:ff:fee2:518/64 Scope:Link          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          RX packets:29 errors:0 dropped:0 overruns:0 frame:0          TX packets:31 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:1000           RX bytes:3002 (2.9 KiB)  TX bytes:2754 (2.6 KiB)# ping 10.0.0.42PING 10.0.0.42 (10.0.0.42): 56 data bytes64 bytes from 10.0.0.42: seq=0 ttl=64 time=1.359 ms64 bytes from 10.0.0.42: seq=1 ttl=64 time=2.026 ms64 bytes from 10.0.0.42: seq=2 ttl=64 time=2.949 ms

12. 查看OVS的配置,可以看到tap1, tap2和tap-qdhcp都attach到br-int上,如下:

# ovs-vsctl show4daab0dc-86dc-4b09-b7c2-e93ba990166a    Bridge br-int        Port "tap2"            Interface "tap2"        Port br-int            Interface br-int                type: internal        Port tap-qdhcp            Interface tap-qdhcp                type: internal        Port "tap1"            Interface "tap1"    ovs_version: "2.4.0"


0 0
原创粉丝点击