5.6. 配置 AMD SEV Compute 节点,为实例提供内存加密
作为云管理员,您可以为云用户提供创建在支持 SEV 的 Compute 节点上运行的实例,并启用了内存加密。
此功能可从第二代 AMD EPYC™ 7002 系列("Rome")中使用。
要让您的云用户创建使用内存加密的实例,您必须执行以下任务:
- 为内存加密指定 AMD SEV Compute 节点。
- 配置 Compute 节点以进行内存加密。
- 部署 overcloud。
- 创建类别或镜像以使用内存加密启动实例。
如果 AMD SEV 硬件有限,您还可以配置主机聚合来优化 AMD SEV Compute 节点上的调度。要只在 AMD SEV Compute 节点上调度请求内存加密的实例,请创建一个具有 AMD SEV 硬件的 Compute 节点的主机聚合,并将计算调度程序配置为仅将请求内存加密的实例放在主机聚合中。如需更多信息,请参阅 Creating and managing host aggregates 和 Filtering 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-scsi
或SATA
作为引导磁盘,或者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 节点。
流程
-
以
stack
用户的身份登录 undercloud。 Source
stackrc
文件:[stack@director ~]$ source ~/stackrc
生成包含
ComputeAMDSEV
角色的新角色数据文件,以及 overcloud 所需的任何其他角色。以下示例生成角色数据文件roles_data_amd_sev.yaml
,其中包括角色Controller
和ComputeAMDSEV
:(undercloud)$ openstack overcloud roles \ generate -o /home/stack/templates/roles_data_amd_sev.yaml \ Compute:ComputeAMDSEV Controller
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
-
将 overcloud 的 AMD SEV Compute 节点添加到节点定义模板中,注册它们:
node.json
或node.yaml
。有关更多信息,请参阅 安装和管理 Red Hat OpenStack Platform 指南中的 为 overcloud 注册节点。 检查节点硬件:
(undercloud)$ openstack overcloud node introspect \ --all-manageable --provide
如需更多信息,请参阅 安装和管理 Red Hat OpenStack Platform 指南中的创建 裸机节点硬件清单。
使用自定义 AMD SEV 资源类标记您要为内存加密指定的每个裸机节点:
(undercloud)$ openstack baremetal node set \ --resource-class baremetal.AMD-SEV <node>
将
<node
> 替换为裸机节点的名称或 ID。将
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
有关您可以在节点定义文件中配置节点属性的属性的更多信息,请参阅 裸机节点置备属性。有关节点定义文件的示例,请参阅 节点定义文件 示例。
运行 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
属性定义网络定义,则使用默认网络定义。
-
将
在一个单独的终端中监控置备进度。当置备成功时,节点状态将从
available
变为active
:(undercloud)$ watch openstack baremetal node list
如果您没有使用
--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=scsi
或 hw_scsi_model=virtio-scsi
镜像属性。如需更多信息,请参阅 虚拟硬件的元数据属性。
先决条件
您的部署必须包含在支持 SEV 的 AMD 硬件中运行的 Compute 节点,如 AMD EPYC CPU。您可以使用以下命令来确定部署是否支持 SEV:
$ lscpu | grep sev
流程
- 打开 Compute 环境文件。
可选:在 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 节点可以同时托管的最大内存加密实例数,这可能会导致一些内存加密实例无法启动。可选: 要指定所有 x86_64 镜像默认使用 q35 机器类型,请在 Compute 环境文件中添加以下配置:
parameter_defaults: ComputeAMDSEVParameters: NovaHWMachineType: x86_64=q35
如果指定了此参数值,则不需要在每个 AMD SEV 实例镜像上设置
hw_machine_type
属性设置为q35
。为确保 AMD SEV Compute 节点为主机级服务保留足够的内存才能正常工作,请为每个潜在的 AMD SEV 实例添加 16MB:
parameter_defaults: ComputeAMDSEVParameters: ... NovaReservedHostMemory: <libvirt/num_memory_encrypted_guests * 16>
为 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
。- 保存对 Compute 环境文件的更新。
使用其他环境文件将计算环境文件添加到堆栈中,并部署 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=scsi
或 hw_scsi_model=virtio-scsi
镜像属性。如需更多信息,请参阅 虚拟硬件的元数据属性。
流程
为内存加密创建新镜像:
(overcloud)$ openstack image create ... \ --property hw_firmware_type=uefi amd-sev-image
注意如果使用现有镜像,镜像必须将
hw_firmware_type
属性设置为uefi
。可选:在镜像中添加 property
hw_mem_encryption=True
,以便在镜像上启用 AMD SEV 内存加密:(overcloud)$ openstack image set \ --property hw_mem_encryption=True amd-sev-image
提示您可以在类别上启用内存加密。如需更多信息,请参阅为内存加密创建类别。
可选:如果尚未在 Compute 节点配置中设置,请将机器类型设置为
q35
:(overcloud)$ openstack image set \ --property hw_machine_type=q35 amd-sev-image
可选: 要在支持 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 类别。
流程
为内存加密创建类别:
(overcloud)$ openstack flavor create --vcpus 1 --ram 512 --disk 2 \ --property hw:mem_encryption=True m1.small-amd-sev
要在支持 SEV 的主机聚合上调度内存加密实例,请将以下特征添加到类别额外规格中:
(overcloud)$ openstack flavor set \ --property trait:HW_CPU_X86_AMD_SEV=required m1.small-amd-sev
5.6.6. 使用内存加密启动实例
要验证您可以在启用了内存加密的 AMD SEV Compute 节点上启动实例,请使用内存加密类别或镜像来创建实例。
流程
使用 AMD SEV 类别或镜像创建实例。以下示例使用在为内存加密创建类别时创建的类别,以及在创建用于内存加密的镜像的镜像来创建实例:
(overcloud)$ openstack server create --flavor m1.small-amd-sev \ --image amd-sev-image amd-sev-instance
- 以云用户身份登录实例。
要验证实例是否使用内存加密,请在实例中输入以下命令:
$ dmesg | grep -i sev AMD Secure Encrypted Virtualization (SEV) active