配置计算 (nova) 服务 (可选)

计算服务 (nova) 处理 OpenStack 环境中虚拟机的创建。OpenStack-Ansible 使用的许多默认选项都可以在 nova role 中的 defaults/main.yml 中找到。

可用区

具有多个可用区的部署者可以设置 Ansible 变量 nova_nova_conf_overrides.DEFAULT.default_schedule_zone 以指定新请求的可用区。这在具有不同类型 hypervisor 的环境中很有用,其中构建会根据其资源需求发送到某些硬件类型。

例如,如果您有在两个机架上运行的服务器,且不共享 PDU。这两个机架可以分组为两个可用区。当一个机架断电时,另一个仍然可以工作。通过将您的容器分布到这两个机架(可用区)上,您将提高您的服务可用性。

Ceph (RBD) 的块设备调优

启用 Ceph 并定义 nova_libvirt_images_rbd_pool 会默认更改两个 libvirt 配置

  • hw_disk_discard: unmap

  • disk_cachemodes: network=writeback

在 libvirt 中将 hw_disk_discard 设置为 unmap 可为底层块设备启用 discard(有时称为 TRIM)支持。这允许回收底层磁盘上未使用的块。

disk_cachemodes 设置为 network=writeback 允许数据在每次更改时写入缓存,但这些更改会在定期的时间间隔刷新到磁盘。这可以提高 Ceph 块设备上的写入性能。

您可以使用两个 Ansible 变量(此处显示默认值)来自定义这些设置

nova_libvirt_hw_disk_discard: 'unmap'
nova_libvirt_disk_cachemodes: 'network=writeback'

您可以通过将 nova_libvirt_hw_disk_discard 设置为 ignore 来禁用 discard。可以将 nova_libvirt_disk_cachemodes 设置为空字符串以禁用 network=writeback

以下最小示例配置将 nova 设置为使用 ephemeral-vms Ceph pool。以下示例使用 cephx 身份验证,并需要为 ephemeral-vms pool 存在的 cinder 帐户

nova_libvirt_images_rbd_pool: ephemeral-vms
ceph_mons:
  - 172.29.244.151
  - 172.29.244.152
  - 172.29.244.153

如果您为 pool 拥有不同的 Ceph 用户名,请将其用作

cinder_ceph_client: <ceph-username>

Config drive

默认情况下,OpenStack-Ansible 不配置 nova 以强制为 nova 构建的每个实例配置 config drive。元数据服务提供用于在实例内部的 cloud-init 中使用的配置信息。只有当实例未安装 cloud-init 或不支持处理元数据时,才需要 config drive。

部署者可以设置 Ansible 变量以强制为每个虚拟机部署 config drive

nova_nova_conf_overrides:
  DEFAULT:
    force_config_drive: True

某些格式的 config drive 可能会阻止实例在 hypervisor 之间正确迁移。如果您需要强制 config drive 并且能够迁移实例,请使用 nova_nova_conf_overrides 变量将 config drive 格式设置为 vfat

nova_nova_conf_overrides:
  DEFAULT:
    config_drive_format: vfat
    force_config_drive: True

Libvirtd 连接性和身份验证

默认情况下,OpenStack-Ansible 以以下方式配置 libvirt daemon

  • 已启用 TLS 连接

  • 已禁用 TCP 明文连接

  • 通过 TCP 连接的身份验证使用 SASL

您可以使用以下 Ansible 变量来自定义这些设置

# Enable libvirtd's TLS listener
nova_libvirtd_listen_tls: 1

# Disable libvirtd's plaintext TCP listener
nova_libvirtd_listen_tcp: 0

# Use SASL for authentication
nova_libvirtd_auth_tcp: sasl

Multipath

Nova 支持基于 iSCSI 的存储的多路径。通过配置覆盖启用 nova 中的多路径支持

nova_nova_conf_overrides:
  libvirt:
      iscsi_use_multipath: true

共享存储和同步 UID/GID

指定 nova 用户和 nova 组的自定义 UID 和 GID,以确保它们在每个主机上都是相同的。这在使用计算节点上的共享存储时很有帮助,因为它允许实例在不出现文件系统所有权故障的情况下迁移。

默认情况下,Ansible 创建 nova 用户和组而不指定 UID 或 GID。要为 UID 或 GID 指定自定义值,请设置以下 Ansible 变量

警告

在部署了 OpenStack-Ansible 的环境之后设置此值可能会导致故障、错误和普遍的不稳定性。这些值应仅在部署 OpenStack 环境之前设置一次,然后不再更改。

nova_system_user_uid = <specify a UID>
nova_system_group_gid = <specify a GID>

启用 Huge Pages

为了在您的内核中启用 Huge Pages,必须执行一系列操作

注意

建议利用 group_vars,因为通常您只需要在特定的主机集上启用 Huge Pages。例如,您可以使用 /etc/openstack_deploy/group_vars/compute_hosts.yml 文件来定义下面讨论的变量。

  1. 在变量中定义 Huge Pages 的默认大小。

    custom_huge_pages_size_mb: 2
    
  2. 定义自定义 GRUB 记录以启用 Huge Pages

    openstack_host_custom_grub_options:
      - key: hugepagesz
        value: "{{ custom_huge_pages_size_mb }}M"
      - key: hugepages
        value: "{{ (ansible_facts['memtotal_mb'] - nova_reserved_host_memory_mb) // custom_huge_pages_size_mb }}"
      - key: transparent_hugepage
        value: never
    
  3. 定义对默认 dev-hugepages.mount 的覆盖

    openstack_hosts_systemd_mounts:
      - what: dev-hugepages
        mount_overrides_only: true
        type: hugetlbfs
        escape_name: false
        config_overrides:
          Mount:
            Options: "pagesize={{ custom_huge_pages_size_mb }}M"
    
  4. 将更改推广到主机

    # openstack-ansible openstack.osa.openstack_hosts_setup --limit compute_hosts
    
  5. 定义具有 Huge Pages 支持的 flavor

    openstack_user_compute:
      flavors:
        - specs:
            - name: m1.small
              vcpus: 2
              ram: 4096
              disk: 0
            - name: m1.large
              vcpus: 8
              ram: 16384
              disk: 0
          extra_specs:
            hw:mem_page_size: large
            hw:cpu_policy: dedicated
    
  6. 在区域中创建定义的 flavor

    # openstack-ansible openstack.osa.openstack_resources
    

启用实时迁移的 post-copy

确保高负载实例成功迁移的一种方法是使用 Libvirt/QEMU 的 post-copy 功能。当启用此方法时,如果实例在提供的超时时间内未能迁移,则迁移将被强制完成,而剩余的(未传输的内存)将从原始 hypervisor 在发生实例访问尝试时传输。

为了使 post-copy 正常工作,需要满足多个条件

  • Nova 配置为在请求迁移时将 post-copy 发送到 Libvirt:* live_migration_timeout_action 应设置为 force_complete 而不是默认的 abort * 应启用 live_migration_permit_post_copy * 建议调整 live_migration_completion_timeout,因为默认的 800 秒可能需要太长时间才能决定必须启动 post-copy。请注意,超时值乘以实例的 RAM 和磁盘量。因此,具有 16Gb RAM 和 50Gb 磁盘的实例可能需要超过 14 小时才能强制执行 post-copy 机制。

  • hypervisor 需要启用 vm.unprivileged_userfaultfd 才能允许 post-copy 发生

  • 确保 Open vSwitch 不使用 mlockall 进行启动

以下是 OpenStack-Ansible 启用实例的 post-copy 迁移的示例配置。为此,将以下内容放入 /etc/openstack_deploy/group_vars/nova_compute.yml

nova_nova_conf_overrides:
  libvirt:
    live_migration_permit_post_copy: true
    live_migration_timeout_action: force_complete
    live_migration_completion_timeout: 30

openstack_user_kernel_options:
  - key: vm.unprivileged_userfaultfd
    value: 1

配置到位后,您需要运行以下 playbook 以应用更改

# openstack-ansible openstack.osa.openstack_hosts_setup --tags openstack_hosts-install --limit nova_compute
# openstack-ansible openstack.osa.nova --tags post-install --limit nova_compute