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.servicesudo systemctl enable libvirtd.service
4. 脚本2:initKVM.sh
作用:创立内部网桥 br-vxlan 和 VXLAN 隧道。
#!/bin/bashif [ $# != 2 ]; then # local-ip: 本地物理机的 IP # remote-ip: 隧道对端物理机的 IP echo "Usage: $0 local-ip remote-ip"; exit 1filocalIP=$1remoteIP=$2brctl addbr br-vxlanip link set br-vxlan upip link add vxlan0 type vxlan id 42 dstport 4789 remote $remoteIP local $localIPip link set vxlan0 upbrctl addif br-vxlan vxlan0
5. 脚本3:createVM.sh
作用:创立虚拟机,并为虚拟机增加网卡。
#!/bin/bashif [ $# != 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;ficpu=$1ram=$2disk=$3vm=$4baseImg=$5img=${vm}-disk.qcow2net=default# 依据指定的根底镜像创立虚拟机磁盘qemu-img create -f qcow2 -b $baseImg $img -o size=${disk}Gvirt-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# 为虚拟机增加网卡virsh attach-interface --domain $vm --type bridge --source br-vxlan --model virtio --persistent --live
注:能够通过 osinfo-query os
命令来查看反对哪些 os-variant。
另外,如果根底镜像是云镜像,如 http://cloud.centos.org/centos/,则还能够对其进行定制:(此处应用 CentOS-7-x86_64-GenericCloud-1602.qcow2)
export LIBGUESTFS_BACKEND=direct# 批改 root 用户的明码为 rootvirt-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"
创立完虚拟机后,进入虚拟机:
virsh console vm-name
而后,为虚拟机的 eth1 虚构网卡调配 IP 地址,让所有物理机上的 KVM 虚拟机通过它们的 eth1 虚拟机网卡进行通信。