SaltStack的多云管理解决方案——且看使用Salt Virt模块可以怎么管理你的虚拟机

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的教程:

Cloud Controller Tutorial

The Salt Virt Runner

与与云控制器交互的是virt runner程序。 virt runner程序附带有执行特定虚拟机例程的例程。

Runner模块文档中提供了virt runner的详细参考文档:

Virt Runner Reference

The Salt Virt Executor

virt Executor执行程序,提供了大量的创建与管理虚拟机的功能函数。

Executor模块文档中提供了virt executor的详细参考文档:

Salt Virt Executor Reference

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

系统管理程序所需的软件是libvirtkvm。 要获得高级功能,请安装libguestfsqemu-nbd

注意

Libguestfsqemu-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文档:

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

vmbuilder-formula

一旦虚拟机镜像可以使用了,使其对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发行版本特定的防火墙设置的更深入的信息可以阅读:

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 - 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可用。

你可能感兴趣的:(SaltStack)