Salt Virt雲控制器功能最初是作爲Alpha技術添加到版本0.14.0中的Salt中的。
最初的Salt Virt系統支持以下核心雲操作:
- 虛擬機部署
- 檢查已部署的VM
- 虛擬機遷移
- 網絡分析
- 自動將VM與Salt的所有方面集成
- 鏡像預配置
當前正在開發許多功能,以增強Salt Virt系統的功能。
注意
值得注意的是,Salt最初就是爲了將Salt通信系統用作雲控制器的骨幹而開發的。 這意味着,Salt Virt系統不是事後纔想到的,而是一個作爲其他功能開發的支撐系統。 開發Salt的雲控制方面的最初嘗試是一個名爲butter的項目。 該項目並未取得成功,但發揮了作用,證明了Salt作爲雲控制器的早期可行性。
警告
Salt Virt不適用於管理在VM中運行的KVM。 KVM必須是直接在祼機硬件上運行的。
您也可以參考在Github上維護的這一份技術資料:Salt Virt
Salt Virt Tutorial
在教程部分中有一個有關如何啓動和運行Salt Virt的教程:
The Salt Virt Runner
與與雲控制器交互的是virt runner程序。 virt runner程序附帶有執行特定虛擬機例程的例程。
Runner模塊文檔中提供了virt runner的詳細參考文檔:
The Salt Virt Executor
virt Executor執行程序,提供了大量的創建與管理虛擬機的功能函數。
Executor模塊文檔中提供了virt executor的詳細參考文檔:
Based on Live State Data
Salt Virt系統基於使用Salt查詢有關虛擬機管理程序的實時數據,然後使用收集的數據來做出有關雲操作的決策的基礎。 這意味着運行Salt Virt不需要外部資源,並且收集的有關雲的信息是實時且準確的。
Deploy for Network or Disk
Virtual Machine Disk Profiles - 虛機的磁盤配置
Salt Virt允許對爲部署的虛擬機創建的磁盤進行精細配置。 配置是一個簡單的數據結構,可從config.option
函數讀取,這意味着該配置可以存儲在minion配置文件、master配置文件或minion的pillar中。
此配置選項稱爲virt.disk
。 默認的virt.disk
數據結構如下所示:
virt.disk:
default:
- system:
size: 8192
format: qcow2
model: virtio
注意
格式和模型均不需要定義,Salt將默認爲基礎虛擬機管理程序使用的最佳格式,在kvm的情況下,它是qcow2和virtio。
此配置將設置一個名爲default的磁盤配置文件。 該配置文件將在虛擬機上創建一個系統磁盤。
Define More Profiles - 定義和使用更多的磁盤配置方案
許多環境將需要使用更復雜的磁盤配置文件,並且可能需要多個配置文件,而這可以輕鬆實現:
virt.disk:
default:
- system:
size: 8192
database:
- system:
size: 8192
- data:
size: 30720
web:
- system:
size: 1024
- logs:
size: 5120
以上配置允許在部署虛機時選擇使用這三個配置方案之一,從而可以根據部署的虛擬機的不同存儲需求創建虛擬機。
Virtual Machine Network Profiles - 虛機的網絡配置
Salt Virt允許對爲部署的虛擬機創建的網絡設備進行精細配置。 配置是一個簡單的數據結構,可從config.option
函數讀取,這意味着該配置可以存儲在minion配置文件、master配置文件或minion的pillar中。
此配置選項稱爲virt: nic
。 默認情況下,virt: nic
選項爲空,其默認的數據結構如下所示:
virt:
nic:
default:
eth0:
bridge: br0
model: virtio
注意
無需定義驅動模型,Salt將默認爲基礎虛擬機管理程序使用最佳的驅動模型,對於kvm而言,此驅動模型爲virtio
此配置設置了一個名爲default的網絡配置方案。 默認配置文件在虛擬機上創建單個以太網設備,該設備橋接到虛擬機管理程序的br0
接口。 此默認設置不需要設置virt: nic
配置,這就是爲什麼默認安裝僅需要在系統管理程序上設置br0
橋接設備的原因。
Define More Profiles - 更多的網絡配置方案
許多環境將需要更復雜的網絡配置方案,並且可能需要多個配置文件,這很容易實現:
virt:
nic:
dual:
eth0:
bridge: service_br
eth1:
bridge: storage_br
single:
eth0:
bridge: service_br
triple:
eth0:
bridge: service_br
eth1:
bridge: storage_br
eth2:
bridge: dmz_br
all:
eth0:
bridge: service_br
eth1:
bridge: storage_br
eth2:
bridge: dmz_br
eth3:
bridge: database_br
dmz:
eth0:
bridge: service_br
eth1:
bridge: dmz_br
database:
eth0:
bridge: service_br
eth1:
bridge: database_br
該配置文件中允許選擇六個配置方案之一,從而允許創建虛擬機,這些虛擬機根據部署的vm的需要連接到不同的網絡中。
Salt as a Cloud Controller - 將Salt作爲一個雲平臺控制器
在Salt 0.14.0中,引入了高級的cloud controll系統,該系統允許使用Salt直接管理私有云虛擬機。該系統通常稱爲"Salt Virt"。
Salt Virt系統已經存在並已安裝在Salt自身中,這意味着除了設置Salt之外,無需部署其他Salt代碼。
注意
需要依賴於
libvirt
python模塊和certtool
二進制文件。
Salt Virt的主要目標是提升雲平臺的簡易性和使用效率。可以擴展並具有云平臺的完整管理功能。 Salt Virt具有設置和管理複雜虛擬機網絡、強大的鏡像和磁盤管理以及使用或不使用共享存儲的虛擬機遷移的功能。
這意味着Salt Virt可用於從刀片服務器和SAN存儲創建雲主機,但是也可以在沒有單個共享存儲系統的情況下從大量Linux桌面中創建雲。 Salt Virt可以用真正的商業硬件創建雲,也可以支持使用很多的專用硬件。
Setting up Hypervisors - 設置虛擬機管理程序
設置系統管理程序的第一步涉及安裝正確的軟件並設置系統管理程序網絡接口。
Installing Hypervisor Software - 安裝虛擬機管理程序
Salt Virt
被確定爲與虛擬機管理程序無關,但是目前唯一完全實現的虛擬機管理程序是通過libvirt
運行的KVM
。
系統管理程序所需的軟件是libvirt
和kvm
。 要獲得高級功能,請安裝libguestfs
或qemu-nbd
。
注意
Libguestfs
和qemu-nbd
允許在啓動虛機之前掛載虛擬機鏡像,並進行預配置和預置一個Salt minion。
下面的sls將爲管理程序設置所需的軟件,並運行相關例程以設置libvirt pki密鑰。
注意
下面的軟件包名稱和使用的設置是特定於Red Hat的,不同平臺將需要不同的軟件包名稱
libvirt:
pkg.installed: []
file.managed:
- name: /etc/sysconfig/libvirtd
- contents: 'LIBVIRTD_ARGS="--listen"'
- require:
- pkg: libvirt
virt.keys:
- require:
- pkg: libvirt
service.running:
- name: libvirtd
- require:
- pkg: libvirt
- network: br0
- libvirt: libvirt
- watch:
- file: libvirt
libvirt-python:
pkg.installed: []
libguestfs:
pkg.installed:
- pkgs:
- libguestfs
- libguestfs-tools
Hypervisor Network Setup - 設置虛擬機管理程序的網絡
虛擬機管理程序將需要運行網橋以爲虛擬機提供網絡設備,下面的sls公式將在虛擬機管理程序上建立標準網橋,並將網橋連接到eth0:
eth0:
network.managed:
- enabled: True
- type: eth
- bridge: br0
br0:
network.managed:
- enabled: True
- type: bridge
- proto: dhcp
- require:
- network: eth0
Virtual Machine Network Setup - 設置虛擬機的網絡
Salt Virt帶有一個系統,可以對已部署的虛擬機使用的網絡接口進行建模。 默認情況下,將爲已部署的虛擬機創建一個接口,並將其橋接到br0。 要使用默認的網絡設置,請確保虛擬機管理程序上存在名爲br0的橋接接口並將其橋接到活動的網絡設備。
注意
要在Salt Virt中使用更高級的聯網,請閱讀Salt Virt Networking文檔:
Libvirt State
部署基於libvirt
的雲的挑戰之一是libvirt
證書的分發。 這些證書允許虛擬機遷移。 Salt附帶了用於自動部署這些證書的系統。 Salt管理簽名授權密鑰,爲主機上的libvirt
客戶端生成密鑰,並使用CA證書對其進行簽名,使用pillar進行分發。 這通過libvirt states
狀態進行管理。 只需在minion上執行以下sls公式即可確保證書分發到位並且是最新的:
注意
上面的sls公式已經包括了設置libvirt密鑰所需的調用。
libvirt_keys:
virt.keys
Getting Virtual Machine Images Ready - 準備好虛擬機使用的鏡像
Salt Virt要求提供預先準備好的虛擬機鏡像,因爲它們不是動態生成的。 根據基礎平臺的不同,生成這些虛擬機鏡像的方法也大不相同。
可以使用KVM手動創建虛擬機鏡像並通過安裝程序運行它,但是不建議執行此過程,因爲它非常依賴於手工且容易出錯。
生成虛擬機的應用程序可用於許多平臺:
kiwi: (openSUSE, SLES, RHEL, CentOS)
https://suse.github.io/kiwi/
vm-builder:
https://wiki.debian.org/VMBuilder
See also
一旦虛擬機鏡像可以使用了,使其對Salt Virt可用的最簡單方法是將其放置在Salt文件服務器中。 只需將鏡像複製到/srv/salt
中,即可被Salt Virt使用。
在本演示中,將使用文件名centos.img
。
Existing Virtual Machine Images - 一些已有的虛擬鏡像版本
許多現有的Linux發行版都分發可以與Salt Virt一起使用的虛擬機映像。 請注意 NONE OF THESE IMAGES ARE SUPPORTED BY SALTSTACK
.
CentOS
這些鏡像是爲OpenNebula準備的,但應該可以與Salt Virt毫無問題地工作,只需要原始的qcow鏡像文件: http://wiki.centos.org/Cloud/OpenNebula
Fedora Linux
在這裏可以找到爲 Fedora Linux 製作的虛機鏡像資源: https://alt.fedoraproject.org/cloud
openSUSE
http://download.opensuse.org/repositories/openSUSE:/Leap:/42.1:/Images/images
(look for JeOS-for-kvm-and-xen variant)
SUSE
https://www.suse.com/products/server/jeos
Ubuntu Linux
在這裏可以找到爲 Ubuntu Linux 製作的虛機鏡像資源: http://cloud-images.ubuntu.com/
Using Salt Virt - 使用Salt Virt創建虛擬機
設置好hypervisors虛擬機管理程序並準備好虛擬機鏡像後,Salt可以使用virt runner程序開始發佈雲命令。
首先運行Salt Virt虛擬機管理程序info命令:
salt-run virt.host_info
這將查詢正在運行的虛擬機監控程序以獲取統計信息,並顯示有用的信息,例如cpus數和內存量。
您還可以列出所有虛擬機管理程序節點上的所有VM及其當前狀態:
salt-run virt.list
現在確認虛擬機管理程序可以使用了,可以開始配置虛擬機。 調用virt.init
例程將創建一個新的虛擬機:
salt-run virt.init centos1 2 512 salt://centos.img
Salt Virt runner程序現在將自動選擇一個hypervisors管理程序,在其上部署新的虛擬機。使用salt://
假定CentOS虛擬機鏡像位於master服務器上的Salt文件服務器的根目錄中。克隆鏡像時(即從文件服務器檢索後本地複製),虛擬機hypervisors管理程序部分的目標目錄由virt:images
config選項確定;默認情況下,它是/srv/salt-images/
。
使用virt.init
初始化VM時,會使用cp.cache_file
將映像複製到虛擬機管理程序,將其掛載並使用minion做預設置,包括在新計算機上設置預先認證的密鑰。只有使用默認的seed.apply
參數在鏡像上找不到minion時,纔會安裝minion。
注意
啓動VM的最大瓶頸是何時需要安裝Salt Minion。確保源VM鏡像已經安裝了Salt將極大地加快虛擬機的部署。
您也可以通過使用絕對鏡像路徑直接調用virt執行模塊,將鏡像部署在特定的minion上。這對於測試可能非常方便:
salt 'hypervisor*' virt.init centos1 2 512 image=/var/lib/libvirt/images/centos.img
現在已經準備好新的虛擬機,可以通過virt.query
命令看到它:
salt-run virt.query
該命令將返回有關所有虛擬機管理程序和相應虛擬機的數據。
現在,新虛擬機已啓動,它應該已經與Salt Master聯繫,一個test.version
將顯示新虛擬機是否正在運行。
QEMU copy on write support - QEMU的寫時複製功能支持
爲了快速克隆鏡像,您可以使用qcow
磁盤鏡像格式。 將enable_qcow
標誌和.qcow2
鏡像路徑傳遞給virt.init
:
salt 'hypervisor*' virt.init centos1 2 512 image=/var/lib/libvirt/images/centos.qcow2 enable_qcow=True start=False
注意
請注意,克隆後嘗試過快引導qcow鏡像可能會導致競爭,在這種情況下libvirt可能會在鏡像的預配置完成之前嘗試引導計算機。 因此,建議也將
start=False
傳遞給virt.init
。還應知道的是,您必須先製作副本,然後再將所有疊加鏡像重新置於其上,然後才能修改原始基礎圖像。 請參閱
qemu-img rebase
使用文檔。
Migrating Virtual Machines - 遷移虛機
Salt Virt完全支持虛擬機遷移,並且在上述公式中使用libvirt狀態使遷移成爲可能。
需要一些東西來支持遷移。 最初設置時,許多操作系統都會打開防火牆,需要打開防火牆以允許libvirt和kvm交叉通信和執行遷移例程。 在基於Red Hat的虛擬機管理程序上,尤其需要在管理程序上打開端口16514:
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 16514 -j ACCEPT
注意
有關Linux發行版本特定的防火牆設置的更深入的信息可以閱讀:
Salt還需要打開virt:tunnel
選項。 該標誌告訴Salt可以通過libvirt TLS隧道安全地運行遷移並使用端口16514
。如果沒有virt:tunnel
,libvirt會在運行遷移時嘗試綁定到隨機端口。
要打開virt:tunnel
,只需將其應用於master配置文件:
virt:
tunnel: True
更新master配置後,重新啓動master配置並向minions發出命令以刷新pillar以接收變更:
salt * saltutil.refresh_modules
現在,可以運行遷移例程! 要遷移VM,只需運行Salt Virt遷移例程:
salt-run virt.migrate centos <new hypervisor>
VNC Consoles - VNC終端
儘管默認情況下未啓用,Salt Virt也可以設置一個VNC控制檯,以便打開遠程可視控制檯。 使用virt.init
創建新VM時,請傳遞enable_vnc=True
參數以爲新VM配置控制檯。
來自virt.query
例程的信息將顯示特定vm的vnc控制檯端口:
centos
CPU: 2
Memory: 524288
State: running
Graphics: vnc - hyper6:5900
Disk - vda:
Size: 2.0G
File: /srv/salt-images/ubuntu2/system.qcow2
File Format: qcow2
Nic - ac:de:48:98:08:77:
Source: br0
Type: bridge
這一行Graphics: vnc - hyper6:5900
持有關鍵的信息。 首先,在管理程序的防火牆中需要放行5900
的端口。 打開端口後,即可通過vncviewer
輕鬆打開控制檯:
vncviewer hyper6:5900
默認情況下,在這些端口上未設置VNC安全性措施,因此建議對它們進行防火牆保護並強制使用SSH隧道訪問這些VNC接口。 請記住,訪問同一VNC界面的任何其他用戶都可以查看被訪問的VNC界面上的活動,並且任何其他登錄用戶也可以與虛擬機上的已登錄用戶一起操作。
Conclusion - 結論
現在,隨着Salt Virt的運行,只需在新的裸機上運行上述狀態就可以無縫添加新的虛擬機管理程序,並且這些計算機資源將立即對Salt Virt可用。