1. 实现目标
在多台物理机上创建 KVM 虚拟机,且使得不同物理机上的 KVM 虚拟机之间能够相互通信,同时还保证 KVM 虚拟机能够访问互联网。
2. 实现方法
在每台物理机上创建两个网桥:
- 其中一个使用 KVM 默认的 virbr0 即可,虚拟机通过 virbr0 访问外网;
- 另外创建一个网桥和 VXLAN 隧道,然后将隧道添加到新建的网桥上,虚拟机通过此网桥实现跨机通信;
- 为虚拟机添加两个虚拟网卡,一个(eth0)连接到 virbr0 上,另一个(eth1)连接到新建网桥上;
- 为虚拟机添加路由,或者为所有虚拟机的 eth1 网卡分配处于同一个子网内的 IP。
3. 脚本1:installKVM.sh
作用:安装 KVM 及必要的工具。
sudo yum install -y virt-* libvirt bridge-utils qemu-img qemu-kvm
# 启动服务、开机自启
sudo systemctl start libvirtd.service
sudo systemctl enable libvirtd.service
4. 脚本2:createNet.sh
作用:创建内部网桥和 VXLAN 隧道。
#!/bin/bash
if [ $# != 4 ]; then
# br-name: 网桥名称
# tun-name: 隧道名称
# local-ip: 本地物理机的 IP
# remote-ip: 隧道对端物理机的 IP
echo "Usage: $0 br-name tun-name local-ip remote-ip";
exit 1
fi
br=$1
tun=$2
localIP=$3
remoteIP=$4
brctl addbr $br
ip link set $br up
ip link add $tun type vxlan id 42 dstport 4789 remote $remoteIP local $localIP
ip link set $tun up
brctl addif $br $tun
5. 脚本3:createVM.sh
作用:创建虚拟机。
#!/bin/bash
if [ $# != 5 ]; then
# n-cpu: 指定 vcpu 个数
# n-memory: 指定需要的内存大小
# n-disk: 指定虚拟机磁盘大小
# vm-name: 指定虚拟机名称
# base-img-path: 指定基础镜像的路径,如可以使用云镜像(见,http://cloud.centos.org/centos/)
echo "Usage: $0 n-cpu n-memory(MB) n-disk(GB) vm-name base-img-path";
exit 1;
fi
cpu=$1
ram=$2
disk=$3
vm=$4
baseImg=$5
img=${vm}-disk.qcow2
net=default
# 根据指定的基础镜像创建虚拟机磁盘
qemu-img create -f qcow2 -b $baseImg $img -o size=${disk}G
virt-install --name=$vm --ram=$ram --vcpus=$cpu \
--os-type=linux \
# --os-variant=centos7.0 \
--disk $img,device=disk,bus=virtio \
--network network=$net,model=virtio \
--graphics=none \
--import
注:可以通过 osinfo-query os
命令来查看支持哪些 os-variant。
另外,如果基础镜像是云镜像,如 http://cloud.centos.org/centos/,则还可以对其进行定制:(此处使用 CentOS-7-x86_64-GenericCloud-1602.qcow2)
export LIBGUESTFS_BACKEND=direct
# 修改 root 用户的密码为 root
virt-customize -a CentOS-7-x86_64-GenericCloud-1602.qcow2 --root-password password:root
# 允许 root 用户使用密码通过 ssh 登录
virt-customize -a CentOS-7-x86_64-GenericCloud-1602.qcow2 --run-command "sed -r -i 's/^#(PermitRootLogin yes)/\1/; s/PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config"
6. 脚本4:addNic.sh
作用:为虚拟机添加虚拟网卡。
#!/bin/bash
if [ $# != 2 ]; then
# vm-name: 指定虚拟机名称
# br-name: 指定虚拟机要挂接到哪个网桥上
echo "Usage: $0 vm-name br-name";
exit 1;
fi
vm=$1
br=$2
virsh attach-interface --domain $vm --type bridge --source $br --model virtio --persistent --live
7. 后续操作
创建完虚拟机后,进入虚拟机:
virsh console vm-name
然后,为虚拟机的 eth1 虚拟网卡分配 IP 地址,让所有物理机上的 KVM 虚拟机通过它们的 eth1 虚拟机网卡进行通信。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。