
# 在CCE中容器化使用QingTian Enclave
QingTian Enclave是一种在现有的QingTian架构ECS中引入的新型安全结构。它是一个完全隔离的虚拟机，无持久化存储、交互式访问或外部网络连接，能够确保数据的临时性和安全性，提供高度安全和隔离的执行环境，可运行敏感任务和应用程序。关于QingTian Enclave的更多详情请参见[什么是QingTian Enclave](https://support.huaweicloud.com/usermanual-ecs/ecs_03_1402.html)。
**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   
![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002265237834.png "点击放大")
#### 前提条件
已创建一个CCE Standard或Turbo集群。
#### 纳管Enclave节点至CCE集群
1. 登录ECS控制台，创建支持Enclave的虚拟机，如c7t类型，且规格为4核8GiB及以上。您需要选择Linux作为系统镜像，建议使用Huawei Cloud EulerOS 2.0，并在"可信系统"中勾选Enclave。 
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002263900152.png "点击放大")
   
   
   
2. 由于该ECS随后需要被CCE纳管，因此创建时需要注意以下配置： 
   - 存储：可先添加一块数据盘，要求20GiB及以上，供容器运行时和kubelet组件使用。 ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002264004324.png "点击放大")
     
     
   
   - 网络：需要选择集群所在的虚拟私有云。 ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002298772737.png "点击放大")
     
     
   
   
   
   
3. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群，在左侧导航栏中选择"节点管理"，切换至"节点"页签并单击右上角的"纳管节点"。
4. 使用"添加已有服务器"，并选择已经创建的ECS服务器。 
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002264166704.png "点击放大")
   
   
   
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
   ```
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002298776033.png "点击放大")
   
   
   
6. 按需填写其他参数，完成节点纳管。关于参数说明详情可参见[纳管节点](https://support.huaweicloud.com/usermanual-cce/cce_10_0198.html)。
   
   等待节点纳管成功后，单击该节点所在行的"更多 \> 查看YAML"，查看节点的YAML，可以看到已经有可调度的QingTian Enclave资源。
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002264148024.png "点击放大")
   
   
 
#### 准备使用QingTian Enclave的容器镜像
1. 准备一台支持QingTian Enclave特性的ECS虚拟机实例，操作系统为Huawei Cloud EulerOS 2.0，构建QingTian Enclave镜像**hello-enclave.eif** ，步骤详情请参见[QingTian Enclave快速入门](https://support.huaweicloud.com/usermanual-ecs/ecs_03_1404.html)。
   
   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
         ```
         
      
      3. 为Docker配置镜像加速，详情请参见[设置镜像加速器](https://support.huaweicloud.com/usermanual-swr/swr_01_0045.html)
       
   
   2. 安装qt CLI工具，并在配置文件中按需设置资源隔离参数，然后启动资源隔离服务。使用qt CLI工具需要安装必要的python库，详情请参见[QingTian CLI（qt CLI）](https://support.huaweicloud.com/usermanual-ecs/ecs_03_1416.html)。
      ```
      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集群中部署使用。步骤详情请参见[上传镜像](https://support.huaweicloud.com/qs-swr/index.html)。
   
   
   
   
 
#### 在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.cn-east-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!
   ...
   ```
   
   
 
