Update 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系统搭建
根据Intel官方库手动编译TD Partitioning组件,并替换L1 Kernel为项目中的L1-kernel。
#!/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"
更改以下.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的对应组件)
#!/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
depmod -a
modprobe tdx_guest
git clone https://github.com/kenplusplus/tdx-tools.git
cd tdx-tools/attestation/pytdxmeasure && ./tdx_tdreport
执行image-manage/image-encrypt.sh镜像加密并传送到quay.io库(需要安装路径安装好skopeo加密组件)
image-manage/image-encrypt.sh
执行image-manage/image-decrypt.sh镜像解密后传送到quay.io库,供后续容器运行时拉取
image-manage/image-decrypt.sh
参考 https://blog.csdn.net/m0_53928179/article/details/139068769 部署L1 VM为k8s主节点,并修改其同时为工作节点通过operator自动化runtimeclass部署工具,将kata-containers镜像应用到k8s,形成kata-tdpart-runtime执行环境
首先进入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-runtimetest.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的日志结果
journalctl -u containerd -f
©Copyright 2023 CCF 开源发展委员会 Powered by Trustie& IntelliDE 京ICP备13000930号
介绍
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发布脚本
L1内核配置
更改以下.config配置
make && make modules_install 安装内核模块到L1 VM(需要先用常规内核和inirtd创建,在L1 VM中安装内核模块,再替换为L1-kernel的对应组件)
L2 VM创建脚本
L1 VM远程认证
depmod -a
分析内核模块,之后modprobe tdx_guest
使能/dev/tdx_guest设备git clone https://github.com/kenplusplus/tdx-tools.git
cd tdx-tools/attestation/pytdxmeasure && ./tdx_tdreport
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
kubectl apply -f test.yaml
通过
journalctl -u containerd -f
观察kata-tdpart-runtime的日志结果