搜索

5.6. 配置 AMD SEV Compute 节点,为实例提供内存加密

download PDF

作为云管理员,您可以为云用户提供创建在支持 SEV 的 Compute 节点上运行的实例,并启用了内存加密。

此功能可从第二代 AMD EPYC™ 7002 系列("Rome")中使用。

要让您的云用户创建使用内存加密的实例,您必须执行以下任务:

  1. 为内存加密指定 AMD SEV Compute 节点。
  2. 配置 Compute 节点以进行内存加密。
  3. 部署 overcloud。
  4. 创建类别或镜像以使用内存加密启动实例。
提示

如果 AMD SEV 硬件有限,您还可以配置主机聚合来优化 AMD SEV Compute 节点上的调度。要只在 AMD SEV Compute 节点上调度请求内存加密的实例,请创建一个具有 AMD SEV 硬件的 Compute 节点的主机聚合,并将计算调度程序配置为仅将请求内存加密的实例放在主机聚合中。如需更多信息,请参阅 Creating and managing host aggregatesFiltering by isolating host aggregates

5.6.1. 安全加密的虚拟化(SEV)

由 AMD 提供的安全加密虚拟化(SEV)保护运行虚拟机实例使用的 DRAM 中的数据。SEV 使用唯一密钥加密每个实例的内存。

当使用非易失性内存技术(NVDIMM)时 SEV 会增加安全性,因为 NVDIMM 芯片可以物理地从具有数据的系统中删除,这与硬盘类似。如果没有加密,任何存储的信息(如敏感数据、密码或密钥)都可能会被破坏。

如需更多信息,请参阅 AMD 安全加密虚拟化(SEV) 文档。

带有内存加密的实例的限制

  • 您无法实时迁移,或使用内存加密挂起和恢复实例。
  • 您不能使用 PCI 透传直接访问带有内存加密的实例的设备。
  • 您不能使用 virtio-blk 作为带有比 kernel-4.18.0-115.el8 (RHEL-8.1.0)更早的 Red Hat Enterprise Linux (RHEL)内核进行内存加密的实例的引导磁盘。

    注意

    您可以使用 virtio-scsiSATA 作为引导磁盘,或者 virtio-blk 用于非引导磁盘。

  • 在加密实例中运行的操作系统必须提供 SEV 支持。如需更多信息,请参阅红帽知识库解决方案在 RHEL 8 中启用 AMD 安全加密虚拟化
  • 支持 SEV 的机器在其内存控制器中有有限数量的插槽来存储加密密钥。每个带有加密内存的实例都会消耗其中一个插槽。因此,可以同时运行的内存加密的实例数量限制为内存控制器中的插槽数量。例如,在1st Gen AMD EPYC™ 7001 系列("Naples")中,这个限制为 16,在第二代 Gen AMD EPYC™ 7002 系列("Rome")时,这个限制为 255。
  • 带有内存加密固定页面的实例。Compute 服务无法交换这些页面,因此您无法在托管内存加密的实例的 Compute 节点上过量使用内存。
  • 您不能将内存加密用于具有多个 NUMA 节点的实例。

5.6.2. 为内存加密设计 AMD SEV Compute 节点

要为使用内存加密的实例指定 AMD SEV Compute 节点,您必须创建一个新角色文件来配置 AMD SEV 角色,并使用 AMD SEV 资源类配置裸机节点,以标记用于内存加密的 Compute 节点。

注意

以下流程适用于尚未调配的新 overcloud 节点。要将资源类分配给已调配的现有 overcloud 节点,您必须使用缩减流程取消置备节点,然后使用扩展步骤使用新资源类分配重新置备节点。有关更多信息,请参阅 扩展 overcloud 节点

流程

  1. stack 用户的身份登录 undercloud。
  2. Source stackrc 文件:

    [stack@director ~]$ source ~/stackrc
  3. 生成包含 ComputeAMDSEV 角色的新角色数据文件,以及 overcloud 所需的任何其他角色。以下示例生成角色数据文件 roles_data_amd_sev.yaml,其中包括角色 ControllerComputeAMDSEV

    (undercloud)$ openstack overcloud roles \
     generate -o /home/stack/templates/roles_data_amd_sev.yaml \
     Compute:ComputeAMDSEV Controller
  4. Open roles_data_amd_sev.yaml 并编辑或添加以下参数和部分:

    section/Parameter当前值新值

    role 注释

    Role: Compute

    Role: ComputeAMDSEV

    角色名称

    Name: Compute

    名称 :ComputeAMDSEV

    description

    基本 Compute 节点角色

    AMD SEV Compute 节点角色

    HostnameFormatDefault

    %stackname%-novacompute-%index%

    %stackname%-novacomputeamdsev-%index%

    deprecated_nic_config_name

    compute.yaml

    compute-amd-sev.yaml

  5. 将 overcloud 的 AMD SEV Compute 节点添加到节点定义模板中,注册它们: node.jsonnode.yaml。有关更多信息,请参阅 安装和管理 Red Hat OpenStack Platform 指南中的 为 overcloud 注册节点
  6. 检查节点硬件:

    (undercloud)$ openstack overcloud node introspect \
     --all-manageable --provide

    如需更多信息,请参阅 安装和管理 Red Hat OpenStack Platform 指南中的创建 裸机节点硬件清单

  7. 使用自定义 AMD SEV 资源类标记您要为内存加密指定的每个裸机节点:

    (undercloud)$ openstack baremetal node set \
     --resource-class baremetal.AMD-SEV <node>

    <node > 替换为裸机节点的名称或 ID。

  8. ComputeAMDSEV 角色添加到您的节点定义文件 overcloud-baremetal-deploy.yaml 中,并定义您要分配给节点的任何预先节点放置、资源类、网络拓扑或其他属性:

    - name: Controller
      count: 3
    - name: Compute
      count: 3
    - name: ComputeAMDSEV
      count: 1
      defaults:
        resource_class: baremetal.AMD-SEV
        network_config:
          template: /home/stack/templates/nic-config/myRoleTopology.j2 1
    1
    您可以重复使用现有网络拓扑,或为角色创建新的自定义网络接口模板。如需更多信息,请参阅使用 director 安装和管理 Red Hat OpenStack Platform 指南中的 自定义网络接口模板。如果您没有使用 network_config 属性定义网络定义,则使用默认网络定义。

    有关您可以在节点定义文件中配置节点属性的属性的更多信息,请参阅 裸机节点置备属性。有关节点定义文件的示例,请参阅 节点定义文件 示例

  9. 运行 provisioning 命令为您的角色置备新节点:

    (undercloud)$ openstack overcloud node provision \
    --stack <stack> \
    [--network-config \]
    --output /home/stack/templates/overcloud-baremetal-deployed.yaml \
    /home/stack/templates/overcloud-baremetal-deploy.yaml
    • & lt;stack> 替换为置备裸机节点的堆栈名称。如果未指定,则默认为 overcloud
    • 包含 --network-config 可选参数,为 cli-overcloud-node-network-config.yaml Ansible playbook 提供网络定义。如果您没有使用 network_config 属性定义网络定义,则使用默认网络定义。
  10. 在一个单独的终端中监控置备进度。当置备成功时,节点状态将从 available 变为 active

    (undercloud)$ watch openstack baremetal node list
  11. 如果您没有使用 --network-config 选项运行 provisioning 命令,请在 network-environment.yaml 文件中配置 <Role>NetworkConfigTemplate 参数以指向 NIC 模板文件:

    parameter_defaults:
       ComputeNetworkConfigTemplate: /home/stack/templates/nic-configs/compute.j2
       ComputeAMDSEVNetworkConfigTemplate: /home/stack/templates/nic-configs/<amd_sev_net_top>.j2
       ControllerNetworkConfigTemplate: /home/stack/templates/nic-configs/controller.j2

    将 < amd_sev_net_top > 替换为包含 Compute AMDSEV 角色的网络拓扑的文件的名称,如 compute.yaml 以使用默认网络拓扑。

5.6.3. 为内存加密配置 AMD SEV Compute 节点

要让您的云用户创建使用内存加密的实例,您必须配置具有 AMD SEV 硬件的 Compute 节点。

注意

从 RHOSP OSP17.0 开始,Q35 是默认的机器类型。Q35 机器类型使用 PCIe 端口。您可以通过配置 heat 参数 NovaLibvirtNumPciePorts 来管理 PCIe 端口设备的数量。可附加到 PCIe 端口的设备数量比之前版本上运行的实例要少。如果要使用更多设备,则必须使用 hw_disk_bus=scsihw_scsi_model=virtio-scsi 镜像属性。如需更多信息,请参阅 虚拟硬件的元数据属性

先决条件

  • 您的部署必须包含在支持 SEV 的 AMD 硬件中运行的 Compute 节点,如 AMD EPYC CPU。您可以使用以下命令来确定部署是否支持 SEV:

    $ lscpu | grep sev

流程

  1. 打开 Compute 环境文件。
  2. 可选:在 Compute 环境文件中添加以下配置,以指定 AMD SEV Compute 节点可同时托管的最大内存加密实例数:

    parameter_defaults:
      ComputeAMDSEVExtraConfig:
        nova::config::nova_config:
          libvirt/num_memory_encrypted_guests:
            value: 15
    注意

    libvirt/num_memory_encrypted_guests 参数的默认值为 none。如果您没有设置自定义值,AMD SEV Compute 节点不会对节点可以同时托管的内存加密实例数量施加限制。相反,硬件决定了 AMD SEV Compute 节点可以同时托管的最大内存加密实例数,这可能会导致一些内存加密实例无法启动。

  3. 可选: 要指定所有 x86_64 镜像默认使用 q35 机器类型,请在 Compute 环境文件中添加以下配置:

    parameter_defaults:
      ComputeAMDSEVParameters:
        NovaHWMachineType: x86_64=q35

    如果指定了此参数值,则不需要在每个 AMD SEV 实例镜像上设置 hw_machine_type 属性设置为 q35

  4. 为确保 AMD SEV Compute 节点为主机级服务保留足够的内存才能正常工作,请为每个潜在的 AMD SEV 实例添加 16MB:

    parameter_defaults:
      ComputeAMDSEVParameters:
        ...
        NovaReservedHostMemory: <libvirt/num_memory_encrypted_guests * 16>
  5. 为 AMD SEV Compute 节点配置内核参数:

    parameter_defaults:
      ComputeAMDSEVParameters:
        ...
        KernelArgs: "hugepagesz=1GB hugepages=32 default_hugepagesz=1GB mem_encrypt=on kvm_amd.sev=1"
    注意

    当您首先将 KernelArgs 参数添加到角色的配置中时,overcloud 节点会自动重启。如果需要,您可以禁用自动重新引导节点,并在每个 overcloud 部署后手动重启节点。如需更多信息,请参阅配置手动节点重新引导以定义 KernelArgs

  6. 保存对 Compute 环境文件的更新。
  7. 使用其他环境文件将计算环境文件添加到堆栈中,并部署 overcloud:

    (undercloud)$ openstack overcloud deploy --templates \
     -e [your environment files] \
     -r /home/stack/templates/roles_data_amd_sev.yaml \
     -e /home/stack/templates/network-environment.yaml \
     -e /home/stack/templates/<compute_environment_file>.yaml \
     -e /home/stack/templates/overcloud-baremetal-deployed.yaml \
     -e /home/stack/templates/node-info.yaml

5.6.4. 为内存加密创建镜像

当 overcloud 包含 AMD SEV Compute 节点时,您可以创建一个 AMD SEV 实例镜像,您的云用户可以使用该镜像来启动具有内存加密的实例。

注意

从 RHOSP OSP17.0 开始,Q35 是默认的机器类型。Q35 机器类型使用 PCIe 端口。您可以通过配置 heat 参数 NovaLibvirtNumPciePorts 来管理 PCIe 端口设备的数量。可附加到 PCIe 端口的设备数量比之前版本上运行的实例要少。如果要使用更多设备,则必须使用 hw_disk_bus=scsihw_scsi_model=virtio-scsi 镜像属性。如需更多信息,请参阅 虚拟硬件的元数据属性

流程

  1. 为内存加密创建新镜像:

    (overcloud)$ openstack image create ...  \
     --property hw_firmware_type=uefi amd-sev-image
    注意

    如果使用现有镜像,镜像必须将 hw_firmware_type 属性设置为 uefi

  2. 可选:在镜像中添加 property hw_mem_encryption=True,以便在镜像上启用 AMD SEV 内存加密:

    (overcloud)$ openstack image set  \
     --property hw_mem_encryption=True amd-sev-image
    提示

    您可以在类别上启用内存加密。如需更多信息,请参阅为内存加密创建类别

  3. 可选:如果尚未在 Compute 节点配置中设置,请将机器类型设置为 q35

    (overcloud)$ openstack image set  \
     --property hw_machine_type=q35 amd-sev-image
  4. 可选: 要在支持 SEV 的主机聚合中调度内存加密实例,请在镜像额外规格中添加以下特征:

    (overcloud)$ openstack image set  \
     --property trait:HW_CPU_X86_AMD_SEV=required amd-sev-image
    提示

    您还可以在类别中指定此特征。如需更多信息,请参阅为内存加密创建类别

5.6.5. 为内存加密创建类别

当 overcloud 包含 AMD SEV Compute 节点时,您可以创建一个或多个 AMD SEV 类别,您的云用户可用于启动具有内存加密的实例。

注意

只有在镜像中没有设置 hw_mem_encryption 属性时,才需要 AMD SEV 类别。

流程

  1. 为内存加密创建类别:

    (overcloud)$ openstack flavor create --vcpus 1 --ram 512 --disk 2  \
     --property hw:mem_encryption=True m1.small-amd-sev
  2. 要在支持 SEV 的主机聚合上调度内存加密实例,请将以下特征添加到类别额外规格中:

    (overcloud)$ openstack flavor set  \
     --property trait:HW_CPU_X86_AMD_SEV=required m1.small-amd-sev

5.6.6. 使用内存加密启动实例

要验证您可以在启用了内存加密的 AMD SEV Compute 节点上启动实例,请使用内存加密类别或镜像来创建实例。

流程

  1. 使用 AMD SEV 类别或镜像创建实例。以下示例使用在为内存加密创建类别时创建的类别,以及在创建用于内存加密的镜像的镜像来创建实例:

    (overcloud)$ openstack server create --flavor m1.small-amd-sev \
     --image amd-sev-image amd-sev-instance
  2. 以云用户身份登录实例。
  3. 要验证实例是否使用内存加密,请在实例中输入以下命令:

    $ dmesg | grep -i sev
    AMD Secure Encrypted Virtualization (SEV) active
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.