KVM虚拟化管理平台的实现

Posted 杰哥生产厂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KVM虚拟化管理平台的实现相关的知识,希望对你有一定的参考价值。

KVM虚拟化管理平台的实现

源码链接:https://github.com/wsjhk/IaaS_admin.git

视频演示链接:https://v.youku.com/v_show/id_XMjg4MTczODU1Ng==.html

(N年前刚开始学习Python时做的第一个自主设计实现项目,代码实在写的烂,不喜勿喷!)

根据KVM虚拟化管理的要求,设计并实现网页操作管理KVM虚拟机。设计原理架构如下图所示:

 KVM虚拟化管理平台的实现


如上图所示,前台使用python的FLASK框架实现主程序和各个功能网页,通过Redis的发布订阅功能,实现前台和后台的交互,前台网页触发操作,发布操作到Redis的channel中,后台监听到操作之后触发执行对应的shell脚本文件对虚拟机进行操作,包括:创建虚拟机,删除虚拟机,开启虚拟机,关闭虚拟机,重启虚拟机,在线修改虚拟机的内存和CPU参数,在线添加和删除虚拟机磁盘以及虚拟机的在线迁移。其中,KVM宿主机的操作系统制作虚拟机是基于LVM分区的快照功能,实现虚拟机的快速创建和销毁。需要制作好各种操作系统的母盘。母盘的制作包括,安装对应的操作系统,安装VNC服务,安装SSH服务并设置服务开机自启动。其中,linux操作系统支持VNC和SSH两种远程方式,windows操作系统只支持VNC远程,也可以使用windows自带的桌面远程工具进行远程操作。以下是具体的实现:

 

1.前台具体实现:
根据要求实现如下功能设计图:

KVM虚拟化管理平台的实现
前台是基于python的FLASK框架实现的,Flask是一个基于Python的web框架,它的设计目的是提供Web开发所需的最小功能子集。
Flask与别的框架(尤其是采用其他编程语言的框架)的不同之处在于:它没有绑定诸如数据库查询或者表单处理等功能库,以及它们所组成的整个生态系统。它倾向于对这些功能的实现方式不做任何限定。
这种系统带来的主要好处是:开发者能够使用他们想用的任何方式和工具,去设计他们的应用架构。另外,对于一些常见的通用功能,Flask没有以某种特定方式去实现,这意味着在Flask中,对标准库的使用会比其他框架里多,这保证了通用功能的稳定性及针对其他Python程序员的可读性。由于Flask社区十分庞大,所以该社区提供的添加通用功能的方式非常多。所以通过本系列教程,了解它们如何帮助我们避免重复造轮子。这些扩展的妙处在于,如果不需要那些额外的功能,就不用引入它们,这样我们的应用才会保持简洁、轻量。
这种系统的最大弊端是,大部分新的Flask用户不知道如何正确地规划大型应用的结构,最后弄出一大堆让人难以理解和维护的代码。所以本教程另一个重点是如何为Flask应用创建模型/视图/控制器(MVC)架构。
安装flask
安装flassk很简单,使用pip安装.
#pip install flask
本系统使用了FLASK的路由功能实现的,Flask是一个WSGI应用框架,这意味着我们进行Flask开发时,不需要 关注网络方面的操作,Flask应用的入口是封装过的网络请求包,出口是 网络响应,我们仅需要关注这个阶段内的处理逻辑。

WSGI服务器 :Flask虽然内置了简单的WSGI服务器,但其性能仅仅适用于开发期的调试。Flask官网推荐了多种WSGI服务器,实现方式从多进程到多线程到协程, 这方面的选择我们在本课程中将不涉及。

REST适应性 :虽然Flask和Django一样,最初的出发点都是服务端的动态网页应用。但 Flask的设计使之也相当适用于面向资源的REST架构,在越来越移动化 并且单页应用越来越重要的WEB开发领域,这是Flask相对于Django相当 大的优势。
编写一个基于Flask的hello world相当容易:
1)导入Flask类
from flask import Flask
Flask类是Flask框架的核心类,它实现了WSGI应用规范。
2)创建Flask实例
app = Flask(__name__)
Flask构造函数的第一个参数指定一个引入名/importname。Flask框架 使用这个名字进行静态资源、模板、错误信息的定位。除非你清楚的理解它的 作用,通常情况下,我们总应该使用特殊变量_name。
Flask实例是可调用的(具有call方法),这个实例可以直接对接 WSGI服务器。
3)注册路由

@route('/')
def index():
return 'Hello,Flask!'
注册路由就是建立URL规则和处理函数之间的关联。Flask框架依赖于路由 完成HTTP请求的分发。
路由中的函数被称为视图函数,其返回值将作为HTTP响应的正文内容。
4)对接并启动WSGI服务器
Flask封装了一个简单的开发用WSGI服务器,我们可以通过调用run() 启动服务器运行:
app.run(host='0.0.0.0',port=80)

至此,可以使用FLASK的route功能进行开发了。

前台工程框架代码结构,如下图所示:

 KVM虚拟化管理平台的实现

代码结构:

 KVM虚拟化管理平台的实现

其中,KVM是主程序,使用FLASK框架的route功能实现url的跳转访问对应的html页面。如登录后跳转到首页的关键代码:
@app.route('/index', methods=['GET','POST'])
def index():
username = request.cookies.get('username')
if not username:
return "please login!!!"
islogin = session.get('islogin')
if request.method == 'POST':
response = make_response(redirect('/vm_create'))
response.set_cookie('username', value=username, max_age=300)
session['islogin'] = '1'
return response
else:
return render_template('index.html',username=username,islogin=islogin)

接下来是前台页面的设计,登录页使用html和CSS实现,如下图所示为login.html的实现:

KVM虚拟化管理平台的实现
登录之后跳转到首页index.html页面:

KVM虚拟化管理平台的实现

之后就可以使用KVM Cloud系统创建并管理操作虚拟机了。
创建虚拟机页面的功能页面vm_create.html实现:
KVM虚拟化管理平台的实现
然后是虚拟机列表vm_list.html的实现,显示虚拟机列表和虚拟机的详细信息:
KVM虚拟化管理平台的实现
点击虚拟机名称可以跳转到虚拟机参数调整和操作功能vm_detail.html页面:
KVM虚拟化管理平台的实现
如果在vm_list.html页面点击虚拟机的console对应列的远程操作,将可以页面远程并操作虚拟机,如下分别是linux的VNC远程方式界面,SSH远程方式界面,windows的VNC远程方式界面。
Linux的VNC远程:
KVM虚拟化管理平台的实现
Linux的SSH远程:
KVM虚拟化管理平台的实现
Windows的VNC远程:

KVM虚拟化管理平台的实现

然后是磁盘添加的实现,创建虚拟磁盘disk_create.html实现:
KVM虚拟化管理平台的实现
输入参数之后点击创建即可创建虚拟磁盘,然后跳转到磁盘列表disk_list.html页面:
KVM虚拟化管理平台的实现
如图,可以挂在磁盘到对应的虚拟机,卸载和删除磁盘。挂载之后可以通过fdisk -l命令查看虚拟机磁盘信息:

KVM虚拟化管理平台的实现
最后是虚拟机在线迁移功能vm_migrate.html界面的实现:
KVM虚拟化管理平台的实现
输入要迁移的虚拟机和要迁移的目标宿主机,点击迁移即可实现虚拟机的在线迁移。迁移成功之后页面会显示类似“迁移虚拟机成功”的字样。

 

5)启动redis:#redis-server redis.conf
6)停止redis实例
  /usr/local/redis/bin/redis-cli shutdown
  或者
  pkill redis-server
7)让redis开机自启
  vim /etc/rc.local
  加入
  /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis-conf

3.接下来是后台的具体实现:
后台实现包括两部分,一部分是KVM宿主机环境的搭建,另一部分是后台程序代码的功能实现。
一、 KVM宿主机环境的搭建:
KVM安装配置
1、准备工作
1.1 关闭iptables防火墙
[root@localhost ~]# service iptables stop //停止iptables
1.2 CPU开通支持虚拟化
需要在Bios中开启虚拟化,一般是默认开启的
2、安装kvm虚拟机
2.1) 查看CPU是否支持kvm完全虚拟机
[root@localhost ~]# cat /proc/cpuinfo | grep 'vmx' //Intel CPU判断方法
[root@localhost ~]# cat /proc/cpuinfo | grep 'svm' //AMD CPU判断方法
根据对应的CPU型号进行选择判断方法,如果能出现信息 ,就说明CPU支持KVM完全虚拟机
2.2) 安装kvm和其它虚拟化所需管理软件包
[root@localhost ~]# yum install -y kvm virt-* libvirts bridge-utils qemu-img
软件包名称介绍:
kvm:软件包中含有KVM内核模块,它在默认linux内核中提供kvm管理程序
libvirts:安装虚拟机管理工具,使用virsh等命令来管理和控制虚拟机
bridge-utils:设置网络网卡桥接
virt-*:创建、克隆虚拟机命令,使用qemu命令来创建磁盘等。
qemu-img:安装qemu组件,使用qemu命令来创建磁盘等。
2.3) 加载kvm模块,查看kvm模块是否被加载
[root@localhost ~]# modprobe kvm-intel //加载kvm模块
[root@localhost ~]# lsmod | grep kvm //查看kvm模块是否被加载
2.4) 重启确认kvm是否被加载
[root@localhost ~]# reboot //重启
[root@localhost ~]# lsmod | grep kvm //查看kvm模块是否被加载
2.5) 查看已打开虚拟机列表
[root@localhost ~]# virsh list //查看虚拟机列表,如果有的话,就会显示出来
2.6) 配置eth0、br0网卡
[eth0网卡]
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=74:D4:35:87:71:02
TYPE=Ethernet
UUID=723095b7-27d1-4f88-aa5f-5aa6b0472fbc
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
BRIDGE=br0
[br0网卡]
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE=Bridge
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=172.16.10.23
NETMASK=255.255.255.0
GATEWAY=172.16.10.254
DNS1=202.96.128.86
大家可以看着我的配置来进行修改,
2.7) 查看目前所有的网桥接口
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.74d435877102 no eth0
virbr0 8000.5254005ce327 yes virbr0-nic
(如果eth0没有挂载br0上就要使用命令:#brctl addif br0 eth0 将其挂上去即可)
2.8 修改VNC服务器的配置文件
[root@localhost ~]# vim /etc/libvirt/qemu.conf
将 vnc_listen = "0.0.0.0" 前面的#号注释去掉 //在文件的第12行
2.9) 重启libvirtd和messagebus服务
[root@localhost ~]# /etc/init.d/libvirtd restart //重启libvirtd服务
Stopping libvirtd daemon: [ OK ]
Starting libvirtd daemon: [ OK ]
(若出现重启libvirtd服务失败,libvirtd: relocation error: libvirtd: symbol dm_task_get_info_with_deferred_remove, version Base not defined in file libdevmapper.so.1.02 with link time reference,则执行:yum -y upgrade device-mapper-libs之后重启libvirtd服务即可)
[root@localhost ~]# /etc/init.d/messagebus restart //重启messagebus服务
Stopping system message bus: [ OK ]
Starting system message bus: [ OK ]
3、 在宿主机上创建、安装kvm虚拟机
使用lvm安装虚拟机,制作镜像系统。然后创建快照来备份和快速复制启动虚拟机。
#vgrename /dev/kvm /dev/vg01
#lvcreate -L 8G -n s_centos01 vg01
#virt-install -n centos_mupan -r 2048 -vcpus=1 -s 10 -c /data/iso/centos.iso --hvm --os-type=linux -f /dev/vg01/centos_mupan --bridge=br0 --graphics vnc --force --autostart &
#lvcreate -s -L 2G -n s_centos01 /dev/vg01/centos_mupan
创建虚拟机快照之后,编写kvm启动的s_centos01.xml文件指定source设备是s_centos01,修改uuid,mac和name。然后
#virsh define s_ubuntu01.xml来启动虚拟机。
#virsh start s_ubuntu01
二、后台功能实现:

如图是代码的结构图:

KVM虚拟化管理平台的实现

目录结构是:

 

其中,主程序文件是KVM.py文件,实现监听Redis并执行shell脚本返回结果发布到Redis中。vm_info.list文件记录了创建虚拟机时的状态信息列表,vm_list文件记录了虚拟机当前在KVM宿主机的状态列表。Disk_list文件记录了磁盘的状态信息列表。如下:
#cat vm_info.list
xp01 1 2048000 10 Windows_xp running
centos 1 2048000 10 Linux_CentOS running
#cat vm_list
centos|192.168.0.105|1|2048000|centos|running
xp01|192.168.0.133|1|2048000|winxp|running
#cat vm_list
sdb|10|unuse
其次,前台页面VNC远程虚拟机需要在宿主机安装noVNC程序做代理,建立连接代理到虚拟机的VNC服务端口,才可以在页面实现websockity的访问。以下是建立连接代理的监听脚本start_vm_vnc.sh,虚拟机母盘制作都默认使用5901作为VNC服务的监听端口:

页面的SSH远程访问Linux使用了shellinabox开源工具实现,在linux母盘中安装并设置开机启动即可,基于母盘创建的虚拟也会有了。Shellinabox安装如下:
部署shellinabox:
1) 安装依赖:
#yum install git openssl-devel pam-devel zlib-devel autoconf automake libtool
2)获取源代码:
#git clone https://github.com/shellinabox/shellinabox.git && cd shellinabox
3)生成编译配置信息:
#autoreconf -i
4)配置和编译:
#./configure && make
5)安装:
#make install
6)配置生成安全证书:
#openssl genrsa -des3 -out my.key 1024
#openssl req -new -key my.key -out my.csr
#cp my.key my.key.org
#openssl rsa -in my.key.org -out my.key
#openssl x509 -req -days 3650 -in my.csr -signkey my.key -out my.crt
#cat my.crt my.key > certificate.pem
7)启动:
#/usr/local/bin/shellinaboxd -c /root -u root -b
#/usr/local/bin/shellinaboxd --disable-ssl -c /root -u root -b(不使用https)
8)查看监听端口:
#netstat -ntpl |grep 4200
9)查看监听进程:
#ps -ef |grep shell
10)浏览器访问:
https://ip:4200

至此,KVM虚拟化管理系统前后台实现完成。



以上是关于KVM虚拟化管理平台的实现的主要内容,如果未能解决你的问题,请参考以下文章

搭建kvm虚拟化平台和管理kvm虚拟化平台

搭建kvm虚拟化平台和管理kvm虚拟化平台

搭建kvm虚拟化平台和管理kvm虚拟化平台

部署及管理KVM虚拟化平台

kvm虚拟化平台

部署KVM虚拟化平台