使用 SNP 内存加密启动容器

如何使用 SNP 内存加密启动容器

说明: 本文为英文文档的中文译版,英文原版请参见 Container Launch with SNP Memory Encryption。

使用 SNP 内存加密启动容器

启动机密服务

要以 SNP 内存加密方式启动容器,需要显式指定 SNP runtime class,也就是 kata-qemu-snp。这里使用一个提前构建好的 alpine 测试镜像(Dockerfile)。这个镜像已经启用 SSH,并预置了一个用于验证的 SSH 公钥。

下面是一个指定 SNP runtime class 的示例 Service 和 Deployment:

kind: Service
apiVersion: v1
metadata:
  name: "confidential-unencrypted"
spec:
  selector:
    app: "confidential-unencrypted"
  ports:
  - port: 22
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: "confidential-unencrypted"
spec:
  selector:
    matchLabels:
      app: "confidential-unencrypted"
  template:
    metadata:
      labels:
        app: "confidential-unencrypted"
      annotations:
        io.containerd.cri.runtime-handler: kata-qemu-snp
    spec:
      runtimeClassName: kata-qemu-snp
      containers:
      - name: "confidential-unencrypted"
        image: ghcr.io/kata-containers/test-images:unencrypted-nightly
        imagePullPolicy: Always

把这段 YAML 保存为 confidential-unencrypted.yaml。

启动服务:

kubectl apply -f confidential-unencrypted.yaml

检查是否有错误:

kubectl describe pod confidential-unencrypted

如果 Events 区域没有报错,说明容器已经成功以 SNP 内存加密方式启动。

验证 SNP 内存加密

可以通过容器内的 dmesg 输出来确认 SNP 内存加密是否已经启用。上面的示例镜像内置了对应私钥所匹配的 SSH 公钥,因此可以直接远程登录验证。

先获取 Pod IP:

pod_ip=$(kubectl get pod -o wide | grep confidential-unencrypted | awk '{print $6;}')

下载 SSH 私钥并设置权限:

wget https://github.com/kata-containers/kata-containers/raw/main/tests/integration/kubernetes/runtimeclass_workloads/confidential/unencrypted/ssh/unencrypted -O confidential-image-ssh-key

chmod 600 confidential-image-ssh-key

下面这条命令会通过 SSH 到容器内部执行命令,检查 SNP 内存加密是否生效:

ssh -i confidential-image-ssh-key \
  -o "StrictHostKeyChecking no" \
  -t root@${pod_ip} \
  'dmesg | grep "Memory Encryption Features"'

如果 SNP 已经启用,输出应类似:

[    0.150045] Memory Encryption Features active: AMD SNP
最后修改 September 3, 2026: docs(zh-cn): add NVIDIA GPU examples (563981a)