GPU Operator 与保密容器和 Kata#
关于保密容器支持#
注意
技术预览功能在生产环境中不受支持,并且功能不完整。技术预览功能提供对即将推出的产品功能的早期访问,使客户能够在开发过程中测试功能并提供反馈。这些版本可能没有任何文档,并且测试受到限制。
保密容器是云原生的保密计算方法。保密计算扩展了保护传输中数据和静态数据的实践,增加了保护使用中数据的实践。
保密计算是一种在处理过程中将敏感数据隔离在 NVIDIA GPU 和受保护的 CPU enclave 中的技术。保密计算依赖于硬件功能,例如 Intel SGX、Intel TDX 和 AMD SEV,以提供可信执行环境 (TEE)。TEE 提供嵌入式加密密钥和嵌入式证明机制,以确保密钥仅可由授权的应用程序代码访问。
以下高级图显示了 NVIDIA GPU Operator 保密容器的一些基本概念
containerd 配置为运行 Kata 运行时以启动虚拟机。
Kata 使用 NVIDIA 优化的 Linux 内核和 NVIDIA 提供的初始 RAM 磁盘启动虚拟机
在容器在虚拟机中运行之前,来宾预启动 hook 运行本地验证器,该验证器是 NVIDIA Attestation SDK 的一部分。
软件组件和通信路径的高级逻辑图#
要求#
有关受支持的 NVIDIA GPU(例如 NVIDIA Hopper H100),请参阅 http://docs.nvda.net.cn/confidential-computing 网站上的保密计算部署指南。
部署指南中的以下主题适用于云原生环境
硬件选择和初始硬件配置,例如 BIOS 设置。
主机操作系统选择、初始配置和验证。
部署指南中的其余配置主题不适用于云原生环境。NVIDIA GPU Operator 执行这些主题中描述的操作。
关键软件组件#
NVIDIA GPU Operator 将以下软件组件整合在一起,以简化管理保密计算所需的软件和部署保密容器工作负载
- 保密容器 Operator
Operator 管理安装和部署可以运行带有 QEMU 的 Kata Containers 的运行时。
- Kubernetes 的 NVIDIA Kata Manager
GPU Operator 部署 Kubernetes 的 NVIDIA Kata Manager,
k8s-kata-manager
。管理器执行以下功能管理
kata-qemu-nvidia-gpu-snp
运行时类。配置 containerd 以使用运行时类。
管理 Kata 工件,例如 Linux 内核镜像和初始 RAM 磁盘。
- Kubernetes 的 NVIDIA 保密计算管理器
GPU Operator 部署管理器
k8s-cc-manager
,以在 NVIDIA GPU 上设置保密计算模式。- 节点功能发现 (NFD)
当您为保密计算安装 NVIDIA GPU Operator 时,您必须指定
nfd.nodefeaturerules=true
选项。此选项指示 Operator 安装节点功能规则,以检测 CPU 安全功能和 NVIDIA GPU 硬件。您可以通过运行kubectl get nodefeaturerules nvidia-nfd-node-featurerules
来确认规则已安装。在具有 NVIDIA Hopper 系列 GPU 和 Intel TDX 或 AMD SEV-SNP 的节点上,NFD 将标签添加到节点,例如
"feature.node.kubernetes.io/cpu-security.sev.snp.enabled": "true"
和"nvidia.com/cc.capable": "true"
。NVIDIA GPU Operator 仅在具有"nvidia.com/cc.capable": "true"
标签的节点上部署保密容器的操作数。
关于 NVIDIA 保密计算管理器#
您可以通过设置 ccManager.defaultMode=<on|off>
选项来设置 NVIDIA GPU 的默认保密计算模式。默认值为 off
。您可以在安装 NVIDIA GPU Operator 时或之后通过修改 ClusterPolicy
对象的 cluster-policy
实例来设置此选项。
当您更改模式时,管理器执行以下操作
从节点驱逐其他 GPU Operator 操作数。
但是,管理器不会排空用户工作负载。您必须确保在更改模式之前节点上没有运行用户工作负载。
从 VFIO PCI 设备驱动程序取消绑定 GPU。
更改模式并重置 GPU。
重新调度其他 GPU Operator 操作数。
NVIDIA 保密计算管理器配置#
集群策略的以下部分显示了与管理器相关的字段
ccManager:
enabled: true
defaultMode: "off"
repository: nvcr.io/nvidia/cloud-native
image: k8s-cc-manager
version: v0.1.0
imagePullPolicy: IfNotPresent
imagePullSecrets: []
env:
- name: CC_CAPABLE_DEVICE_IDS
value: "0x2331,0x2322"
resources: {}
限制和约束#
GPU 仅以直通模式作为单个 GPU 提供给容器。不支持多 GPU 直通和 vGPU。
支持仅限于初始安装和配置。不支持升级和配置现有集群以配置保密计算。
对保密计算环境的支持仅限于本页描述的实现。
NVIDIA 仅支持使用 containerd 运行时的 Operator 和保密计算。
Operator 仅支持执行本地证明。
集群拓扑注意事项#
您可以将集群中的所有工作节点配置为用于保密容器,也可以将某些节点配置为用于保密容器,而将其他节点配置为用于传统容器。考虑以下示例。
节点 A 配置为运行传统容器。
节点 B 配置为运行保密容器。
节点 A 接收以下软件组件
NVIDIA Driver Manager for Kubernetes
– 用于安装数据中心驱动程序。NVIDIA Container Toolkit
– 用于确保容器可以访问 GPU。NVIDIA Device Plugin for Kubernetes
– 用于发现和向 kubelet 通告 GPU 资源。NVIDIA DCGM 和 DCGM Exporter
– 用于监视 GPU。NVIDIA MIG Manager for Kubernetes
– 用于管理支持 MIG 的 GPU。Node Feature Discovery
– 用于检测 CPU、内核和主机功能并标记工作节点。NVIDIA GPU Feature Discovery
– 用于检测 NVIDIA GPU 并标记工作节点。
节点 B 接收以下软件组件
NVIDIA Kata Manager for Kubernetes
– 用于管理 NVIDIA 工件,例如 NVIDIA 优化的 Linux 内核镜像和初始 RAM 磁盘。NVIDIA Confidential Computing Manager for Kubernetes
– 用于管理节点上 NVIDIA GPU 的保密计算模式。NVIDIA Sandbox Device Plugin
– 用于发现和向 kubelet 通告直通 GPU。NVIDIA VFIO Manager
– 用于加载 vfio-pci 设备驱动程序并将其绑定到节点上的所有 GPU。Node Feature Discovery
– 用于检测 CPU 安全功能、NVIDIA GPU 和标记工作节点。
先决条件#
有关以下先决条件,请参阅保密计算部署指南
您已选择并配置硬件和 BIOS 以支持保密计算。
您已安装并配置操作系统以支持保密计算。
您已验证 Linux 内核是否支持 SNP。
您的主机已配置为启用硬件虚拟化和访问控制服务 (ACS)。对于某些 AMD CPU 和 BIOS,ACS 可能归类在高级错误报告 (AER) 下。通常通过配置主机 BIOS 来启用这些功能。
您的主机已配置为支持 IOMMU。
如果运行
ls /sys/kernel/iommu_groups
的输出包括0
、1
等,则您的主机已配置为支持 IOMMU。如果主机未配置或您不确定,请添加
intel_iommu=on
Linux 内核命令行参数。对于大多数 Linux 发行版,您可以将参数添加到/etc/default/grub
文件... GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on modprobe.blacklist=nouveau" ...
在 Ubuntu 系统上,在更改后运行
sudo update-grub
以配置引导加载程序。在其他系统上,您可能需要在更改后运行sudo dracut
。请参阅您的操作系统的文档。配置引导加载程序后,重新启动主机。您有一个 Kubernetes 集群,并且您具有集群管理员权限。
安装和配置概述#
安装和配置集群以支持带有保密容器的 NVIDIA GPU Operator 如下所示
标记要用于保密容器的工作节点。
此步骤确保您可以继续在集群中的某些节点上使用 GPU 或 vGPU 工作负载运行传统容器工作负载。或者,您可以在安装 GPU Operator 时将默认沙箱工作负载设置为
vm-passthrough
,以便在所有工作节点上运行保密容器。安装保密容器 Operator。
此步骤安装 Operator 以及 NVIDIA 用于保密容器的 Kata Containers 运行时。
安装 NVIDIA GPU Operator。
您安装 Operator 并指定选项以部署保密容器所需的操作数。
安装后,您可以更改保密计算模式并运行示例工作负载。
安装保密容器 Operator#
执行以下步骤以安装和验证保密容器 Operator
标记节点以在容器中运行虚拟机。仅标记要使用保密容器运行的节点。
$ kubectl label node <node-name> nvidia.com/gpu.workload.config=vm-passthrough
在环境变量中设置 Operator 版本
$ export VERSION=v0.7.0
安装 Operator
$ kubectl apply -k "github.com/confidential-containers/operator/config/release?ref=${VERSION}"
示例输出
namespace/confidential-containers-system created customresourcedefinition.apiextensions.k8s.io/ccruntimes.confidentialcontainers.org created serviceaccount/cc-operator-controller-manager created role.rbac.authorization.k8s.io/cc-operator-leader-election-role created clusterrole.rbac.authorization.k8s.io/cc-operator-manager-role created clusterrole.rbac.authorization.k8s.io/cc-operator-metrics-reader created clusterrole.rbac.authorization.k8s.io/cc-operator-proxy-role created rolebinding.rbac.authorization.k8s.io/cc-operator-leader-election-rolebinding created clusterrolebinding.rbac.authorization.k8s.io/cc-operator-manager-rolebinding created clusterrolebinding.rbac.authorization.k8s.io/cc-operator-proxy-rolebinding created configmap/cc-operator-manager-config created service/cc-operator-controller-manager-metrics-service created deployment.apps/cc-operator-controller-manager create
可选:查看
confidential-containers-system
命名空间中的 Pod 和服务$ kubectl get pod,svc -n confidential-containers-system
示例输出
NAME READY STATUS RESTARTS AGE pod/cc-operator-controller-manager-c98c4ff74-ksb4q 2/2 Running 0 2m59s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/cc-operator-controller-manager-metrics-service ClusterIP 10.98.221.141 <none> 8443/TCP 2m59s
通过创建清单然后编辑节点选择器来安装示例保密容器运行时,以便运行时仅安装在标记的节点上。
在名为
ccruntime.yaml
的文件中创建清单的本地副本$ kubectl apply --dry-run=client -o yaml \ -k "github.com/confidential-containers/operator/config/samples/ccruntime/default?ref=${VERSION}" > ccruntime.yaml
编辑
ccruntime.yaml
文件并将节点选择器设置为如下所示apiVersion: confidentialcontainers.org/v1beta1 kind: CcRuntime metadata: annotations: ... spec: ccNodeSelector: matchLabels: nvidia.com/gpu.workload.config: "vm-passthrough" ...
应用修改后的清单
$ kubectl apply -f ccruntime.yaml
示例输出
ccruntime.confidentialcontainers.org/ccruntime-sample created
等待几分钟,让 Operator 创建基本运行时类。
可选:查看运行时类
$ kubectl get runtimeclass
示例输出
NAME HANDLER AGE kata kata 13m kata-clh kata-clh 13m kata-clh-tdx kata-clh-tdx 13m kata-qemu kata-qemu 13m kata-qemu-sev kata-qemu-sev 13m kata-qemu-snp kata-qemu-snp 13m kata-qemu-tdx kata-qemu-tdx 13m
安装 NVIDIA GPU Operator#
步骤#
执行以下步骤以安装 Operator 以用于保密容器
添加和更新 NVIDIA Helm 仓库
$ helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \ && helm repo update
安装 Operator 时,至少指定以下选项。如果您想默认在所有工作节点上运行保密容器,还请指定
--set sandboxWorkloads.defaultWorkload=vm-passthough
。$ helm install --wait --generate-name \ -n gpu-operator --create-namespace \ nvidia/gpu-operator \ --version=v24.9.2 \ --set sandboxWorkloads.enabled=true \ --set kataManager.enabled=true \ --set ccManager.enabled=true \ --set nfd.nodefeaturerules=true
示例输出
NAME: gpu-operator LAST DEPLOYED: Tue Jul 25 19:19:07 2023 NAMESPACE: gpu-operator STATUS: deployed REVISION: 1 TEST SUITE: None
验证#
验证 Kata Manager、保密计算管理器和 VFIO 管理器操作数正在运行
$ kubectl get pods -n gpu-operator
示例输出
NAME READY STATUS RESTARTS AGE gpu-operator-57bf5d5769-nb98z 1/1 Running 0 6m21s gpu-operator-node-feature-discovery-master-b44f595bf-5sjxg 1/1 Running 0 6m21s gpu-operator-node-feature-discovery-worker-lwhdr 1/1 Running 0 6m21s nvidia-cc-manager-yzbw7 1/1 Running 0 3m36s nvidia-kata-manager-bw5mb 1/1 Running 0 3m36s nvidia-sandbox-device-plugin-daemonset-cr4s6 1/1 Running 0 2m37s nvidia-sandbox-validator-9wjm4 1/1 Running 0 2m37s nvidia-vfio-manager-vg4wp 1/1 Running 0 3m36s
验证
kata-qemu-nvidia-gpu
和kata-qemu-nvidia-gpu-snp
运行时类可用$ kubectl get runtimeclass
示例输出
NAME HANDLER AGE kata kata 37m kata-clh kata-clh 37m kata-clh-tdx kata-clh-tdx 37m kata-qemu kata-qemu 37m kata-qemu-nvidia-gpu kata-qemu-nvidia-gpu 96s kata-qemu-nvidia-gpu-snp kata-qemu-nvidia-gpu-snp 96s kata-qemu-sev kata-qemu-sev 37m kata-qemu-snp kata-qemu-snp 37m kata-qemu-tdx kata-qemu-tdx 37m nvidia nvidia 97s
可选:如果您有对工作节点的主机访问权限,则可以执行以下步骤
确认主机对 GPU 使用
vfio-pci
设备驱动程序$ lspci -nnk -d 10de:
示例输出
65:00.0 3D controller [0302]: NVIDIA Corporation xxxxxxx [xxx] [10de:xxxx] (rev xx) Subsystem: NVIDIA Corporation xxxxxxx [xxx] [10de:xxxx] Kernel driver in use: vfio-pci Kernel modules: nvidiafb, nouveau
确认 NVIDIA Kata Manager 安装了
kata-qemu-nvidia-gpu-snp
运行时类文件$ ls -1 /opt/nvidia-gpu-operator/artifacts/runtimeclasses/kata-qemu-nvidia-gpu-snp/
示例输出
5.19.2.tar.gz config-5.19.2-109-nvidia-gpu-sev configuration-kata-qemu-nvidia-gpu-snp.toml dpkg.sbom.list kata-ubuntu-jammy-nvidia-gpu.initrd vmlinuz-5.19.2-109-nvidia-gpu-sev ...
管理保密计算模式#
支持三种模式
on
– 启用保密计算。off
– 禁用保密计算。devtools
– 用于软件开发和调试的开发模式。
您可以设置集群范围的默认模式,也可以在单个节点上设置模式。在节点上设置的模式优先于集群范围的默认模式。
设置集群范围的默认模式#
要设置集群范围的模式,请指定 ccManager.defaultMode
字段,如以下示例所示
$ kubectl patch clusterpolicies.nvidia.com/cluster-policy \
-p '{"spec": {"ccManager": {"defaultMode": "on"}}}'
设置节点级别模式#
要设置节点级别模式,请应用 nvidia.com/cc.mode=<on|off|devtools>
标签,如以下示例所示
$ kubectl label node <node-name> nvidia.com/cc.mode=on --overwrite
在节点上设置的模式优先于集群范围的默认模式。
验证模式更改#
要验证模式更改是否成功(集群范围或节点级别更改),请查看 nvidia.com/cc.mode.state
节点标签
$ kubectl get node <node-name> -o json | \
jq '.items[0].metadata.labels | with_entries(select(.key | startswith("nvidia.com/cc.mode.state)))'
标签设置为 success
或 failed
。
运行示例工作负载#
保密计算的 Pod 规范需要以下内容
指定
kata-qemu-nvidia-gpu-snp
运行时类。指定直通 GPU 资源。
确定直通 GPU 资源名称
kubectl get nodes -l nvidia.com/gpu.present -o json | \ jq '.items[0].status.allocatable | with_entries(select(.key | startswith("nvidia.com/"))) | with_entries(select(.value != "0"))'
示例输出
{ "nvidia.com/GH100_H100_PCIE": "1" }
创建一个文件,例如
cuda-vectoradd-coco.yaml
,如下例所示apiVersion: v1 kind: Pod metadata: name: cuda-vectoradd-coco annotations: cdi.k8s.io/gpu: "nvidia.com/pgpu=0" io.katacontainers.config.hypervisor.default_memory: "16384" spec: runtimeClassName: kata-qemu-nvidia-gpu-snp restartPolicy: OnFailure containers: - name: cuda-vectoradd image: "nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda11.7.1-ubuntu20.04" resources: limits: "nvidia.com/GH100_H100_PCIE": 1
io.katacontainers.config.hypervisor.default_memory
注释使用 16 GB 内存启动 VM。修改该值以适应您的工作负载。创建 Pod
$ kubectl apply -f cuda-vectoradd-coco.yaml
查看 Pod 的日志
$ kubectl logs -n default cuda-vectoradd-coco
示例输出
[Vector addition of 50000 elements] Copy input data from the host memory to the CUDA device CUDA kernel launch with 196 blocks of 256 threads Copy output data from the CUDA device to the host memory Test PASSED Done
删除 Pod
$ kubectl delete -f cuda-vectoradd-coco.yaml
有关 Pod 注释的信息,请参阅 关于 Pod 注释。
工作负载故障排除#
如果示例工作负载未运行,请确认您已标记节点以在容器中运行虚拟机
$ kubectl get nodes -l nvidia.com/gpu.workload.config=vm-passthrough
示例输出
NAME STATUS ROLES AGE VERSION
kata-worker-1 Ready <none> 10d v1.27.3
kata-worker-2 Ready <none> 10d v1.27.3
kata-worker-3 Ready <none> 10d v1.27.3
证明#
关于证明#
对于保密计算,证明是硬件和软件是可信的断言。
Kata 运行时使用 kata-ubuntu-jammy-nvidia-gpu.initrd
初始 RAM 磁盘文件,该文件是 Kubernetes 的 NVIDIA Kata Manager 从 NVIDIA Container Registry (nvcr.io) 下载的。初始 RAM 磁盘包括一个 NVIDIA 验证器工具,该工具作为容器来宾预启动 hook 运行。当证明成功时,GPU 将设置为 Ready
状态。如果失败,容器仍然会启动,但 CUDA 应用程序将失败并显示 system not initialized
错误。
有关证明的更多信息,请参阅 http://docs.nvda.net.cn/confidential-computing 上的NVIDIA Hopper 保密计算证明验证器。
访问已调度的保密容器的 VM#
您无需将访问 VM 作为例行任务。访问 VM 对于故障排除或执行有关保密计算模式的较低级别验证非常有用。
此任务需要主机访问运行容器的 Kubernetes 节点。
确定 Kubernetes 节点和 Pod 沙箱 ID
$ kubectl describe pod <pod-name>
访问 Kubernetes 节点。通常使用安全 shell。
访问 Kata 运行时
$ kata-runtime exec <pod-sandbox-ID>
查看 GPU 就绪状态#
访问 VM 后,您可以运行 nvidia-smi conf-compute -grs
Confidential Compute GPUs Ready state: ready
查看保密计算模式#
访问 VM 后,您可以运行 nvidia-smi conf-compute -f
以查看模式
CC status: ON
验证证明是否成功#
访问 VM 后,您可以运行以下命令来验证证明是否成功
# source /gpu-attestation/nv-venv/bin/activate
# python3 /gpu-attestation/nv_attestation_sdk/tests/SmallGPUTest.py
示例输出
[SmallGPUTest] node name : thisNode1
[['LOCAL_GPU_CLAIMS', <Devices.GPU: 2>, <Environment.LOCAL: 2>, '', '', '']]
[SmallGPUTest] call attest() - expecting True
Number of GPUs available : 1
-----------------------------------
Fetching GPU 0 information from GPU driver.
VERIFYING GPU : 0
Driver version fetched : 535.86.05
VBIOS version fetched : 96.00.5e.00.01
Validating GPU certificate chains.
GPU attestation report certificate chain validation successful.
The certificate chain revocation status verification successful.
Authenticating attestation report
The nonce in the SPDM GET MEASUREMENT request message is matching with the generated nonce.
Driver version fetched from the attestation report : 535.86.05
VBIOS version fetched from the attestation report : 96.00.5e.00.01
Attestation report signature verification successful.
Attestation report verification successful.
Authenticating the RIMs.
Authenticating Driver RIM
Schema validation passed.
driver RIM certificate chain verification successful.
The certificate chain revocation status verification successful.
driver RIM signature verification successful.
Driver RIM verification successful
Authenticating VBIOS RIM.
RIM Schema validation passed.
vbios RIM certificate chain verification successful.
The certificate chain revocation status verification successful.
vbios RIM signature verification successful.
VBIOS RIM verification successful
Comparing measurements (runtime vs golden)
The runtime measurements are matching with the golden measurements.
GPU is in the expected state.
GPU 0 verified successfully.
attestation result: True
claims list:: {'x-nv-gpu-availability': True, 'x-nv-gpu-attestation-report-available': ...
True
[SmallGPUTest] token : [["JWT", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e..."],
{"LOCAL_GPU_CLAIMS": "eyJhbGciOiJIUzI1NiIsInR5cCI..."}]
[SmallGPUTest] call validate_token() - expecting True
True
证明故障排除#
要排除证明失败故障,请访问 VM 并查看 /var/log/
目录中的日志。
要排除虚拟机故障,请访问 Kubernetes 节点并使用 journalctl
命令查看日志。
$ sudo journalctl -u containerd -f
Kata 代理通过使用 VSOCK 端口与主机上的 virtcontainers 库通信。通信记录到主机上的系统日志中。当您查看日志时,请参阅带有 kata
或 virtcontainers
前缀的日志。
其他资源#
NVIDIA 保密计算文档可在 http://docs.nvda.net.cn/confidential-computing 获取。
NVIDIA 验证器工具是 nvTrust 项目的一部分。有关更多信息,请参阅 NVIDIA/nvtrust。