Salt Virt云控制器功能最初是作为Alpha技术添加到版本0.14.0中的Salt中的。
最初的Salt Virt系统支持以下核心云操作:
当前正在开发许多功能,以增强Salt Virt系统的功能。
注意
值得注意的是,Salt最初就是为了将Salt通信系统用作云控制器的骨干而开发的。 这意味着,Salt Virt系统不是事后才想到的,而是一个作为其他功能开发的支撑系统。 开发Salt的云控制方面的最初尝试是一个名为butter的项目。 该项目并未取得成功,但发挥了作用,证明了Salt作为云控制器的早期可行性。
警告
Salt Virt不适用于管理在VM中运行的KVM。 KVM必须是直接在祼机硬件上运行的。
您也可以参考在Github上维护的这一份技术资料:Salt Virt
在教程部分中有一个有关如何启动和运行Salt Virt的教程:
Cloud Controller Tutorial
与与云控制器交互的是virt runner程序。 virt runner程序附带有执行特定虚拟机例程的例程。
Runner模块文档中提供了virt runner的详细参考文档:
Virt Runner Reference
virt Executor执行程序,提供了大量的创建与管理虚拟机的功能函数。
Executor模块文档中提供了virt executor的详细参考文档:
Salt Virt Executor Reference
Salt Virt系统基于使用Salt查询有关虚拟机管理程序的实时数据,然后使用收集的数据来做出有关云操作的决策的基础。 这意味着运行Salt Virt不需要外部资源,并且收集的有关云的信息是实时且准确的。
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的磁盘配置文件。 该配置文件将在虚拟机上创建一个系统磁盘。
许多环境将需要使用更复杂的磁盘配置文件,并且可能需要多个配置文件,而这可以轻松实现:
virt.disk:
default:
- system:
size: 8192
database:
- system:
size: 8192
- data:
size: 30720
web:
- system:
size: 1024
- logs:
size: 5120
以上配置允许在部署虚机时选择使用这三个配置方案之一,从而可以根据部署的虚拟机的不同存储需求创建虚拟机。
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
桥接设备的原因。
许多环境将需要更复杂的网络配置方案,并且可能需要多个配置文件,这很容易实现:
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 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可以用真正的商业硬件创建云,也可以支持使用很多的专用硬件。
设置系统管理程序的第一步涉及安装正确的软件并设置系统管理程序网络接口。
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
虚拟机管理程序将需要运行网桥以为虚拟机提供网络设备,下面的sls公式将在虚拟机管理程序上建立标准网桥,并将网桥连接到eth0:
eth0:
network.managed:
- enabled: True
- type: eth
- bridge: br0
br0:
network.managed:
- enabled: True
- type: bridge
- proto: dhcp
- require:
- network: eth0
Salt Virt带有一个系统,可以对已部署的虚拟机使用的网络接口进行建模。 默认情况下,将为已部署的虚拟机创建一个接口,并将其桥接到br0。 要使用默认的网络设置,请确保虚拟机管理程序上存在名为br0的桥接接口并将其桥接到活动的网络设备。
注意
要在Salt Virt中使用更高级的联网,请阅读Salt Virt Networking文档:
Salt Virt Networking
部署基于libvirt
的云的挑战之一是libvirt
证书的分发。 这些证书允许虚拟机迁移。 Salt附带了用于自动部署这些证书的系统。 Salt管理签名授权密钥,为主机上的libvirt
客户端生成密钥,并使用CA证书对其进行签名,使用pillar进行分发。 这通过libvirt states
状态进行管理。 只需在minion上执行以下sls公式即可确保证书分发到位并且是最新的:
注意
上面的sls公式已经包括了设置libvirt密钥所需的调用。
libvirt_keys:
virt.keys
Salt Virt要求提供预先准备好的虚拟机镜像,因为它们不是动态生成的。 根据基础平台的不同,生成这些虚拟机镜像的方法也大不相同。
可以使用KVM手动创建虚拟机镜像并通过安装程序运行它,但是不建议执行此过程,因为它非常依赖于手工且容易出错。
生成虚拟机的应用程序可用于许多平台:
kiwi: (openSUSE, SLES, RHEL, CentOS)
https://suse.github.io/kiwi/
vm-builder:
https://wiki.debian.org/VMBuilder
See also
vmbuilder-formula
一旦虚拟机镜像可以使用了,使其对Salt Virt可用的最简单方法是将其放置在Salt文件服务器中。 只需将镜像复制到/srv/salt
中,即可被Salt Virt使用。
在本演示中,将使用文件名centos.img
。
许多现有的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/
设置好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
将显示新虚拟机是否正在运行。
为了快速克隆镜像,您可以使用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
使用文档。
Salt Virt完全支持虚拟机迁移,并且在上述公式中使用libvirt状态使迁移成为可能。
需要一些东西来支持迁移。 最初设置时,许多操作系统都会打开防火墙,需要打开防火墙以允许libvirt和kvm交叉通信和执行迁移例程。 在基于Red Hat的虚拟机管理程序上,尤其需要在管理程序上打开端口16514:
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 16514 -j ACCEPT
注意
有关Linux发行版本特定的防火墙设置的更深入的信息可以阅读:
Opening the Firewall up for Salt
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>
尽管默认情况下未启用,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界面上的活动,并且任何其他登录用户也可以与虚拟机上的已登录用户一起操作。
现在,随着Salt Virt的运行,只需在新的裸机上运行上述状态就可以无缝添加新的虚拟机管理程序,并且这些计算机资源将立即对Salt Virt可用。