部署包含Web管理界面的KVM

开源的虚拟化平台KVM逐渐已经成为市场上的热门,今天就来试着搭建一套KVM平台。

软件平台:Debian 9 amd64
硬件平台:Intel NUC5i3RYH(服务器)


快速链接


概述
Debian环境下安装KVM
简单的使用图形界面
集中管理


概述


KVM是Linux下的一套虚拟机平台,提供和其他虚拟机平台,如VMware相同的功能——在一台物理机上运行多个虚拟计算机。对于服务器平台来说,VMWare的ESXI也提供了丰富的功能和不错的性能,而且在易用性上更优,VMware提供一个免费版本的ESXI,不过在功能上有一定的缩水,其中之一是不允许多个虚拟机共享一个CPU内核,即进一步限制了一台物理机上能够同时运行的虚拟机的数量;而Windows Server平台上的Hyper-V则与操作系统捆绑,在运行Hyper-V之前,需要为Windows Server付费,并且过去的Windows Server版本的稳定性相较Linux或ESXI欠佳。Linux平台上当然有替代品可以选择,比如QEMU,一个可以运行任意平台操作系统的基于命令行操作的虚拟机,不过QEMU采用的是纯软件模拟方式,所以效率很低,虚拟系统运行卡顿是家常便饭,适合实验室环境但不适合生产环境。虽然QEMU性能捉鸡,但是这个开源的虚拟机上各种组件的代码却融合进了Linux平台上后来各个虚拟机软件中。VirtualBox这个跨平台的虚拟机软件就是基于QEMU构建的,大幅修改了代码支持了硬件虚拟化以及图形加速,使得其运行速度完全可媲美VMware之类的商业化虚拟机软件。VirtualBox提供一个很友好的图形化界面,性能和易用性提升后其定位就类似于VMWare Workstation。另一个和QEMU脱不了关系的虚拟机平台就是今天要说的KVM了。商业公司RedHat写了一个嵌入到Linux内核的虚拟机,并使这个虚拟机支持硬件加速。KVM提供虚拟机的计算虚拟化,但不提供输入输出设备的虚拟化支持,也不提供用户界面的控制程序。但是KVM与QEMU进行集成后,可由QEMU提供KVM自身不提供的那部分功能——输入输出和用户界面,而后续为了改善QEMU中虚拟的存储设备和网络设备的性能不足,又提出了Virtio用来替换QEMU中的相同功能,使得KVM的输入输出速度可以跟上主流虚拟平台的性能。虽然KVM不具备很好的图形性能,不具备很好的图形用户界面,但是当面向服务区操作系统和系统管理员时,上述缺点并不成问题;而KVM的各种灵活的功能和开源免费的性质使其成为服务器虚拟化行业中宠儿。

 

今天我们就来试着搭建一个包含Web图形控制台的KVM服务器。

 

Debian环境下安装KVM


首先,安装必要的软件

# apt install net-tools python-pip python-libvirt python-libxml2 bridge-utils qemu-kvm virt-top virtinst libvirt-daemon virt-manager novnc supervisor nginx git -y

下载量会比较大,需要等上一会儿。说说上述软件都是做什么用的吧

net-tools Ubuntu上不用安装,Debian上默认没有ifconfig,为了后续检查IP地址、网口速率等十分有用,所以装上
python-pip
python-libvirt
python-libxml2
novnc
supervisor
nginx
Web图形化KVM管理界面WebVirtMgr需要。这里需要注意的是,WebVirtMgr目前只支持Python2。
bridge-utils 用于创建桥接接口的工具,后续供虚拟机访问主机网络用的,相当于将虚拟机和宿主机同时接入一个交换机,同时将这个交换机接入上层网络
virt-top 看名字应该是命令行下获取各虚拟机消耗情况用的,暂且装着
virtinst 度娘了下,用来在命令行简化虚拟机创建的工具,暂且装着
libvirt-daemon 提供外部软件控制KVM虚拟机以及获取虚拟平台状况的服务和库,各个外壳程序或平台控制KVM的工作都需要依靠这个。
virt-manager 提供命令行/图形下控制KVM的功能

 

接着,修改网络配置文件 /etc/network/interfaces,为KVM准备一个桥接接口。interfaces文件的内容类似下面这样的,记得把IP、网关和DNS服务器地址改成你的。
br0是这个桥接接口的名字,你可以随意改。dridge_ports 必须和你系统中原有的网卡名称一致,原有的网卡名称是eth0,这里就填eth0;原有的网卡名称是enp0s25,这里就填enp0s25。同时将原来的网卡配置内容注释掉

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

 

# 桥接接口配置

auto br0

  iface br0 inet static
  bridge_ports enp0s25
  bridge_stp off
  bridge_maxwait 0
  bridge_fd 0
  address 192.168.2.200
  netmask 255.255.255.0
  gateway 192.168.2.1
  dns-nameservers 192.168.2.1 114.114.114.114 8.8.8.8

 

# 注释掉原有的接口配置
#allow-hotplug enp0s25
#iface enp0s25 inet static
#  address 192.168.2.200
#  netmask 255.255.255.0
#  gateway 192.168.2.1
#  dns-nameservers 192.168.2.1 114.114.114.114 8.8.8.8

 

修改完毕后重启系统

# reboot

 

KVM本身并不需要过多的配置,接下来安装WebVirtMgr。进入/var/www目录,将WebVirtMgr的源码下载到这个目录中。

# cd /var/www
# git clone git://github.com/retspen/webvirtmgr.git
Cloning into 'webvirtmgr'...
remote: Counting objects: 5721, done.
remote: Total 5721 (delta 0), reused 0 (delta 0), pack-reused 5721
Receiving objects: 100% (5721/5721), 3.01 MiB | 694.00 KiB/s, done.
Resolving deltas: 100% (3683/3683), done.
cd webvirtmgr

 

然后,安装WebVirtMgr依赖的其他软件

# pip install -r requirements.txt
Collecting django==1.5.5 (from -r requirements.txt (line 1))
Downloading Django-1.5.5.tar.gz (8.1MB)
100% |████████████████████████████████| 8.1MB 91kB/s
Collecting gunicorn==18.0 (from -r requirements.txt (line 2))
Downloading gunicorn-18.0.tar.gz (366kB)
100% |████████████████████████████████| 368kB 290kB/s
Collecting lockfile>=0.9 (from -r requirements.txt (line 5))
Downloading lockfile-0.12.2-py2.py3-none-any.whl                                      新视.技术博客 - blog.nvacg.org
Building wheels for collected packages: django, gunicorn
Running setup.py bdist_wheel for django ... done
Stored in directory: /root/.cache/pip/wheels/69/7b/1b/4be52b1ceec31cd4613b22c8a0473105a1207956775845cd5f
Running setup.py bdist_wheel for gunicorn ... done
Stored in directory: /root/.cache/pip/wheels/64/07/89/e2dce813bea23a0ee108703f045bfd434597d3ed52671760a7
Successfully built django gunicorn
Installing collected packages: django, gunicorn, lockfile
Successfully installed django-1.5.5 gunicorn-18.0 lockfile-0.12.2

 

接着,设置WebVirtMgr,过程中会要求你设置管理用户的用户名、邮件地址和密码

# ./manage.py syncdb
WARNING:root:No local_settings file found.
Creating tables ...
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_groups
Creating table auth_user_user_permissions
Creating table auth_user
Creating table django_content_type
Creating table django_session                                                                         新视.技术博客 - blog.nvacg.org
Creating table django_site
Creating table servers_compute
Creating table instance_instance
Creating table create_flavorYou just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'root'): <填入你的用户名>
Email address: <填入你的mail地址>
Password: <填入你的密码>
Password (again): <再一次填入你的密码>
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 6 object(s) from 1 fixture(s)

 

继续初始化WebVirtMgr

# ./manage.py collectstatic

 

配置Nginx反向代理,编辑/etc/nginx/site-enabled/default,内容改为如下:
需要注意的是,client_max_body_size这个值必须要填得够大,否则上传大文件将失败,如你设置为1024M时,上传超过1GB的镜像会失败。

server {
  listen 80 default_server;  server_name _;
  #access_log /var/log/nginx/webvirtmgr_access_log; 
  location /static/ {
    root /var/www/webvirtmgr/webvirtmgr; 

# or /srv instead of /var
    expires max;
  } 
  location / {
    proxy_pass http://127.0.0.1:8000;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for;
    proxy_set_header Host $host:$server_port;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_connect_timeout 600;
    proxy_read_timeout 600;
    proxy_send_timeout 600;
    client_max_body_size 8192M; # 上传文件的最大大小
  }
}

 

接着,重启nginx服务(当然,也可以reload服务),并启动WebVirtMgr

# service nginx restart
# /var/www/webvirtmgr/manage.py runserver > /dev/null 2>&1 &
[1] 1832
# /var/www/webvirtmgr/console/webvirtmgr-console > /dev/null 2>&1 &
[2] 1837                                                               
新视.技术博客 - blog.nvacg.org

 

至此,服务器上配置完毕,打开一个浏览器,访问KVM服务器地址就可以看到WebVirtMgr页面,用先前设置的用户名和密码登入后,添加一个链接

 

由于目前我们将WebVirtMgr和KVM安装在同一台服务器上,并且该WebVirtMgr仅管理自己所在的这台服务器,因此将连接类型选择为"Local Socket",为连接输入一个名字后点击"Add"按钮即可。

 

如果和KVM通信正常,则刚才添加的连接显示为浅绿色。如果连接显示为浅红色,检查服务器上libvirtd服务是否启动。

 

点击刚才添加的连接,创建两个存储,一个用于存放虚拟磁盘,另一个用于存放光盘镜像。

 

首先创建用于存储虚拟磁盘的存储,存储类型选择为"DIR",设置一个名字,然后填入对应服务器上存储虚拟磁盘的文件夹路径即可

 

用相同的方法添加光盘镜像存储,选择存储类型为"ISO",填入对应服务器上存储光盘镜像的文件夹路径即可

 

现在,可以向刚才创建的光盘镜像存储中上传光盘镜像

 

上传完毕后,可以在该存储内看到刚才上传的镜像

 

接着还要将先前设置的桥接接口添加到虚拟平台中以供虚拟机使用

 

将类型选定未"BRIDGE",Bridge一定要和你先前在系统 /etc/network/interfaces 中设置的桥接接口的名字一样

 

简单的使用图形界面


至此,平台设置完毕

 

接下来,我们试着创建并打开一个虚拟机

首先进入刚才创建的用于存储虚拟磁盘的存储中,创建一个磁盘

 

添加一个虚拟磁盘文件,起一个名字,然后设置该磁盘文件的大小。至此用于新创建虚拟机的虚拟磁盘就建立完毕了。

 

依次点击"New Instance"和"Custom Instance"

 

设置这个虚拟机的规格参数,并向HDD和Network中分别添加刚才建立的磁盘镜像和先前设置的桥接网络

 

待虚拟机创建后,将光盘镜像挂接到虚拟机

 

然后将其启动

 

接着,点击"ACCESS"下的"Console"即可操作虚拟机

 

 

当然,为了更好地体验,笔者建议使用RealVNC公司的免费软件 VNC Viewer 代替Web端的控制台

 

安装Windows时需要加载驱动方能识别硬盘,驱动可在以下地址取得:
https://fedoraproject.org/wiki/Windows_Virtio_Drivers

 

集中管理


 

通过上面文章的引导,我们已经搭建好了一套易于操作的虚拟机平台。温饱思淫欲,现在我们想再为这个平台做些什么。

先前说到,KVM功能强大。当然就支持迁移啦!碰巧的是WebVirtMgr也支持向KVM传递此操作。不过上文中WebVirtMgr仅仅是管理了本机上的KVM,如果能让WebVirtMgr管理多台KVM,是不是KVM就能实现VCenter上面的迁移功能呢?在测试迁移前,且看下面的内容,我们将要将WebVirtMgr与KVM的连接从本机接口文件改为TCP连接,当多台KVM都采用TCP连接与WebVirtMgr建立连接的时候,就有了实现迁移的条件了;反过来说,即使不进行迁移,一台前端管理多个后端也十分地方便。

我们设置外部平台连接KVM的LibVirt来对KVM进行控制时,需要经过用户名和密码验证,SASL是Linux下的一套通用验证库。debian系统通过下述命令安装

# apt install sasl2-bin -y

 

接着,创建用于LibVirt的认证账号

# saslpasswd2 -a libvirt <指定一个用户名>
Password: <指定密码>
Again (for verification): <重新输入密码>

 

注意,后续使用sasl认证的时候,不应直接使用上面你指定的用户名,而是应该使用这样的形式: 用户名@主机名,如我部署KVM的这台服务器的主机名是kvm,那么账号就是 用户名@kvm

我们可以查看下刚才设置的认证账号是否正确,只要程序能将刚才设置的账号显示出来,即表示账号设置正确

# sasldblistusers2 -f /etc/libvirt/passwd.db
xujun@kvm: userPassword

顺便说下,要删除某个账号只需要执行 saslpasswd2 -a libvirt -d <用户名>  即可。

 

至此,sasl库设置完毕,接着就要修改LibVirt的配置文件,使其支持TCP连接,打开/etc/libvirt/libvirtd.conf,去掉以下几行前的注释,同时将listen_addr参数的值修改为 0.0.0.0

listen_tls = 0
listen_tcp = 1
tcp_port = "16509"
listen_addr = "0.0.0.0"
auth_tcp = "sasl"

 

接着,重启LibVirt服务

# service libvirtd restart

不知道大家重启完LibVirt服务后,刚才做的设置有没有生效,反正我是没生效。此时可以修改 /etc/default/libvirtd ,将文件修改为如下:

# Defaults for libvirtd initscript (/etc/init.d/libvirtd)
# This is a POSIX shell fragment# Start libvirtd to handle qemu/kvm:
start_libvirtd="yes"# options passed to libvirtd, add "-l" to listen on tcp
libvirtd_opts="-l"# pass in location of kerberos keytab
#export KRB5_KTNAME=/etc/libvirt/libvirt.keytab# Whether to mount a systemd like cgroup layout (only
# useful when not running systemd)
#mount_cgroups=yes
# Which cgroups to mount
#cgroups="memory devices"

再一次重启LibVirt服务后,LibVirtd即监听16509端口(可使用telnet测试)

 

如需测试验证是否工作正常,可使用virsh工具测试,能看到平台信息,即表示LibVirt监听端口正常并且Sasl验证工作正常

# virsh -c qemu+tcp://127.0.0.1/system nodeinfo
Please enter your authentication name: <你设置用户名@kvm所在的主机名>
Please enter your password: <你指定的密码>
CPU model: x86_64
CPU(s): 4
CPU frequency: 799 MHz
CPU socket(s): 1
Core(s) per socket: 2
Thread(s) per core: 2
NUMA cell(s): 1
Memory size: 16350700 KiB                                新视.技术博客 - blog.nvacg.org

 

现在,到WebVirtMgr中添加TCP连接即可

 

添加后看到刚才添加的TCP连接显示为浅绿色即表示连接成功

 

其他需要WebVirtMgr管理的KVM主机全部按上述操作即可。

 


  请注意,本站的所有文章均要求阁下在转载时注明出处和原作者,阁下转载本站文章即表示阁下同意并遵守此规程,除非特别注明转载出处,否则文章即为其发布者所著。本站及文章作者保留文章的著作权并有权在阁下违反上述规程时予以追究。

本文链接地址: 部署包含Web管理界面的KVM

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*