macvtap是虚拟机网络虚拟化常用的一种技术,当然容器也可以用. MACVTAP 的实现基于传统的 MACVLAN. 和 TAP 设备一样,每一个 MACVTAP 设备拥有一个对应的 Linux 字符设备,并拥有和 TAP 设备一样的 IOCTL 接口,因此能直接被 KVM/Qemu使用,方便地完成网络数据交换工作. 引入 MACVTAP 设备的目标是:简化虚拟化环境中的交换网络,代替传统的 Linux TAP 设备加 Bridge 设备组合,同时支持新的虚拟化网络技术,如 802.1 Qbg.
如kata的虚拟化网络就用了这个技术,以下实践完就会对kata的网络原理比较清楚了,建议对照教程动手实践.
实验环境介绍
此图非常重要,读整篇文章最好脑海里都有
初始化环境
qemu libvirt环境
我已经做好了qemu libvirt的镜像,大家可以直接使用:在容器中有非常多的好处,环境如果乱了可以快速恢复干净的环境。使用设备对也可减少对宿主机网络的影响。
docker run -d --privileged -v /dev:/dev -v /home/fanux:/root --name qemu-vm fanux/libvirt:latest init
注意:
- 网络等操作需要容器有特权模式
- tap网络需要挂载/dev目录
- /home/fanux可以作为工作目录,镜像自己编写的libvirt配置等放在里面防止删除容器后丢失
- 由于libvirt需要systemd所以我们在容器中启动init进程
也可自己构建镜像,我提供了一个Dockerfile, -j参数根据你机器CPU来设置编译时的线程数:
FROM centos:7.6.1810
RUN yum install -y wget && wget https://download.qemu.org/qemu-4.0.0.tar.xz && \
tar xvJf qemu-4.0.0.tar.xz \
&& yum install -y automake gcc-c gcc make autoconf libtool gtk2-devel \
&& cd qemu-4.0.0 \
&& ./configure \
&& make -j 72 && make install \
&& yum install -y bridge-utils && yum install -y net-tools tunctl iproute && yum -y install openssh-clients \
cd .. && rm qemu-4.0.0.tar.xz && rm -rf qemu-4.0.0
RUN yum install -y libvirt virt-manager gustfish openssh-clients
虚拟机镜像
进入容器
[root@compute84 libvirt]# docker exec -it qemu-vm bash
bash-4.2# cd
bash-4.2# ls
CentOS-7-x86_64-GenericCloud.qcow2 centos.qcow2 image nohup.out start.sh vm3.xml
CentOS-7-x86_64-Minimal-1810.iso cloud-init-start.sh kernel qemu vm.xml
Fedora-Cloud-Base-30-1.2.x86_64.qcow2 destroy.sh libvirt run.sh vm2.xml
下载虚拟机镜像:
openstack已经提供很多已经装过cloud-init的镜像,地址:https://docs.openstack.org/image-guide/obtain-images.html
我用的一个比较新的centos的qcow2格式镜像:
wget http://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud-1905.qcow2
修改虚拟机root密码:
virt-customize -a CentOS-7-x86_64-GenericCloud.qcow2 --root-password password:coolpass
启动虚拟机
查看容器网络信息:
bash-4.2# systemctl start libvirtd
bash-4.2# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host