目录
目录README.md

介绍

kata-tdpart-runtime是基于kata-containers开发的新型容器运行时,其调用contaianerd shim v2接口,创建TDX机密虚拟机,并管理虚拟机内容器的创建、启动、终止、删除。与传统TDX机密容器不同,kata-tdpart-runtime通过TD分区技术,将远程认证以及镜像解密的过程下方到L1 VM(离线阶段),从而降低运行时启动容器时的开销。

硬件环境

服务器具备Intel xeon 5/6 代CPU,8路DIMM内存(启动SGX所需),主板支持BIOS启动TDX特性。

软件环境

本项目基于Ubuntu 22.04系统搭建

安装引导

TD Partitioning

根据Intel官方库手动编译TD Partitioning组件,并替换L1 Kernel为项目中的L1-kernel。

L1 VM发布脚本

#!/bin/bash

MEMORY=64G
CPU=12

# L1 QEMU: td_part_l1_qemu
QEMU=./qemu-system-x86_64

# L1 Kernel: td_part_l1_vmm
KERNEL=/home/tdx/td-partioning/L1-kernel/arch/x86/boot/bzImage

# L1 BIOS: td_part_l1_ovmf
BIOS=/home/tdx/td-partioning/L1-ovmf/Build/IntelTdx/DEBUG_GCC5/FV/OVMF.fd

# L2 BIOS: td_part_l2_ovmf
L2BIOS=/home/tdx/td-partioning/L2-ovmf/Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd

sudo $QEMU -m $MEMORY \
    -nographic \
    -serial file:./qemu.log \
    -vga none \
    -smp ${CPU} \
    -cpu host,host-phys-bits,pmu=off \
    -device virtio-serial,romfile= \
    -chardev stdio,id=virtiocon0,mux=on,signal=off,logfile=./logs/vm_log_$(date +"%FT%H%M").log \
    -device virtconsole,chardev=virtiocon0 \
    -monitor chardev:virtiocon0 \
    -netdev user,id=unet,hostfwd=tcp::2223-:22,hostfwd=tcp::5900-:5900 -device virtio-net-pci,netdev=unet \
    -bios ${BIOS} \
    -kernel $KERNEL \
    -initrd /home/tdx/td-partioning/L1-kernel/lib/modules/initramfs.img-6.2.0-rc3+ \
    -drive if=virtio,format=qcow2,media=disk,index=0,file=/home/tdx/td-partioning/images/noble-server-cloudimg-amd64.img \
    -machine q35,accel=kvm,l2bios=${L2BIOS}\
    -object memory-backend-memfd-private,id=ram1,size=$MEMORY \
    -object tdx-guest,id=tdx0,debug=on,sept-ve-disable=on,num-l2-vms=3 \
    -machine kernel-irqchip=split,sata=off,pic=off,pit=off,memory-backend=ram1 \
    -machine confidential-guest-support=tdx0 \
    -append "root=/dev/vda1 rw console=hvc0 nomce no-kvmclock no-steal-acc ignore_loglevel nopat memmap=1023M\$1M memmap=15G\$4G"

L1内核配置

更改以下.config配置

CONFIG_STRICT_DEVMEM = n  
CONFIG_TDX_GUEST_DRIVER=y  
CONFIG_MISC_DEVICE=y  
CONFIG_SEV=n  
CONFIG_BINFMT_MISC=y   
CONFIG_NLS=y 
CONFIG_NLS_ISO8859_1=y 
CONFIG_FAT_FS=y 
CONFIG_VFAT_FS=y 
CONFIG_MSDOS_FS=y 
CONFIG_IKCONFIG=y 
CONFIG_IKCONFIG_PROC=y

make && make modules_install 安装内核模块到L1 VM(需要先用常规内核和inirtd创建,在L1 VM中安装内核模块,再替换为L1-kernel的对应组件)

L2 VM创建脚本

#!/bin/bash
MEMORY=16G
# td_part_l2_qemu
QEMU=/home/l1/l2-vm/L2-qemu/build/qemu-system-x86_64
KERNEL=/home/l1/l2-vm/vmlinuz-6.8.0-57-generic
INITRD=/home/l1/l2-vm/initrd.img-6.8.0-57-generic
sudo $QEMU -m $MEMORY \
-nographic \
-enable-kvm \
-serial stdio \
-cpu host,-mtrr \
-smp 1,sockets=1,maxcpus=1 \
-nodefaults \
-kernel $KERNEL \
-initrd $INITRD \
-append "root=/dev/vda1 ro console=ttyS0 ignore_loglevel earlyprintk=ttyS0" \
-drive if=virtio,format=qcow2,file=/home/l1/l2-vm/L2_rootfs2.img \
-netdev user,id=unet,hostfwd=tcp::2222-:22 -device virtio-net-pci,netdev=unet \
-object memory-backend-file,mem-path=/dev/mem,size=${MEMORY},share=on,id=mem0 \
-M q35,accel=kvm,kvm-type=td-part,memory-backend=mem0,max-ram-below-4g=1G

L1 VM远程认证

  1. 启用设备:depmod -a分析内核模块,之后modprobe tdx_guest使能/dev/tdx_guest设备
  2. 安装工具:git clone https://github.com/kenplusplus/tdx-tools.git
  3. 获取quote:cd tdx-tools/attestation/pytdxmeasure && ./tdx_tdreport
  4. 打印到/tmp/quote.bat并scp传到Host,进行验证

kata-tdpart-runtime部署

镜像生命周期

在Host

执行image-manage/image-encrypt.sh镜像加密并传送到quay.io库(需要安装路径安装好skopeo加密组件)

在L1 VM

执行image-manage/image-decrypt.sh镜像解密后传送到quay.io库,供后续容器运行时拉取

kubernetes环境部署

参考 https://blog.csdn.net/m0_53928179/article/details/139068769 部署L1 VM为k8s主节点,并修改其同时为工作节点
通过operator自动化runtimeclass部署工具,将kata-containers镜像应用到k8s,形成kata-tdpart-runtime执行环境

kata-containers容器制作

首先进入kata-tdpart-runtime根目录,再进入src/runtime,指定使用go1.23.3,make编译
在根目录创建kata-static文件夹,其中包含opt/kata/bin、opt/kata/share目录,可以依照kata-static-3.18.0-amd64.tar.xz的结构,将编译完成的二进制以及Pod的配置文件放到对应目录,之后通过kata-deploy/localbuid/kata-deploy-build-and-upload-payload.sh制作成容器工具上传

kata-tdpart-runtime的使用

编写了一个测试样例来使用 kata-tdpart-runtime
test.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test-tdx-alpine
spec:
                                                   
  containers:
  - image: registry.cn-hangzhou.aliyuncs.com/img_mirror/library.alpine:latest
    command:
      - top
    imagePullPolicy: Always
    name: test-tdx-alpine
  restartPolicy: Never

kubectl apply -f test.yaml
通过journalctl -u containerd -f观察kata-tdpart-runtime的日志结果

关于
2.9 GB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

©Copyright 2023 CCF 开源发展委员会
Powered by Trustie& IntelliDE 京ICP备13000930号