中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

K8s TEE设备插件支持

为了使能K8s对TEE资源的感知和管理,TrustZone提供了TEE设备插件,以便K8s能够将CA/TA容器调度到合适的节点上。

  • 插件仅上报TEE侧的内存资源。并通过虚拟设备数量的方式实现多 PoD 对TEE内存的共享。
  • 插件运行需要TEE环境为机密OS,TEE OS升级为机密OS的方式可参考机密OS升级
  • 支持最小内存分配精度和健康检查周期可配,最小分配精度默认512KB,可配范围需>=512(单位KB),健康检查周期默认60s,配置0表示不进行健康检查。两者可在启动插件时通过参数“-precision xx”“-internal xx”配置。
  • 对于每个TA容器,用户可根据配置的最小分配精度和TA资源配置文件“configs.xml”中的堆内存设置合适的值。设置大了会导致内存浪费,设置小了会导致TA应用因内存不足而异常退出。
  • 申请插件的TA开发者证书时,建议将TA应用设为常驻TA,即将instanceKeepAlive设为true。
  • 编译TA应用需要在Arm服务器上执行。
  • openEuler系统上K8s环境搭建可参考《Kubernetes 1.18.20 部署指南》中“配置部署环境”相关内容。
  1. 安装编译环境,其中go的版本需要大于等于1.15。
    yum install make gcc
    wget https://go.dev/dl/go1.15.15.linux-arm64.tar.gz
    tar xzvf go1.15.15.linux-arm64.tar.gz
    export PATH=$PWD/go/bin/:$PATH
    go version

  2. 获取设备插件源码,以及itrustee_sdk用于编译插件TA部分。itrustee_sdk与kunpengsecl在同一层目录下。
    git clone -b tee-device-plugin https://gitee.com/openeuler/kunpengsecl.git
    git clone https://gitee.com/openeuler/itrustee_sdk.git
  3. 配置TA编译资源。
    1. 参考调测环境TA应用开发者证书申请 获取TA证书(config和private_key.pem),并放到“kunpengsecl/tee-device-plugin/cmd/TA”对应目录下。
      mkdir -p kunpengsecl/tee-device-plugin/cmd/TA/TA_cert
      mkdir -p kunpengsecl/tee-device-plugin/cmd/TA/signed_config

      拷贝后的目录结构如下:

    2. 修改“manifest.txt”
      1. 打开“manifest.txt”文件。
        vim kunpengsecl/tee-device-plugin/cmd/TA/manifest.txt
      2. “i”键进入编辑模式,根据申请TA证书时configs.xml的配置修改里面对应的值,可参考配置manifest.txt文件

      3. “Esc”键退出编辑模式,输入:wq!并按“Enter”键保存退出文件。
    3. 修改CA代码。
      1. 打开“tee_mem_ca.c”文件。
        vim kunpengsecl/tee-device-plugin/cmd/CA/libteememca/tee_mem_ca.c
      2. “i”键进入编辑模式,将CA应用的UUID修改为实际值。

      3. “Esc”键退出编辑模式,输入:wq!并按“Enter”键保存退出文件。
  4. 编译设备插件。
    cd kunpengsecl/tee-device-plugin
    make

    编译完成后,将在“pkg”目录下生成如下文件。

    若直接在宿主机上部署插件,可通过如下命令部署和启动。

    cp pkg/libteememca.so /usr/lib64/
    cp pkg/tee-device-plugin /vendor/bin
    cp pkg/*.sec /data/
    /vendor/bin/tee-device-plugin
  5. 基于设备插件应用构建Docker镜像。
    1. 拷贝设备插件应用和依赖到“docker”目录,依赖文件可从支持TrustZone的服务器上获取。

      应该从和基础镜像一致的系统上拷贝,以免系统差异导致应用或库无法使用。

      cp pkg/* docker/
      cp /usr/bin/tlogcat docker/
      cp /usr/lib64/libteec.so docker/
      cp /usr/lib64/libboundscheck.so docker/

    2. 构建镜像。
      cd docker
      docker build -t tee-device-plugin .

  6. 将镜像上传到镜像仓库,以便部署时计算节点可从仓库拉取到镜像,用户可将仓库名改为自己的私有仓库。
    docker tag tee-device-plugin:latest <repository>/tee-device-plugin:latest
    docker push <repository>/tee-device-plugin:latest

  7. 为支持TrustZone的服务器打上标签,以便以Daemonset模式部署的插件可以自动部署到对应节点上。
    kubectl label nodes <node-name> teetype=trustzone
  8. 以DaemonSet模式部署插件。
    1. 根据实际修改镜像仓库名。
      cd ../deploy
      vim tee-device-plugin.yml

    2. 部署插件。
      kubectl create -f tee-device-plugin.yml
      kubectl get pods -A -o wide

      至此,插件已成功部署至支持TrustZone的计算节点。

  9. 构建CA/TA应用镜像,并创建PoD配置文件。可参考容器部署支持完成镜像构建,并上传到镜像仓库,参考test-pod.yml编写yml配置文件。
    vim test-pod.yml

  10. 部署PoD应用。部署成功后,可以看到PoD被部署到对应的节点,并占用配置的资源数量。
    kubectl create -f test-pod.yml
    kubectl describe node <node-name>

    kubectl get pods -A -o wide

  11. 查看插件和TA应用的日志。
    1. 查看插件日志。
      kubectl logs -f k8s-tee-device-plugin-ds-<xxxxx> -n kube-system

      其中xxxxx为随机字符串,可根据插件PoD的实际name进行修改。

    2. 查看TA应用日志。
      kubectl logs -f test-pod-ta

若容器启动失败,可按如下步骤排查:

  1. 确定主机上teecd和tzdriver都已加载。
  2. 确定主机上/var/itrustee/teecd/teecd.sock、/dev/teelog、/dev/tc_ns_cvm文件存在。
  3. 确定镜像构建时,libteec.so和tlogcat与主机上的一致。
  4. 确定容器启动时,挂载的文件和7一样。
  5. 若容器内涉及TA2TA的动态加载或安全存储,容器内还需启动agentd守护进程。