[原创]KVM虚拟化管理平台的实现
KVM虛擬化管理平臺的實現(xiàn)
源碼鏈接:https://github.com/wsjhk/IaaS_admin.git
視頻演示鏈接:https://v.youku.com/v_show/id_XMjg4MTczODU1Ng==.html
根據(jù)KVM虛擬化管理的要求,設計并實現(xiàn)網(wǎng)頁操作管理KVM虛擬機。設計原理架構如下圖所示:
?
如上圖所示,前臺使用python的FLASK框架實現(xiàn)主程序和各個功能網(wǎng)頁,通過Redis的發(fā)布訂閱功能,實現(xiàn)前臺和后臺的交互,前臺網(wǎng)頁觸發(fā)操作,發(fā)布操作到Redis的channel中,后臺監(jiān)聽到操作之后觸發(fā)執(zhí)行對應的shell腳本文件對虛擬機進行操作,包括:創(chuàng)建虛擬機,刪除虛擬機,開啟虛擬機,關閉虛擬機,重啟虛擬機,在線修改虛擬機的內存和CPU參數(shù),在線添加和刪除虛擬機磁盤以及虛擬機的在線遷移。其中,KVM宿主機的操作系統(tǒng)制作虛擬機是基于LVM分區(qū)的快照功能,實現(xiàn)虛擬機的快速創(chuàng)建和銷毀。需要制作好各種操作系統(tǒng)的母盤。母盤的制作包括,安裝對應的操作系統(tǒng),安裝VNC服務,安裝SSH服務并設置服務開機自啟動。其中,linux操作系統(tǒng)支持VNC和SSH兩種遠程方式,windows操作系統(tǒng)只支持VNC遠程,也可以使用windows自帶的桌面遠程工具進行遠程操作。以下是具體的實現(xiàn):
?
1.前臺具體實現(xiàn):
根據(jù)要求實現(xiàn)如下功能設計圖:
前臺是基于python的FLASK框架實現(xiàn)的,Flask是一個基于Python的web框架,它的設計目的是提供Web開發(fā)所需的最小功能子集。
Flask與別的框架(尤其是采用其他編程語言的框架)的不同之處在于:它沒有綁定諸如數(shù)據(jù)庫查詢或者表單處理等功能庫,以及它們所組成的整個生態(tài)系統(tǒng)。它傾向于對這些功能的實現(xiàn)方式不做任何限定。
這種系統(tǒng)帶來的主要好處是:開發(fā)者能夠使用他們想用的任何方式和工具,去設計他們的應用架構。另外,對于一些常見的通用功能,Flask沒有以某種特定方式去實現(xiàn),這意味著在Flask中,對標準庫的使用會比其他框架里多,這保證了通用功能的穩(wěn)定性及針對其他Python程序員的可讀性。由于Flask社區(qū)十分龐大,所以該社區(qū)提供的添加通用功能的方式非常多。所以通過本系列教程,了解它們如何幫助我們避免重復造輪子。這些擴展的妙處在于,如果不需要那些額外的功能,就不用引入它們,這樣我們的應用才會保持簡潔、輕量。
這種系統(tǒng)的最大弊端是,大部分新的Flask用戶不知道如何正確地規(guī)劃大型應用的結構,最后弄出一大堆讓人難以理解和維護的代碼。所以本教程另一個重點是如何為Flask應用創(chuàng)建模型/視圖/控制器(MVC)架構。
安裝flask
安裝flassk很簡單,使用pip安裝.
#pip install flask
本系統(tǒng)使用了FLASK的路由功能實現(xiàn)的,Flask是一個WSGI應用框架,這意味著我們進行Flask開發(fā)時,不需要 關注網(wǎng)絡方面的操作,Flask應用的入口是封裝過的網(wǎng)絡請求包,出口是 網(wǎng)絡響應,我們僅需要關注這個階段內的處理邏輯。
WSGI服務器 :Flask雖然內置了簡單的WSGI服務器,但其性能僅僅適用于開發(fā)期的調試。 Flask官網(wǎng)推薦了多種WSGI服務器,實現(xiàn)方式從多進程到多線程到協(xié)程, 這方面的選擇我們在本課程中將不涉及。
REST適應性 :雖然Flask和Django一樣,最初的出發(fā)點都是服務端的動態(tài)網(wǎng)頁應用。但 Flask的設計使之也相當適用于面向資源的REST架構,在越來越移動化 并且單頁應用越來越重要的WEB開發(fā)領域,這是Flask相對于Django相當 大的優(yōu)勢。
編寫一個基于Flask的hello world相當容易:
1)導入Flask類
from flask import Flask
Flask類是Flask框架的核心類,它實現(xiàn)了WSGI應用規(guī)范。
2)創(chuàng)建Flask實例
app = Flask(__name__)
Flask構造函數(shù)的第一個參數(shù)指定一個引入名/importname。Flask框架 使用這個名字進行靜態(tài)資源、模板、錯誤信息的定位。除非你清楚的理解它的 作用,通常情況下,我們總應該使用特殊變量_name。
Flask實例是可調用的(具有call方法),這個實例可以直接對接 WSGI服務器。
3)注冊路由
@route('/')
def index():
return 'Hello,Flask!'
注冊路由就是建立URL規(guī)則和處理函數(shù)之間的關聯(lián)。Flask框架依賴于路由 完成HTTP請求的分發(fā)。
路由中的函數(shù)被稱為視圖函數(shù),其返回值將作為HTTP響應的正文內容。
4)對接并啟動WSGI服務器
Flask封裝了一個簡單的開發(fā)用WSGI服務器,我們可以通過調用run() 啟動服務器運行:
app.run(host='0.0.0.0',port=80)
至此,可以使用FLASK的route功能進行開發(fā)了。
前臺工程框架代碼結構,如下圖所示:
?
代碼結構:
?
其中,KVM是主程序,使用FLASK框架的route功能實現(xiàn)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實現(xiàn),如下圖所示為login.html的實現(xiàn):
登錄之后跳轉到首頁index.html頁面:
之后就可以使用KVM Cloud系統(tǒng)創(chuàng)建并管理操作虛擬機了。
創(chuàng)建虛擬機頁面的功能頁面vm_create.html實現(xiàn):
然后是虛擬機列表vm_list.html的實現(xiàn),顯示虛擬機列表和虛擬機的詳細信息:
點擊虛擬機名稱可以跳轉到虛擬機參數(shù)調整和操作功能vm_detail.html頁面:
如果在vm_list.html頁面點擊虛擬機的console對應列的遠程操作,將可以頁面遠程并操作虛擬機,如下分別是linux的VNC遠程方式界面,SSH遠程方式界面,windows的VNC遠程方式界面。
Linux的VNC遠程:
Linux的SSH遠程:
Windows的VNC遠程:
然后是磁盤添加的實現(xiàn),創(chuàng)建虛擬磁盤disk_create.html實現(xiàn):
輸入?yún)?shù)之后點擊創(chuàng)建即可創(chuàng)建虛擬磁盤,然后跳轉到磁盤列表disk_list.html頁面:
如圖,可以掛在磁盤到對應的虛擬機,卸載和刪除磁盤。掛載之后可以通過fdisk -l命令查看虛擬機磁盤信息:
最后是虛擬機在線遷移功能vm_migrate.html界面的實現(xiàn):
輸入要遷移的虛擬機和要遷移的目標宿主機,點擊遷移即可實現(xiàn)虛擬機的在線遷移。遷移成功之后頁面會顯示類似“遷移虛擬機成功”的字樣。
?
2.1.Redis發(fā)布訂閱實現(xiàn)原理:
發(fā)布訂閱中使用到的命令就只有三個:PUBLISH,SUBSCRIBE,PSUBSCRIBE
PUBLISH 用于發(fā)布消息
SUBSCRIBE 也叫頻道訂閱,用于訂閱某一特定的頻道
PSUBSCRIBE 也叫模式訂閱,用于訂閱某一組頻道,使用glob的方式,比如xxx-*可以匹配xxx-a,和xxx-b,xxx-ddd等等
關聯(lián)操作:
如果已經(jīng)存在訂閱者,則添加到鏈表的尾部
如果沒有訂閱者,那么創(chuàng)建頻道,然后添加訂閱者
刪除操作:
找到對應的鏈表,進行刪除
如果刪除后,鏈表為空,則刪除頻道
訂閱模式:
新建一個pubsubPattern結構
添加到鏈表的尾部
退訂模式:
查找相應的pubsubPattern然后刪除
發(fā)送消息:
將消息發(fā)送給channel頻道的所有訂閱者
遍歷整個pubsub_patterns表,查找匹配的模式,如果有一個或者多個模式與頻道匹配,將消息發(fā)送給pattern模式的訂閱者
相關命令:
查看所有的頻道:PUBSUB CHANNELS
查詢訂閱者的數(shù)量:PUBSUB NUMSUB
查詢服務器被訂閱者的數(shù)量: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的請求,如果不設置,那么將處理所有請求,在生產(chǎn)環(huán)節(jié)中最好設置該項
port:監(jiān)聽端口,默認為6379
timeout:設置客戶端連接時的超時時間,單位為秒
loglevel:等級分為4級,debug,revbose,notice和warning。生產(chǎn)環(huán)境下一般開啟notice
logfile:配置log文件地址,默認使用標準輸出,即打印在命令行終端的端口上
database:設置數(shù)據(jù)庫的個數(shù),默認使用的數(shù)據(jù)庫是0
save:設置redis進行數(shù)據(jù)庫鏡像的頻率
rdbcompression:在進行鏡像備份時,是否進行壓縮
dbfilename:鏡像備份文件的文件名
dir:數(shù)據(jù)庫鏡像備份的文件放置的路徑
slaveof:設置該數(shù)據(jù)庫為其他數(shù)據(jù)庫的從數(shù)據(jù)庫
masterauth:當主數(shù)據(jù)庫連接需要密碼驗證時,在這里設定
requirepass:設置客戶端連接后進行任何其他指定前需要使用的密碼
maxclients:限制同時連接的客戶端數(shù)量
maxmemory:設置redis能夠使用的最大內存
appendonly:開啟appendonly模式后,redis會把每一次所接收到的寫操作都追加到appendonly.aof文件中,當redis重新啟動時,會從該文件恢復出之前的狀態(tài)
appendfsync:設置appendonly.aof文件進行同步的頻率
vm_enabled:是否開啟虛擬內存支持
vm_swap_file:設置虛擬內存的交換文件的路徑
vm_max_momery:設置開啟虛擬內存后,redis將使用的最大物理內存的大小,默認為0
vm_page_size:設置虛擬內存頁的大小
vm_pages:設置交換文件的總的page數(shù)量
vm_max_thrrads:設置vm IO同時使用的線程數(shù)量
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.接下來是后臺的具體實現(xiàn):
后臺實現(xiàn)包括兩部分,一部分是KVM宿主機環(huán)境的搭建,另一部分是后臺程序代碼的功能實現(xiàn)。
一、 KVM宿主機環(huán)境的搭建:
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判斷方法
根據(jù)對應的CPU型號進行選擇判斷方法,如果能出現(xiàn)信息 ,就說明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:設置網(wǎng)絡網(wǎng)卡橋接
virt-*:創(chuàng)建、克隆虛擬機命令,使用qemu命令來創(chuàng)建磁盤等。
qemu-img:安裝qemu組件,使用qemu命令來創(chuàng)建磁盤等。
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網(wǎng)卡
[eth0網(wǎng)卡]
[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網(wǎng)卡]
[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 查看目前所有的網(wǎng)橋接口
[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 ]
(若出現(xiàn)重啟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,則執(zhí)行: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、 在宿主機上創(chuàng)建、安裝kvm虛擬機
使用lvm安裝虛擬機,制作鏡像系統(tǒng)。然后創(chuàng)建快照來備份和快速復制啟動虛擬機。
#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
創(chuàng)建虛擬機快照之后,編寫kvm啟動的s_centos01.xml文件指定source設備是s_centos01,修改uuid,mac和name。然后
#virsh define s_ubuntu01.xml來啟動虛擬機。
#virsh start s_ubuntu01
二、后臺功能實現(xiàn):
如圖是代碼的結構圖:
目錄結構是:
?
以下是各Shell腳本的功能說明:
1) create_linux_vm_xml.sh:
創(chuàng)建linux虛擬機xml配置信息腳本,將前臺參數(shù)傳遞給給腳本,腳本根據(jù)參數(shù)修改配置文件的name,cpu,memory,mac地址,啟動分區(qū)等等信息。并將生產(chǎn)的信息寫入以虛擬機名稱命名的xml文件中保存到指定的文件中。
2) create_window_vm_xml.sh:
創(chuàng)建windows虛擬機xml配置信息腳本,將前臺參數(shù)傳遞給給腳本,腳本根據(jù)參數(shù)修改配置文件的name,cpu,memory,mac地址,啟動分區(qū)等等信息。并將生產(chǎn)的信息寫入以虛擬機名稱命名的xml文件中保存到指定的文件中。
3) get_running_vm_info.sh:
獲取虛擬機當前狀態(tài)列表寫vm_list文件中的腳本,通過系統(tǒng)命令和virsh命令獲取虛擬機的狀態(tài),然后使用awk,sed,grep,wc和sort等工具分析提取需要的虛擬機信息組合成虛擬機前臺展示的信息保存到vm_list文件中。
4) start_vm_vnc.sh:
創(chuàng)建虛擬機IP的noVNC代理監(jiān)聽進程腳本,根據(jù)vm_list文件的虛擬機信息,提取出ip地址,根據(jù)IP地址啟動VNC的代理連接進程并后臺運行,改腳本每5秒鐘執(zhí)行一次,以保證每個ip都能及時建立連接。
5) delete_vm.sh:
刪除虛擬機腳本,刪除虛擬機時觸發(fā)的操作,刪除該虛擬機的狀態(tài),xml配置文件和lvm快照分區(qū)的一切信息。無法恢復,需謹慎操作。
6) create_disk.sh:
創(chuàng)建磁盤腳本,根據(jù)名稱和大小的參數(shù)在系統(tǒng)中創(chuàng)建虛擬磁盤,生成img鏡像磁盤文件和xml磁盤配置信息,將其保存到指定的文件夾中供虛擬機掛載時調用。
7) get_disk_info.sh:
獲取磁盤狀態(tài)列表并寫到disk_list文件中的腳本,通過系統(tǒng)命令和virsh命令獲取磁盤的狀態(tài),然后使用awk,sed,grep,wc和sort等工具分析提取需要的磁盤信息組合成磁盤前臺展示的信息保存到disk_list文件中。
8) mount_disk.sh
掛載磁盤到虛擬機腳本,通過觸發(fā)參數(shù)掛載指定的磁盤到指定的虛擬機中,并且改寫disk_list列表文件的信息,將該磁盤的狀態(tài)改為掛載的虛擬機名稱,表示該磁盤當前正在被哪個虛擬機使用,需要卸載之后才能分配給其他虛擬機使用。
9) umount_disk.sh:
卸載磁盤腳本,觸發(fā)操作從指定的虛擬機中卸載該磁盤,卸載之后改寫disk_list文件中的信息為unuse表示未被使用的狀態(tài),可以被其他虛擬機掛載使用。
10)delete_disk.sh:
刪除磁盤腳本,觸發(fā)操作,將該磁盤刪除。如果沒有被掛載是未使用的狀態(tài)則直接刪除該磁盤的xml配置文件和img鏡像文件,并改寫disk_list文件將其從中刪除;否則,將磁盤從虛擬機中卸載掉之后刪除該磁盤的xml配置文件和img鏡像文件,并改寫disk_list文件將其從中刪除。
11)migrate.sh:
遷移虛擬機腳本,觸發(fā)操作,傳遞虛擬機和目標宿主機作為參數(shù)執(zhí)行虛擬機的在線遷移操作,需要在目標宿主機中有同樣路徑和名稱的虛擬機分區(qū)磁盤,如果沒有,則會使用lvm命令創(chuàng)建指定的分區(qū)之后再做遷移操作。
12)RedisHelper.py:
redis連接python腳本,創(chuàng)建python程序和redis的連接并創(chuàng)建channel監(jiān)聽,通過該連接進行信息的發(fā)布和訂閱,實現(xiàn)前后臺的信息交互,實時性強。
13)KVM.py:
后臺python主監(jiān)聽進程腳本,監(jiān)聽redis,訂閱前臺發(fā)布的信息之后判斷執(zhí)行腳本觸發(fā)操作,并將操作的結果通過redis發(fā)布信息到chaneel中,反饋給前臺,是實現(xiàn)信息的交互。
其中,主程序文件是KVM.py文件,實現(xiàn)監(jiān)聽Redis并執(zhí)行shell腳本返回結果發(fā)布到Redis中。vm_info.list文件記錄了創(chuàng)建虛擬機時的狀態(tài)信息列表,vm_list文件記錄了虛擬機當前在KVM宿主機的狀態(tài)列表。Disk_list文件記錄了磁盤的狀態(tài)信息列表。如下:
#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服務端口,才可以在頁面實現(xiàn)websockity的訪問。以下是建立連接代理的監(jiān)聽腳本start_vm_vnc.sh,虛擬機母盤制作都默認使用5901作為VNC服務的監(jiān)聽端口:
頁面的SSH遠程訪問Linux使用了shellinabox開源工具實現(xiàn),在linux母盤中安裝并設置開機啟動即可,基于母盤創(chuàng)建的虛擬就也會有了。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)查看監(jiān)聽端口:
#netstat -ntpl |grep 4200
9)查看監(jiān)聽進程:
#ps -ef |grep shell
10)瀏覽器訪問:
https://ip:4200
至此,KVM虛擬化管理系統(tǒng)前后臺實現(xiàn)完成。
轉載于:https://www.cnblogs.com/wsjhk/p/7638269.html
總結
以上是生活随笔為你收集整理的[原创]KVM虚拟化管理平台的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 没排卵能做试管婴儿
- 下一篇: 风雨知同行的下一句是什么呢?