乐趣区

关于kvm:KVM跨主机通信

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:initKVM.sh

作用:创立内部网桥 br-vxlan 和 VXLAN 隧道。

#!/bin/bash

if [$# != 2]; then
        # local-ip: 本地物理机的 IP
        # remote-ip: 隧道对端物理机的 IP
        echo "Usage: $0 local-ip remote-ip";
        exit 1
fi

localIP=$1
remoteIP=$2

brctl addbr br-vxlan
ip link set br-vxlan up

ip link add vxlan0 type vxlan id 42 dstport 4789 remote $remoteIP local $localIP
ip link set vxlan0 up
brctl addif br-vxlan vxlan0

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

# 为虚拟机增加网卡
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 用户的明码为 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"

创立完虚拟机后,进入虚拟机:

virsh console vm-name

而后,为虚拟机的 eth1 虚构网卡调配 IP 地址,让所有物理机上的 KVM 虚拟机通过它们的 eth1 虚拟机网卡进行通信。

退出移动版