Libvirt - Nova 虚拟化驱动

概述

Libvirt 是 OpenStack 中最常用的虚拟化驱动。它使用 libvirt,后端由 QEMU 支持,并在可用时使用 KVM。Libvirt 在 nova_libvirt 容器中执行,或者作为在主机上运行的守护进程。

硬件虚拟化

对于 libvirt,nova_compute_virt_type 支持两个值 - kvmqemu,其中 kvm 是默认值。

为了获得最佳性能,kvm 是首选,因为虚拟化的许多方面可以卸载到硬件上。如果无法启用硬件虚拟化(例如,Intel 系统上的虚拟化技术 (VT) BIOS 配置),则可以使用 qemu 来提供性能较低的软件模拟虚拟化。

SASL 身份验证

Kolla Ansible 的默认配置是在 TCP 上运行 libvirt,并使用 SASL 进行身份验证。不应认为这提供了安全的加密通道,因为可用于 TCP 的用户名/密码 SASL 机制不再被认为是密码学安全的。但是,它至少为 libvirt API 提供了一些身份验证。对于更安全的加密通道,请使用 libvirt TLS

SASL 根据 libvirt_enable_sasl 标志启用,默认值为 true

用户名通过 libvirt_sasl_authname 配置,默认值为 nova。密码通过 libvirt_sasl_password 配置,并使用 kolla-mergepwdkolla-genpwd 生成,并存储在 passwords.yml 中。

通过 libvirt_sasl_mech_list 配置已启用的身份验证机制列表,如果启用了 libvirt TLS,则默认值为 ["SCRAM-SHA-256"],否则为 ["DIGEST-MD5"]

主机与容器化的 libvirt

默认情况下,Kolla Ansible 在 nova_libvirt 容器中部署 libvirt。在某些情况下,将 libvirt 作为计算主机上的守护进程运行可能更可取。

Kolla Ansible 目前不支持将 libvirt 作为主机守护进程部署和配置。但是,从 Yoga 版本开始,如果已经设置了 libvirt 守护进程,则可以配置 Kolla Ansible 以使用它。这可以通过将 enable_nova_libvirt_container 设置为 false 来实现。

当防火墙驱动程序设置为 openvswitch 时,libvirt 将虚拟机直接连接到集成桥接 br-int。为此,它使用 ovs-vsctl 实用程序。libvirt 进程看到的 $PATH 环境变量控制此二进制文件的搜索路径。有几种选项可以确保找到此二进制文件

  • openvswitch_ovs_vsctl_wrapper_enabled 设置为 True。这将安装一个包装脚本到路径:/usr/bin/ovs-vsctl,它将在 openvswitch_vswitchd 容器的上下文中执行 ovs-vsctl。如果您未在主机上安装 openvswitch,此选项很有用。它还具有 ovs-vsctl 实用程序将与服务器版本匹配的优点。

  • 在超融合主机上安装 openvswitch。Kolla 将 /run/openvswitch 从主机挂载到 openvswitch_vswitchd 容器。这意味着套接字位于 ovs-vsctl 期望的位置,并带有其默认选项。

从容器迁移到主机

在禁用后,可以使用 kolla-ansible nova-libvirt-cleanup 命令清理 nova_libvirt 容器和主机上的相关项目。应在禁用计算服务并迁移所有活动虚拟机后运行此命令。

默认情况下,如果主机上运行任何虚拟机,该命令将失败。如果您确定清理 nova_libvirt 容器时运行虚拟机是安全的,则将 nova_libvirt_cleanup_running_vms_fatal 设置为 false 将允许该命令继续。

nova_libvirt 容器有几个相关的 Docker 卷:libvirtdnova_libvirt_qemunova_libvirt_secrets。默认情况下,不会清理这些卷。如果您确定这些卷中的数据可以安全删除,则将 nova_libvirt_cleanup_remove_volumes 设置为 true 将导致删除 Docker 卷。

未来的扩展可以支持现有虚拟机的迁移,但这目前超出范围。

Libvirt TLS

Kolla Ansible 的默认配置是在 TCP 上运行 libvirt,并使用 SASL 身份验证。只要采取措施保护可以访问网络的人员,这就可以很好地工作。但是,在不太受信任的环境中,您可能希望在访问 libvirt API 时使用加密。为此,我们可以为 libvirt 启用 TLS 并让 nova 使用它。配置了双向 TLS,通过证书提供客户端身份验证。SASL 身份验证提供进一步的安全级别。

使用 libvirt TLS

可以通过在 /etc/kolla/globals.yml 中设置以下选项在 Kolla Ansible 中启用 Libvirt TLS

libvirt_tls: "yes"

创建生产就绪的 TLS 证书目前不在 Kolla Ansible 的范围内。您需要使用现有的内部 CA,或者您需要生成自己的离线 CA。为了使 TLS 通信正常工作,您需要向 Kolla Ansible 提供以下信息

  • cacert.pem

    • 这是 CA 的公共证书,所有客户端和服务器证书都使用它签名。Libvirt 和 nova-compute 需要此证书,以便它们可以验证正在使用的所有证书都由 CA 签名并应受信任。

  • serverkey.pem(不在使用主机 libvirt 守护进程时使用)

    • 这是服务器的私钥,与 TLS 证书的私钥没有区别。应像 TLS 证书的私钥一样小心保护它。

  • servercert.pem(不在使用主机 libvirt 守护进程时使用)

    • 这是服务器的公共证书。Libvirt 将向 TLS 端口的任何连接呈现此证书。这与标准 TLS 证书/密钥捆绑包的公共证书部分没有区别。

  • clientkey.pem

    • 这是客户端私钥,nova-compute/libvirt 在连接到 libvirt 时将使用它。将其视为 SSH 私钥,并以类似的方式保护它。

  • clientcert.pem

    • 这是客户端证书,nova-compute/libvirt 在连接到 libvirt 时将呈现它。将其视为 SSH 密钥的公共端。

Kolla Ansible 将在执行 Kolla Ansible 的主机上,为每个计算节点在以下位置和顺序中搜索这些文件

  • /etc/kolla/config/nova/nova-libvirt/<hostname>/

  • /etc/kolla/config/nova/nova-libvirt/

在大多数情况下,您希望每个超融合主机都有唯一的服务器和客户端证书和密钥,并使用通用的 CA 证书。在这种情况下,您会将每个服务器/客户端证书和密钥 PEM 文件放在 /etc/kolla/config/nova/nova-libvirt/<hostname>/ 下,并将 CA 证书放在 /etc/kolla/config/nova/nova-libvirt/ 下。

但是,可以使用通配符服务器证书和单个客户端证书,该客户端证书由所有服务器共享。这将允许您生成单个客户端证书和单个服务器证书,该证书在每个超融合主机上共享。在这种情况下,您会将所有内容存储在 /etc/kolla/config/nova/nova-libvirt/ 下。

外部管理的证书

对于已经拥有自动化来获取服务器上 TLS 证书的部署者来说,另一种选择是在 /etc/kolla/globals.yaml 下禁用证书管理

libvirt_tls_manage_certs: "no"

禁用此选项后,Kolla Ansible 将简单地假定证书和密钥已经安装在其正确的位置。部署者将负责确保 TLS 证书/密钥被放置到服务器上的正确容器配置目录中,以便它们可以复制到 nova-compute 和 nova-libvirt 容器中。禁用此选项后,您还需要负责在更新证书时重新启动 nova-compute 和 nova-libvirt 容器,因为 kolla-ansible 无法检测到文件何时更改。

为测试和开发生成证书

从 Yoga 版本开始,kolla-ansible certificates 命令为 libvirt TLS 生成证书。单个密钥和证书用于所有主机,并为每个计算主机主机名添加了主题替代名称 (SAN) 条目。