在K8S上部署可扩展的基于Occlum的安全推理实例

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 机密计算是指通过在基于硬件的可信执行环境(TEE)中执行计算来保护数据应用中的隐私安全,是目前最火热的隐私保护技术之一。在云上运行TEE应用也得到了云厂商的广泛支持,包括阿里云,微软Azure云,都提供了基于SGX技术的机密安全实例服务。用户可以在这些云上申请带SGX支持的安全实例,然后部署自己的机密安全服务,既可以避免隐私数据泄露,也无需操心繁琐的基础架构层的配置。无论哪种云,最流行的分布式部署

机密计算是指通过在基于硬件的可信执行环境(TEE)中执行计算来保护数据应用中的隐私安全,是目前最火热的隐私保护技术之一。在云上运行TEE应用也得到了云厂商的广泛支持,包括阿里云,微软Azure云,都提供了基于SGX技术的机密安全实例服务。用户可以在这些云上申请带SGX支持的安全实例,然后部署自己的机密安全服务,既可以避免隐私数据泄露,也无需操心繁琐的基础架构层的配置。


无论哪种云,最流行的分布式部署运行框架都是基于谷歌Kubernetes(K8S)。本文就以阿里云机密安全实例为基座,介绍了基于标准的K8S,部署可扩展的基于Occlum的安全推理(Tensorflow Seving)实例。


阿里云K8S环境搭建及SGX Plugin安装

首先,我们需要一个安装了SGX Plugin的K8S集群环境。在本例中,我们在阿里云申请了两台g7t的ECS实例(ecs.g7t.4xlarge),基本配置如下:


CPU核数

内存

安全内存(EPC)

操作系统

32

64GB

32GB

Ubuntu 20.04 LTS 2


系统内核需要升级以支持SGX。

$ sudo apt install --install-recommends linux-generic-hwe-20.04


然后,需要在每台实例上配置安装K8S环境,其中一台作为master node,一台作为worker node。细节不再赘述,用户可以使用自己的方式创建集群,或者可以参考谷歌文档 “使用kubedm创建集群”。在本例中,K8S集群使用containerd做运行时,flannel做为网络插件,然后设置主节点也可以参与任务分配以保证有足够的资源应对后面的扩展推理任务。


安装Intel SGX Plugin

为了在K8S上支持SGX,必须安装SGX插件。我们选择DaemonSet的方式,可以参考Intel的文档

首先部署cert manager并验证。

$ kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.8.0/cert-manager.yaml
$ kubectl get pods --namespace cert-manager
NAME                                       READY   STATUS    RESTARTS   AGE
cert-manager-6868fddcb4-97zng              1/1     Running   0          27m
cert-manager-cainjector-6d6bbc7965-vjhdh   1/1     Running   0          27m
cert-manager-webhook-59f66d6c7b-clfrj      1/1     Running   0          27m


然后就可以安装SGX Plugin。

下载Intel Device Plugins 源码 并启用。

$ kubectl apply -k ${INTEL_DEVICE_PLUGINS_SRC}/deployments/sgx_plugin/overlays/epc-register/


一切顺利的话,过一会儿,我们可以得到如下运行的pod列表。

$ kubectl get po -A
NAMESPACE      NAME                                        READY   STATUS    RESTARTS   AGE
cert-manager   cert-manager-6868fddcb4-97zng               1/1     Running   0          41m
cert-manager   cert-manager-cainjector-6d6bbc7965-vjhdh    1/1     Running   0          41m
cert-manager   cert-manager-webhook-59f66d6c7b-clfrj       1/1     Running   0          41m
kube-system    coredns-7f74c56694-7m96p                    1/1     Running   0          84m
kube-system    coredns-7f74c56694-vq5lx                    1/1     Running   0          84m
kube-system    etcd-k8s-master-sh-16c                      1/1     Running   12         84m
kube-system    intel-sgx-plugin-blth6                      1/1     Running   0          20s
kube-system    intel-sgx-plugin-mxw26                      1/1     Running   0          20s
kube-system    kube-apiserver-k8s-master-sh-16c            1/1     Running   10         84m
kube-system    kube-controller-manager-k8s-master-sh-16c   1/1     Running   10         84m
kube-system    kube-flannel-ds-hzxjr                       1/1     Running   0          58m
kube-system    kube-flannel-ds-nxn6s                       1/1     Running   0          84m
kube-system    kube-proxy-vv9lp                            1/1     Running   0          58m
kube-system    kube-proxy-wmc2k                            1/1     Running   0          84m
kube-system    kube-scheduler-k8s-master-sh-16c            1/1     Running   12         84m
kube-system    sgx-node-init-fpnp7                         1/1     Running   0          29s
kube-system    sgx-node-init-jxzrr                         1/1     Running   0          29s

验证SGX Device Plugin加载成功

最后一步,可以查看node信息来确认SGX插件安装成功。

$ kubectl describe node k8s-master-sh-16c |grep sgx.intel.com
                    sgx.intel.com/capable=true
  sgx.intel.com/enclave:    110
  sgx.intel.com/epc:        33285996544
  sgx.intel.com/provision:  110
  sgx.intel.com/enclave:    110
  sgx.intel.com/epc:        33285996544
  sgx.intel.com/provision:  110
  sgx.intel.com/enclave    0           0
  sgx.intel.com/epc        0           0
  sgx.intel.com/provision  0           0

编译部署基于Occlum的安全推理Pods

本文选取的例子是从Tensorflow Serving原始应用容器出发,应用本身不修改,应用Occlum远程证明方案Init-RA,实现全流程数据保护的应用实例架构。具体的全流程安全保护的细节介绍可以参考文章“使用Occlum在TEE环境轻松部署Tensorflow Serving推理应用”或者直接查看Occlum github相关页面

总体架构

对于基于K8S部署的本例来说,总体结构如下图:



各个模块的基本介绍如下:

Key broker service (密钥分发服务)

GRPC-RATLS Server pod 作为密钥分发服务工作。它运行于SGX环境里,保证了密钥的安全性。它会根据通过安全的GRPC-RATLS连接传递的请求,派发相应的密钥。


TF Service (推理服务)

多个Tensorflow Serving pods组成了推理服务。本例中使用NodePort的方式把推理服务暴露给用户。实际的用例里用户也可以根据需要使用云厂商的LoadBalancer方式。具体可以扩展的Tensorflow Serving pods数目是由K8S集群的资源决定的,尤其是安全内存(EPC)的大小。


Client(用户)

用户可以使用服务证书(server.crt) 向推理服务发起推理请求。推理服务会把这个请求转发到某一个Tensorflow Serving pod已完成推理动作。


PCCS Server

远程证明依赖于自建或者云厂商提供的PCCS服务。本例因为是运行在阿里云上,所以可以直接使用阿里云的PCCS服务。


如何编译

本例中使用的容器镜像,可以在docker hub上直接下载。

docker pull occlum/init_ra_server:0.29.2-ubuntu20.04
docker pull occlum/tf_demo:0.29.2-ubuntu20.04
docker pull occlum/tf_demo_client:0.29.2-ubuntu20.04


如果用户需要从源码编译/修改,可以在Occlum github上找到所有信息

具体步骤如下:

  1. 启动Occlum官方的开发容器镜像。

$ sudo docker run --rm -itd --network host \
				--device /dev/sgx/enclave --device /dev/sgx/provision \
        -v $(which docker):/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock \
        occlum/occlum:0.29.2-ubuntu20.04
  1. 下载Occlum源码,然后进入路径 “example/kubernetes”,里面有一个编译脚本 “build.sh" 可以一键完成所有的编译,包括grpc-ratls库的编译,occlum镜像的编译,以及最终容器镜像的生成。

Build Occlum TF examples container images for k8s deployment.
usage: build.sh [OPTION]...
    -r  the container image registry
    -g  container image tag
    -d  GPRC RA server domain
    -p  GPRC RA server port

例如,希望容器的registry是“demo”,tag设置成“0.29.2”,可以如下使用。

# ./build.sh -r demo -g 0.29.2

完成编译后,会生成如下三个容器镜像。

  • demo/init_ra_server:0.29.2

  • demo/tf_demo:0.29.2

  • demo/tf_demo_client:0.29.2


如何部署

修改yaml文件模板

在Occlum github上提供了本例的yaml文件模板,不过用户需要根据实际情况做出如下的修改。


  • 根据实际编译情况,修改容器镜像的名字和tag。

  • 根据实际部署环境情况,修改PCCS_URL的环境变量值。

这里我们直接使用阿里云的PCCS service。如果是是其他的PCCS 服务,用户可以修改这个环境变量。


  • 如果有需要,修改资源限制的值。

        resources:
          limits:
            sgx.intel.com/epc: "8000Mi"
            cpu: "1000m"

本例中,对于推理服务,因为默认编译里Occlum “user_space_size”设置为7000MB,所以相应的yaml文件里EPC资源限制为“8000Mi”。另外,为了在benchmark环节体现可扩展性带来的性能提升,对于每一个推理pod,CPU限制为“1000m”。


  • 在Occlum v1.0之前,参数“taskset -c 2,3,4,5”是必须要的。这是为了限制Tensorflow Seving应用启动的线程数,使之不超过在Occlum编译阶段设置的SGX线程数 “max_num_of_threads”。当Occlum v1.0引入异步协程后(预计2022年年底发布),这一参数就不再需要了。


启动密钥分发服务

$ kubectl apply -f occlum_init_ra_server.yaml

等一会儿,如果成功的话,可以在对应Pod的log里看到如下信息:

Server listening on 0.0.0.0:5000


启动Tensorflow Serving 推理服务

$ kubectl apply -f occlum_tf_demo.yaml

等一会儿,如果成功的话,可以在对应Pod的log里看到如下信息:

Running gRPC ModelServer at 0.0.0.0:9001 ...

默认情况,只启动了一个Tensorflow Serving pod。


测试发起推理请求

$ docker run --rm --network host sevenzheng/tf_demo_client:0.29.2 python3 inception_client.py --server=localhost:31001 --crt server.crt --image cat.jpg

上面的命令运行了一个预制在demo用户容器镜像里的python程序,它使用编译时生成的server.crt自签名证书,发送一张图片(cat.jpg)请求Tensorflow Serving 服务来做推理。如果成功的话,它会打印出推理的结果。


扩展性benchmark测试

下面的命令会发起一个推理服务的benchmark。

$ docker run --rm --network host demo/tf_demo_client:0.29.2 python3 benchmark.py --server localhost:31001 --crt server.crt --cnum 4 --loop 10 --image cat.jpg

它会打印出benchmark的结果,包括latency和tps。


kubectl scale deploy tf-demo-deployment --replicas 3

尝试扩展推理服务pod从1到3,再次启动benchmark,可以获得更低的latency和更高的tps。

总结

本文的重点放在如何在K8S环境配置Intel SGX插件,如何编译/部署可扩展的Occlum的安全推理实例。至于GRPC-RATLS远程证明密钥分发的细节,各个模块之间的交互,Occlum镜像的编译,Occlum镜像到容器镜像的转换,请参考如下的一些技术文章,或者直接查看Occlum github上的代码和脚本

使用Occlum在TEE环境轻松部署远程证明服务和应用

使用Occlum在TEE环境轻松部署Tensorflow Serving推理应用


其他选择

运行环境

本例虽然是在运行在阿里云机密安全实例上自建的K8S集群上,但实际上,它适用于任何支持Intel SGX2的机器/虚机/云上实例。

远程证明方案

本例采用的是开源的GRPC-RATLS远程证明为基础的密钥分发方案。但是,因为Occlum创新的“Occlum -> init ->application”启动流程模型,只要很少的改动,本例就可以适配其他的远程证明密钥分发方案。

要点就是把所有和远程证明相关的实现都放在Occlum init进程里,实际的应用本身(如本例的Tensorflow Serving)无需改动或者只要极小的改动就行。


把远程证明放到Occlum init进程里,可以参考示例“maa_init”。然后用户可以配置 Azure Key Vault 作为密钥分发服务。


这是一个开源的方案,包括密钥分发服务和用户端接口。同样的,配置启动AECS server作为密钥分发服务,把AECS客户端接口实现在用户应用(例如本例中的Tensorflow Serving)的Occlum init进程里。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
弹性计算 人工智能 Serverless
阿里云ACK One:注册集群云上节点池(CPU/GPU)自动弹性伸缩,助力企业业务高效扩展
在当今数字化时代,企业业务的快速增长对IT基础设施提出了更高要求。然而,传统IDC数据中心却在业务存在扩容慢、缩容难等问题。为此,阿里云推出ACK One注册集群架构,通过云上节点池(CPU/GPU)自动弹性伸缩等特性,为企业带来全新突破。
|
3月前
|
Kubernetes 持续交付 Docker
利用 Docker 和 Kubernetes 实现微服务部署
【10月更文挑战第2天】利用 Docker 和 Kubernetes 实现微服务部署
|
20天前
|
存储 Kubernetes 容器
K8S部署nexus
该配置文件定义了Nexus 3的Kubernetes部署,包括PersistentVolumeClaim、Deployment和服务。PVC请求20Gi存储,使用NFS存储类。Deployment配置了一个Nexus 3容器,内存限制为6G,CPU为1000m,并挂载数据卷。Service类型为NodePort,通过30520端口对外提供服务。所有资源位于`nexus`命名空间中。
|
29天前
|
弹性计算 调度 数据中心
阿里云 ACK One 注册集群云上弹性:扩展业务新利器
随着企业数字化转型深入,传统IDC数据中心因物理容量限制,难以实现动态扩容,缺乏弹性能力。阿里云ACK One注册集群凭借其高度灵活性和丰富资源选择,成为解决此问题的最佳方案。通过与阿里云资源的整合,ACK One不仅实现了计算资源的按需扩展,提高了资源利用率,还通过按需付费模式降低了成本,使企业能够更高效地应对业务增长和高峰需求。
|
3月前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
156 60
|
3月前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
285 62
|
2月前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
2月前
|
Prometheus Kubernetes 监控
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
|
2月前
|
存储 Kubernetes Devops
Kubernetes集群管理和服务部署实战
Kubernetes集群管理和服务部署实战
71 0
|
3月前
|
Kubernetes 安全 Cloud Native
云上攻防-云原生篇&K8s安全-Kubelet未授权访问、API Server未授权访问
本文介绍了云原生环境下Kubernetes集群的安全问题及攻击方法。首先概述了云环境下的新型攻击路径,如通过虚拟机攻击云管理平台、容器逃逸控制宿主机等。接着详细解释了Kubernetes集群架构,并列举了常见组件的默认端口及其安全隐患。文章通过具体案例演示了API Server 8080和6443端口未授权访问的攻击过程,以及Kubelet 10250端口未授权访问的利用方法,展示了如何通过这些漏洞实现权限提升和横向渗透。
281 0
云上攻防-云原生篇&K8s安全-Kubelet未授权访问、API Server未授权访问

热门文章

最新文章

下一篇
开通oss服务