文档首页/ 云容器引擎 CCE/ 最佳实践/ 容器/ 在CCE中容器化使用QingTian Enclave
更新时间:2025-05-06 GMT+08:00

在CCE中容器化使用QingTian Enclave

QingTian Enclave是一种在现有的QingTian架构ECS中引入的新型安全结构。它是一个完全隔离的虚拟机,无持久化存储、交互式访问或外部网络连接,能够确保数据的临时性和安全性,提供高度安全和隔离的执行环境,可运行敏感任务和应用程序。关于QingTian Enclave的更多详情请参见什么是QingTian Enclave

QingTian Enclave的核心功能如下:

  • 完全独立的虚拟机:QingTian Enclave是一个在ECS内部构建的独立虚拟机,拥有自己的操作系统和资源,在逻辑上和外部ECS完全隔离,确保了高安全性。
  • 无持久化存储:QingTian Enclave虚拟机不包含持久化存储,所有数据在虚拟机关闭后都会丢失。这种设计确保了数据的临时性和安全性,避免了数据泄露的风险。
  • 无交互式访问或外部网络连接:QingTian Enclave虚拟机不支持交互式访问,如SSH连接。它也不具备外部网络连接能力,只能通过内部安全通道与外部ECS通信。
  • 高度隔离和访问控制:即使是外部ECS上的root用户,也不能直接访问QingTian Enclave。外部ECS上的任何用户或进程都必须通过安全的本地通道(Vsock)与QingTian Enclave进行通信。这个通道确保了数据传输的安全性和完整性,防止了中间人攻击和数据泄露。

QingTian Enclave的适用场景如下:

  • 敏感数据处理:QingTian Enclave可以用于处理敏感数据,如加密密钥、个人身份信息等,确保这些数据在处理过程中不会被泄露。
  • 安全计算:在需要执行高度安全的计算任务时,QingTian Enclave可以提供一个隔离的环境,防止恶意软件或攻击者的干扰。
  • 隐私保护:QingTian Enclave可用于保护用户的隐私数据,确保敏感信息在传输和处理过程中保持安全。

一般情况下,您可以在QingTian架构的虚拟机中直接创建Enclave实例,但是该运行方式难以支持实例的动态扩缩容,不能方便地按照业务量动态调整。本文将指导您如何在CCE集群中容器化使用QingTian Enclave,通过Kubernetes调度和扩缩容能力,更好地实现业务弹性。

方案架构

在CCE集群中容器化使用QingTian Enclave时,您需要在节点上安装支持容器化运行QingTian Enclave的插件,然后将QingTian Enclave镜像文件(eif)打包成容器镜像,就可以在CCE集群中容器化创建Enclave实例。kubelet会通过Enclave生命周期管理接口(/dev/qtbox_service0)进行分配和调度。

与直接在虚拟机运行QingTian Enclave实例相比,容器化运行Enclave时,业务会被划分为不可信部分和可信部分。其中不可信部分包括应用的对外服务组件和Enclave管理相关组件(如qt-enclave工具),而可信部分则是涉及加解密或敏感信息保护的业务,运行在Enclave实例中。

运行Enclave容器时,会使用qt-enclave工具通过安全的本地通道(Vsock)创建QingTian Enclave虚拟机,用于运行加解密或敏感信息保护的业务。

图1 在CCE集群中使用Enclave

前提条件

已创建一个CCE Standard或Turbo集群。

纳管Enclave节点至CCE集群

  1. 登录ECS控制台,创建支持Enclave的虚拟机,如c7t类型,且规格为4核8GiB及以上。您需要选择Linux作为系统镜像,建议使用Huawei Cloud EulerOS 2.0,并在“可信系统”中勾选Enclave。

  2. 由于该ECS随后需要被CCE纳管,因此创建时需要注意以下配置:

    • 存储:可先添加一块数据盘,要求20GiB及以上,供容器运行时和kubelet组件使用。

    • 网络:需要选择集群所在的虚拟私有云。

  3. 登录CCE控制台,单击集群名称进入集群,在左侧导航栏中选择“节点管理”,切换至“节点”页签并单击右上角的“纳管节点”。
  4. 使用“添加已有服务器”,并选择已经创建的ECS服务器。

  5. 在节点上通过执行脚本安装支持QingTian Enclave的组件。在“高级配置 > 安装后执行脚本”中,填写以下内容:

    curl -k https://cce-statics.ap-southeast-3.obs.ap-southeast-3.myhuaweicloud.com/job-platform-package/cce-addons/addons-qt-enclave-20250417103811268.zip -o /tmp/addons-qt-enclave.zip
    cd /tmp
    unzip addons-qt-enclave.zip
    cd addons
    bash post_install.sh

  6. 按需填写其他参数,完成节点纳管。关于参数说明详情可参见纳管节点

    等待节点纳管成功后,单击该节点所在行的“更多 > 查看YAML”,查看节点的YAML,可以看到已经有可调度的QingTian Enclave资源。

准备使用QingTian Enclave的容器镜像

  1. 准备一台支持QingTian Enclave特性的ECS虚拟机实例,操作系统为Huawei Cloud EulerOS 2.0,构建QingTian Enclave镜像hello-enclave.eif,步骤详情请参见QingTian Enclave快速入门

    1. 登录ECS虚拟机,安装Docker用于构建镜像。
      1. 确认repo源配置正常。

        请检查默认的/etc/yum.repos.d/hce.repo配置文件中参数是否正确,正确的配置如下。

        [base]
        name=HCE $releasever base
        baseurl=https://repo.huaweicloud.com/hce/$releasever/os/$basearch/
        enabled=1
        gpgcheck=1
        gpgkey=https://repo.huaweicloud.com/hce/$releasever/os/RPM-GPG-KEY-HCE-2
        [updates]
        name=HCE $releasever updates
        baseurl=https://repo.huaweicloud.com/hce/$releasever/updates/$basearch/
        ......
      2. 安装docker软件包。
        yum install docker -y
    2. 安装qt CLI工具,并在配置文件中按需设置资源隔离参数,然后启动资源隔离服务。使用qt CLI工具需要安装必要的python库,详情请参见QingTian CLI(qt CLI)
      yum install qt-enclave-bootstrap
      yum install virtio-qtbox
      yum install qingtian-tool

      安装必要的python库:

      pip3 install docker knack
    3. 在配置文件中按需配置隔离参数,本教程内使用默认1G内存,2个vCPU。然后启动隔离服务:
      systemctl start qt-enclave-env
    4. 构建QingTian Enclave镜像。本教程中,使用以下hello_enclave.sh脚本作为QingTian Enclave应用程序。

      vi hello_enclave.sh

      内容如下:

      #!/bin/bash
      while true
      do
          echo "hello enclave!"
          sleep 2
      done

      创建Dockerfile:

      vi Dockerfile

      内容如下:

      FROM ubuntu:latest
      COPY hello_enclave.sh /root/hello_enclave.sh
      CMD ["/root/hello_enclave.sh"]
    5. 确认脚本有可执行权限:
      chmod +x hello_enclave.sh 
    6. 构建一个名为hello-enclave的Docker镜像:
      docker build -f Dockerfile -t hello-enclave .
    7. 使用qt enclave make-img命令将Docker镜像转换为名为hello-enclave.eif的QingTian Enclave镜像:
      qt enclave make-img --docker-uri hello-enclave --eif hello-enclave.eif

      输出为:

      {
          "digest":   "SHA384",
          "PCR0": "63bf78ece7d2388ff773d0cad2ebc9a3070359db46d567ba271ff8adfb8b0b091be4ff4d5dda3f1c83109096e3656f3b",
          "PCR8": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
      }

  2. 使用QingTian Enclave镜像hello-enclave.eif构建容器镜像,构建完成的容器镜像将具备Enclave特性。

    1. 准备容器构建环境。
      mkdir container
      cd container
      cp /usr/local/bin/qt .
      cp /etc/qingtian/enclave/qt-enclave-env.conf .
      cp /root/hello-enclave.eif .
    2. 在container目录下创建Dockerfile。
      vi Dockerfile
      内容如下:
      FROM ubuntu
      RUN apt update && \
              apt install -y python3 && \
              apt install -y python3-pip && \
              apt install -y python3-docker && \
              apt install -y python3-knack && \
              apt install -y libcjson-dev && \
              apt install -y libglib2.0-dev && \
              ln -s /usr/bin/python3 /usr/bin/python && \
              mkdir -p  /etc/qingtian/enclave && \
              mkdir -p /var/log/qingtian_enclaves && \
              mkdir -p /var/log/qlog
       
      COPY qt-enclave-env.conf /etc/qingtian/enclave/
      COPY qt /usr/bin
      COPY hello-enclave.eif /
      COPY entrypoint.sh /
      ENTRYPOINT /entrypoint.sh
    3. 在container目录下创建entrypoint.sh。
      vi entrypoint.sh
      内容如下:
      #!/bin/bash
      qt enclave start --mem 4096 --cpus 2 --eif hello-enclave.eif --cid 4--debug-mode
      qt enclave console --enclave-id 0
    4. 构建具备Enclave特性的容器镜像。
      docker build -f Dockerfile -t enclave-demo .
    5. 您可以将构建完成的容器镜像上传到SWR中,在Kubernetes集群中部署使用。步骤详情请参见上传镜像

在CCE中部署Enclave容器

  1. 创建enclave-deployment.yaml文件,部署工作负载。

    示例如下,其中镜像地址请替换为制作镜像时上传到SWR的镜像地址:
    kind: Deployment
    apiVersion: apps/v1
    metadata:
      name: hello-enclave
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: hello-enclave
          version: v1
      template:
        metadata:
          labels:
            app: hello-enclave
            version: v1
        spec:
          containers:
            - name: container-1
              image: swr.ap-southeast-3.myhuaweicloud.com/container/enclave-demo:latest
              resources:
                limits:
                  cpu: 250m
                  huawei.com/qt_enclaves: '1'
                  hugepages-1Gi: 4Gi
                  memory: 512Mi
                requests:
                  cpu: 250m
                  huawei.com/qt_enclaves: '1'
                  hugepages-1Gi: 4Gi
                  memory: 512Mi
              imagePullPolicy: IfNotPresent
              securityContext:
                seccompProfile:
                  type: Unconfined

  2. 创建工作负载。

    kubectl create -f enclave-deployment.yaml

    回显如下:

    deployment.apps/hello-enclave created

  3. 查看Pod运行状态。

    kubectl get pod | grep hello-enclave

    回显如下:

    hello-enclave-587b9f6d49-bvq22          1/1     Running                  0          38s

  4. 查看Pod日志。

    kubectl logs hello-enclave-587b9f6d49-bvq22 --tail=10

    日志中应该显示如下内容,说明Enclave容器已经成功运行。

    hello enclave!
    hello enclave!
    hello enclave!
    hello enclave!
    ...