KVM虛擬化管理平臺的實現html
源碼連接:https://github.com/wsjhk/IaaS_admin.gitpython
視頻演示連接:https://v.youku.com/v_show/id_XMjg4MTczODU1Ng==.htmllinux
根據KVM虛擬化管理的要求,設計並實現網頁操做管理KVM虛擬機。設計原理架構以下圖所示:git
如上圖所示,前臺使用python的FLASK框架實現主程序和各個功能網頁,經過Redis的發佈訂閱功能,實現前臺和後臺的交互,前臺網頁觸發操做,發佈操做到Redis的channel中,後臺監聽到操做以後觸發執行對應的shell腳本文件對虛擬機進行操做,包括:建立虛擬機,刪除虛擬機,開啓虛擬機,關閉虛擬機,重啓虛擬機,在線修改虛擬機的內存和CPU參數,在線添加和刪除虛擬機磁盤以及虛擬機的在線遷移。其中,KVM宿主機的操做系統製做虛擬機是基於LVM分區的快照功能,實現虛擬機的快速建立和銷燬。須要製做好各類操做系統的母盤。母盤的製做包括,安裝對應的操做系統,安裝VNC服務,安裝SSH服務並設置服務開機自啓動。其中,linux操做系統支持VNC和SSH兩種遠程方式,windows操做系統只支持VNC遠程,也可使用windows自帶的桌面遠程工具進行遠程操做。如下是具體的實現:程序員
1.前臺具體實現:
根據要求實現以下功能設計圖:
github
前臺是基於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應用的入口是封裝過的網絡請求包,出口是 網絡響應,咱們僅須要關注這個階段內的處理邏輯。web
WSGI服務器 :Flask雖然內置了簡單的WSGI服務器,但其性能僅僅適用於開發期的調試。 Flask官網推薦了多種WSGI服務器,實現方式從多進程到多線程到協程, 這方面的選擇咱們在本課程中將不涉及。redis
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)註冊路由shell
@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是主程序,使用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的實現:
登陸以後跳轉到首頁index.html頁面:
以後就可使用KVM Cloud系統建立並管理操做虛擬機了。
建立虛擬機頁面的功能頁面vm_create.html實現:
而後是虛擬機列表vm_list.html的實現,顯示虛擬機列表和虛擬機的詳細信息:
點擊虛擬機名稱能夠跳轉到虛擬機參數調整和操做功能vm_detail.html頁面:
若是在vm_list.html頁面點擊虛擬機的console對應列的遠程操做,將能夠頁面遠程並操做虛擬機,以下分別是linux的VNC遠程方式界面,SSH遠程方式界面,windows的VNC遠程方式界面。
Linux的VNC遠程:
Linux的SSH遠程:
Windows的VNC遠程:
而後是磁盤添加的實現,建立虛擬磁盤disk_create.html實現:
輸入參數以後點擊建立便可建立虛擬磁盤,而後跳轉到磁盤列表disk_list.html頁面:
如圖,能夠掛在磁盤到對應的虛擬機,卸載和刪除磁盤。掛載以後能夠經過fdisk -l命令查看虛擬機磁盤信息:
最後是虛擬機在線遷移功能vm_migrate.html界面的實現:
輸入要遷移的虛擬機和要遷移的目標宿主機,點擊遷移便可實現虛擬機的在線遷移。遷移成功以後頁面會顯示相似「遷移虛擬機成功」的字樣。
2.1.Redis發佈訂閱實現原理:
發佈訂閱中使用到的命令就只有三個:PUBLISH,SUBSCRIBE,PSUBSCRIBE
PUBLISH 用於發佈消息
SUBSCRIBE 也叫頻道訂閱,用於訂閱某一特定的頻道
PSUBSCRIBE 也叫模式訂閱,用於訂閱某一組頻道,使用glob的方式,好比xxx-*能夠匹配xxx-a,和xxx-b,xxx-ddd等等
關聯操做:
若是已經存在訂閱者,則添加到鏈表的尾部
若是沒有訂閱者,那麼建立頻道,而後添加訂閱者
刪除操做:
找到對應的鏈表,進行刪除
若是刪除後,鏈表爲空,則刪除頻道
訂閱模式:
新建一個pubsubPattern結構
添加到鏈表的尾部
退訂模式:
查找相應的pubsubPattern而後刪除
發送消息:
將消息發送給channel頻道的全部訂閱者
遍歷整個pubsub_patterns表,查找匹配的模式,若是有一個或者多個模式與頻道匹配,將消息發送給pattern模式的訂閱者
相關命令:
查看全部的頻道:PUBSUB CHANNELS
查詢訂閱者的數量:PUBSUB NUMSUB
查詢服務器被訂閱者的數量:PUBSUB NUMPAT
2.2.Redis安裝:
1.)將其下載到/opt目錄下解壓並進入目錄。
2)編譯源程序
make
cd src
make install PREFIX=/usr/local/redis
3.)接下來咱們看看/usr/local/redis/bin目錄下的幾個文件是什麼
redis-benchmark:redis性能測試工具
redis-check-aof:檢查aof日誌的工具
redis-check-dump:檢查rdb日誌的工具
redis-cli:鏈接用的客戶端
redis-server:redis服務進程
4.)Redis的配置
daemonize:如須要在後臺運行,把該項的值改成yes
pdifile:把pid文件放在/var/run/redis.pid,能夠配置到其餘地址
bind:指定redis只接收來自該IP的請求,若是不設置,那麼將處理全部請求,在生產環節中最好設置該項
port:監聽端口,默認爲6379
timeout:設置客戶端鏈接時的超時時間,單位爲秒
loglevel:等級分爲4級,debug,revbose,notice和warning。生產環境下通常開啓notice
logfile:配置log文件地址,默認使用標準輸出,即打印在命令行終端的端口上
database:設置數據庫的個數,默認使用的數據庫是0
save:設置redis進行數據庫鏡像的頻率
rdbcompression:在進行鏡像備份時,是否進行壓縮
dbfilename:鏡像備份文件的文件名
dir:數據庫鏡像備份的文件放置的路徑
slaveof:設置該數據庫爲其餘數據庫的從數據庫
masterauth:當主數據庫鏈接須要密碼驗證時,在這裏設定
requirepass:設置客戶端鏈接後進行任何其餘指定前須要使用的密碼
maxclients:限制同時鏈接的客戶端數量
maxmemory:設置redis可以使用的最大內存
appendonly:開啓appendonly模式後,redis會把每一次所接收到的寫操做都追加到appendonly.aof文件中,當redis從新啓動時,會從該文件恢復出以前的狀態
appendfsync:設置appendonly.aof文件進行同步的頻率
vm_enabled:是否開啓虛擬內存支持
vm_swap_file:設置虛擬內存的交換文件的路徑
vm_max_momery:設置開啓虛擬內存後,redis將使用的最大物理內存的大小,默認爲0
vm_page_size:設置虛擬內存頁的大小
vm_pages:設置交換文件的總的page數量
vm_max_thrrads:設置vm IO同時使用的線程數量
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宿主機環境的搭建,另外一部分是後臺程序代碼的功能實現。
1、 KVM宿主機環境的搭建:
KVM安裝配置
一、準備工做
1.1 關閉iptables防火牆
[root@localhost ~]# service iptables stop //中止iptables
1.2 CPU開通支持虛擬化
須要在BIOS中開啓虛擬化,通常是默認開啓的
二、安裝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 ]
三、 在宿主機上建立、安裝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
2、後臺功能實現:
如圖是代碼的結構圖:
目錄結構是:
如下是各Shell腳本的功能說明:
1) create_linux_vm_xml.sh:
建立linux虛擬機xml配置信息腳本,將前臺參數傳遞給給腳本,腳本根據參數修改配置文件的name,cpu,memory,mac地址,啓動分區等等信息。並將生產的信息寫入以虛擬機名稱命名的xml文件中保存到指定的文件中。
2) create_window_vm_xml.sh:
建立windows虛擬機xml配置信息腳本,將前臺參數傳遞給給腳本,腳本根據參數修改配置文件的name,cpu,memory,mac地址,啓動分區等等信息。並將生產的信息寫入以虛擬機名稱命名的xml文件中保存到指定的文件中。
3) get_running_vm_info.sh:
獲取虛擬機當前狀態列表寫vm_list文件中的腳本,經過系統命令和virsh命令獲取虛擬機的狀態,而後使用awk,sed,grep,wc和sort等工具分析提取須要的虛擬機信息組合成虛擬機前臺展現的信息保存到vm_list文件中。
4) start_vm_vnc.sh:
建立虛擬機IP的noVNC代理監聽進程腳本,根據vm_list文件的虛擬機信息,提取出ip地址,根據IP地址啓動VNC的代理鏈接進程並後臺運行,改腳本每5秒鐘執行一次,以保證每一個ip都能及時創建鏈接。
5) delete_vm.sh:
刪除虛擬機腳本,刪除虛擬機時觸發的操做,刪除該虛擬機的狀態,xml配置文件和lvm快照分區的一切信息。沒法恢復,需謹慎操做。
6) create_disk.sh:
建立磁盤腳本,根據名稱和大小的參數在系統中建立虛擬磁盤,生成img鏡像磁盤文件和xml磁盤配置信息,將其保存到指定的文件夾中供虛擬機掛載時調用。
7) get_disk_info.sh:
獲取磁盤狀態列表並寫到disk_list文件中的腳本,經過系統命令和virsh命令獲取磁盤的狀態,而後使用awk,sed,grep,wc和sort等工具分析提取須要的磁盤信息組合成磁盤前臺展現的信息保存到disk_list文件中。
8) mount_disk.sh
掛載磁盤到虛擬機腳本,經過觸發參數掛載指定的磁盤到指定的虛擬機中,而且改寫disk_list列表文件的信息,將該磁盤的狀態改成掛載的虛擬機名稱,表示該磁盤當前正在被哪一個虛擬機使用,須要卸載以後才能分配給其餘虛擬機使用。
9) umount_disk.sh:
卸載磁盤腳本,觸發操做從指定的虛擬機中卸載該磁盤,卸載以後改寫disk_list文件中的信息爲unuse表示未被使用的狀態,能夠被其餘虛擬機掛載使用。
10)delete_disk.sh:
刪除磁盤腳本,觸發操做,將該磁盤刪除。若是沒有被掛載是未使用的狀態則直接刪除該磁盤的xml配置文件和img鏡像文件,並改寫disk_list文件將其從中刪除;不然,將磁盤從虛擬機中卸載掉以後刪除該磁盤的xml配置文件和img鏡像文件,並改寫disk_list文件將其從中刪除。
11)migrate.sh:
遷移虛擬機腳本,觸發操做,傳遞虛擬機和目標宿主機做爲參數執行虛擬機的在線遷移操做,須要在目標宿主機中有一樣路徑和名稱的虛擬機分區磁盤,若是沒有,則會使用lvm命令建立指定的分區以後再作遷移操做。
12)RedisHelper.py:
redis鏈接python腳本,建立python程序和redis的鏈接並建立channel監聽,經過該鏈接進行信息的發佈和訂閱,實現先後臺的信息交互,實時性強。
13)KVM.py:
後臺python主監聽進程腳本,監聽redis,訂閱前臺發佈的信息以後判斷執行腳本觸發操做,並將操做的結果經過redis發佈信息到chaneel中,反饋給前臺,是實現信息的交互。
其中,主程序文件是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虛擬化管理系統先後臺實現完成。