SALT AS A CLOUD CONTROLLER
在Salt 0.14.0中,引入了先进的云控制系统,允许使用Salt直接管理私有云虚拟机。该系统通常称为Salt Virt。
Salt Virt系统已经存在并集成安装在Salt系统内,这意味着除了设置Salt之外,不需要部署额外的代码。
注意: 使用salt virt功能,需要预先安装好
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
虚拟机管理程序需要运行网桥来为虚拟机提供网络设备,下面这个公式将在虚拟机管理程序上建立一个标准网桥,然后将网桥连接到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管理签名授权密钥,并为master服务器上的libvirt客户端生成密钥,使用证书颁发机构对其进行签名,并使用pillar分发它们。 这是通过libvirt状态管理的。 只需在minion上执行此公式,以确保证书到位并且是最新的:
注意:上面的公式中就包括设置libvirt密钥所需的调用。
libvirt_keys:
virt.keys
GETTING VIRTUAL MACHINE IMAGES READY
Salt Virt,要求提供虚拟机映像,因为这些映像不是即时生成的。 根据底层平台生成的这些虚拟机映像有很大不同。
可以使用KVM手动创建虚拟机映像并通过安装程序运行,但不建议使用这个办法,因为它太依赖于手动并且容易出错。
虚拟机生成应用程序可用于许多平台:
kiwi: (openSUSE, SLES, RHEL, CentOS)
vm-builder:
https://wiki.debian.org/VMBuilder
一旦虚拟机映像可用,将它们提供给Salt Virt的最简单方法是将它们放在Salt文件服务器中。 只需将镜像复制到/srv/salt中,它就可以被Salt Virt使用了。
出于演示的目的,我们将使用一个文件名为centos.img镜像。
EXISTING VIRTUAL MACHINE IMAGES
许多现有的Linux发行版提供了可与Salt Virt一起使用的虚拟机映像。 请注意,这些镜像均不受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
Images for Ubuntu Linux can be found here: http://cloud-images.ubuntu.com/
USING SALT VIRT
通过设置虚拟机管理程序并准备好虚拟机映像,Salt可以使用virt runner开始发布云管理命令。
首先运行Salt Virt hypervisor info命令:
salt-run virt.host_info
这将查询正在运行的虚拟机管理程序的统计信息并显示有用的信息,例如cpu的数量和内存量。
还可以在所有管理程序节点上列出所有VM及其当前状态:
salt-run virt.list
现在虚拟机管理程序可用,并且可以配置虚拟机。 virt.init
用于创建一个新的虚拟机:
salt-run virt.init centos1 2 512 salt://centos.img
Salt Virt runner现在将自动选择虚拟机管理程序以部署新虚拟机。使用salt://
假定CentOS虚拟机映像已经位于master服务器上Salt文件服务器的根目录中。当克隆镜像时(即从文件服务器下载到本地),虚拟化管理程序minion上的目标目录由virt:images
配置选项确定;默认情况下,这位于/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
现在已经准备好了新的VM,可以通过virt.query
命令看到它:
salt-run virt.query
此命令将返回有关所有虚拟机监控程序和相应虚拟机的数据。
既然新VM已经启动,它应该联系Salt Master,执行一个test.version
命令可以显示新VM是否正在运行。
QEMU COPY ON WRITE SUPPORT
对于快速镜像克隆,你可以使用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防火墙通信规则的方法,请参见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>
VNC CONSOLES
虽然默认情况下未启用,但Salt Virt还可以设置VNC控制台,以便打开远程可视控制台。 使用virt.init
创建新VM时,请传递enable_vnc=True
参数,以便为新VM配置vnc控制台。
一个virt.query查询中的信息将会显示出特定vms的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管理和使用。