KVM—跨主机通信

Posted gzming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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: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 虚拟机网卡进行通信。

以上是关于KVM—跨主机通信的主要内容,如果未能解决你的问题,请参考以下文章

Linux C的MQTT测试代码编写 - 跨主机的MQTT客户端通信

OpenvSwitch实现Docker容器跨宿主机互联

VMware平台部署KVM网络无法通信

VMware平台部署KVM网络无法通信

Docker-----网络自定义网络容器通信跨主机容器通信

Docker跨主机通信网络