在金融风控、医疗健康等需要实现机密计算的场景下,您可以在ACK集群中通过CAA(Cloud API Adaptor)方案部署机密计算工作负载,基于Intel® TDX技术保护敏感数据免受外部攻击或云厂商的潜在威胁,以满足行业的合规要求。
Intel® TDX是一项基于CPU硬件的ECS保护技术,详情请参见TDX介绍。
功能介绍
CAA( Cloud API Adaptor,也称 Peer Pods)是云原生CNCF机密容器Confidential Containers项目的核心组件之一,可通过调用云平台 OpenAPI 将机密计算能力无缝集成到 Kubernetes 集群中,自动创建机密虚拟机。这些虚拟机可作为特殊的“机密沙箱”来运行工作负载 Pod,使用底层硬件的 TEE 技术来保护工作负载的运行时数据安全。优势如下。
简单易用:无需运维底层裸金属架构或嵌套虚拟化技术栈,连接ACK集群后可通过kubectl命令部署机密计算工作负载。
安全机密:工作负载运行在ECS机密虚拟机中,基于硬件级内存加密与隔离机制确保运行时数据的完整性与机密性。
开源兼容:ACK协同Confidential Containers社区实现了在集群中基于 CAA 方案部署机密计算工作负载,通过代码开源透明化(Code Transparency)接受社区持续审计。
您可以在ACK集群中部署 CAA DaemonSet (官方版本v0.19.0),然后在此基础上部署机密计算工作负载。工作负载会以Pod的形式创建并运行在机密虚拟机内,从而保证整个容器生命周期的运行时数据安全,防止虚拟机之外的攻击者攻击。流程如下。
准备工作
TDX机密计算环境存在一些已知功能限制,在使用前请充分了解。
已创建一个ACK托管集群Pro版,且满足以下需求。详细信息,请参见创建ACK托管集群。
配置项
说明
地域和可用区
仅支持华北2(北京)可用区I和新加坡可用区B。
如需创建vSwitch,请参见创建和管理交换机。
Kubernetes 版本
1.34及以上。
如需升级集群,请参见手动升级集群。
网络插件
Flannel。
为专有网络配置 SNAT
开启,为集群开启访问公网的能力。
也支持为已创建的集群启用该能力,请参见为集群开启访问公网的能力。
RRSA OIDC
开启。RRSA可在集群内实现Pod维度的OpenAPI权限隔离,从而实现云资源访问权限的细粒度隔离,降低安全风险。
也支持为已创建的集群启用该能力,请参见通过RRSA配置ServiceAccount的RAM权限实现Pod权限隔离。
启用后,请参见获取集群中OIDC提供商的URL和ARN信息获取提供商ARN,供后续配置身份认证使用。
步骤一:配置RRSA
为了让CAA在机密容器场景下能够管理和配置机密虚拟机,您需要配置必要的身份(RAM 角色)和权限(RAM 策略)。下文介绍如何让Cloud API Adaptor ServiceAccount获得操作ECS和VPC资源的权限,实现Pod级别的精细权限控制。
1、创建RAM角色
请参见创建可信实体为身份提供商的RAM角色创建一个RAM角色。本示例RAM角色名为ack-caa-demo,主要参数如下。
配置项 | 描述 |
身份提供者类型 | OIDC。 |
身份提供者 | 选择ack-rrsa-<CLUSTER_ID>。其中,<CLUSTER_ID>为集群ID。 |
条件 |
|
角色名称 | ack-caa-demo。 |
创建后,您可以在RAM角色详情页面的基本信息区域,获取其ARN,供后续配置身份认证使用。
2、创建权限策略
参见下方脚本创建一个名为
ack-caa-policy的 RAM 权限策略,授予ECS和VPC的操作权限。操作入口,请参见创建自定义权限策略。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:RunInstances", "ecs:DeleteInstance", "ecs:DescribeInstanceAttribute", "ecs:CreateNetworkInterface", "ecs:DeleteNetworkInterface", "ecs:AttachNetworkInterface", "ecs:ModifyNetworkInterfaceAttribute", "ecs:DescribeNetworkInterfaceAttribute" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "vpc:DescribeVSwitchAttributes", "vpc:AllocateEipAddress", "vpc:ReleaseEipAddress", "vpc:AssociateEipAddress", "vpc:UnassociateEipAddress", "vpc:DescribeEipAddresses" ], "Resource": "*" } ] }为此前创建的RAM角色授予权限策略
ack-caa-policy。操作入口,请参见管理RAM角色的权限。
步骤二:创建节点池并配置安全组
您需要创建一个节点池,用于部署 CAA 方案的控制器工作负载。同时,您还需配置节点池的安全组规则,开放 CAA 方案依赖的特定端口。
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择。
单击创建节点池,按照页面提示完成节点池的配置。
下表仅介绍主要配置项。详细配置项说明请参见创建和管理节点池。
配置项
描述
托管配置
选择不开启。
交换机
选择可用区下的vSwitch,节点池会在该可用区下弹出节点。
操作系统
Ubuntu 22.04 64位。
期望节点数
节点池初始节点数量,需为1个节点及以上。
以下为高级配置(页面下拉,展开高级选项(选填))
节点标签(Labels)
新增如下节点标签,便于CAA控制器的调度。
键:
node.kubernetes.io/worker值:留空
在节点池列表,单击节点池名称,然后单击基本信息页签,在节点池信息区域单击安全组ID,跳转至安全组详情页面。
在入方向区域,单击增加规则,增加如下两条规则。
协议
访问来源
访问目的
说明
自定义TCP
本VPC网段
15150
支持CAA组件与机密虚拟机之间的安全通信。
自定义UDP
本VPC网段
4789
基于VXLAN实现机密容器的网络管理。
步骤三:利用 Helm Chart 部署 CAA
请参见下文部署CAA的核心组件:
Cert Manager:用于CAA Webhook等组件的证书校验,属于CAA部署的前置依赖。
CAA(Cloud API Adaptor) :包含了Kata Containers的远程运行时Kata Remote Runtime、CAA节点DaemonSet等,整体配合可根据Pod调度请求动态创建机密虚拟机作为Pod的运行时节点。
1、部署 Cert Manager
参见以下命令进行安装。
2、部署 Cloud API Adaptor
创建Helm管理的Namespace。
kubectl apply -f - << EOF apiVersion: v1 kind: Namespace metadata: name: confidential-containers-system labels: app.kubernetes.io/managed-by: Helm annotations: meta.helm.sh/release-name: peerpods meta.helm.sh/release-namespace: confidential-containers-system EOF下载项目源码。
git clone https://github.com/confidential-containers/cloud-api-adaptor.git -b v0.19.0 cd cloud-api-adaptor/src/cloud-api-adaptor/install/charts/peerpods修改
providers/alibabacloud.yaml文件中的相关配置。参数
说明
providerConfigs.alibabacloud.SECURITY_GROUP_IDS虚拟机安全组ID,即步骤二所创建的节点池的安全组ID。
providerConfigs.alibabacloud.VSWITCH_ID虚拟机交换机ID,即步骤二所创建的节点池在可用区下的交换机ID。
providerConfigs.alibabacloud.REGION集群所在区域。例如
cn-beijing。providerConfigs.alibabacloud.IMAGEID虚拟机启动镜像。
华北2(北京):修改为
m-2zef6zaa0j0qz3sunhjp。新加坡:修改为
m-t4n9ocuen5sy6rhbxbk1。
使用以下内容新建文件
./mirror-values.yaml,配置使用阿里云镜像源。image: name: registry-cn-hangzhou.ack.aliyuncs.com/dev/coco-cloud-api-adaptor tag: 2274f17ad298088eeefa20fe4b3a58a350ceab4e resourceCtrl: image: repository: registry-cn-hangzhou.ack.aliyuncs.com/dev/peerpod-ctrl tag: v0.19.0 authProxy: image: registry-cn-hangzhou.ack.aliyuncs.com/dev/kube-rbac-proxy:v0.14.0 webhook: image: repository: registry-cn-hangzhou.ack.aliyuncs.com/dev/peer-pods-webhook tag: v0.19.0 authProxy: image: registry-cn-hangzhou.ack.aliyuncs.com/dev/kube-rbac-proxy:v0.14.0 kata-deploy: image: reference: registry-cn-hangzhou.ack.aliyuncs.com/dev/coco-kata-deploy tag: 3.28.0 kubectlImage: reference: registry-cn-hangzhou.ack.aliyuncs.com/dev/kata-containers-kubectl tag: v0.19.0创建集群Secret,供CAA DaemonSet调用阿里云API创建TDX实例。
替换
${ALIBABA_CLOUD_ROLE_ARN}为RAM 角色ARN,${ALIBABA_CLOUD_OIDC_PROVIDER_ARN}为RRSA OIDC的提供商 ARN。kubectl create secret generic my-provider-creds \ -n confidential-containers-system \ --from-literal=ALIBABA_CLOUD_ROLE_ARN=${ALIBABA_CLOUD_ROLE_ARN} \ --from-literal=ALIBABA_CLOUD_OIDC_PROVIDER_ARN=${ALIBABA_CLOUD_OIDC_PROVIDER_ARN} \ --from-literal=ALIBABA_CLOUD_OIDC_TOKEN_FILE=/var/run/secrets/ack.alibabacloud.com/rrsa-tokens/token部署CAA工作负载。
helm dependency update helm install peerpods . \ -f providers/alibabacloud.yaml \ -f ./mirror-values.yaml \ --set secrets.mode=reference \ --set secrets.existingSecretName=my-provider-creds \ --dependency-update \ -n confidential-containers-system等待大概3分钟后,检查部署状态。
kubectl -n confidential-containers-system get pod预期输出:
NAME READY STATUS RESTARTS AGE cloud-api-adaptor-daemonset-pnmpz 1/1 Running 0 20m cloud-api-adaptor-daemonset-qhlqk 1/1 Running 0 20m cloud-api-adaptor-daemonset-zpkt5 1/1 Running 0 20m kata-deploy-89x8h 1/1 Running 0 20m kata-deploy-fcpb8 1/1 Running 0 20m kata-deploy-jfkjg 1/1 Running 0 20m peerpodctrl-controller-manager-bfdb466fb-xl8xc 2/2 Running 0 20m预期输出包含
kata-deploy-*、cloud-api-adaptor-daemonset-*和peerpodctrl-controller-manager-*组件,状态均为Running,表明部署成功。
步骤四:部署示例应用
下文将部署一个示例应用,使用 runtimeClassName: kata-remote 为机密容器运行时。当Pod调度时,Kata Remote将触发CAA动态创建一台TDX机密虚拟机。
后续如需删除集群,删除集群前,请先删除所有使用runtimeClassName: kata-remote的工作负载,以避免CAA创建的机密虚拟机资源残留。
将以下文件保存为pod-caa-demo.yaml,用于部署一个使用机密容器运行时的Pod。
apiVersion: v1 kind: Pod metadata: name: pod-caa-demo spec: runtimeClassName: kata-remote containers: - image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3:latest name: hello command: - sh - -c - 'echo hello && sleep infinity'部署pod-caa-demo.yaml。
kubectl apply -f pod-caa-demo.yaml等待大概3分钟,确认应用是否部署成功。
kubectl get pod pod-caa-demo预期输出:
NAME READY STATUS RESTARTS AGE pod-caa-demo 1/1 Running 0 52s访问ECS管理控制台,在左侧导航栏单击实例,查看以
podvm-开头的TDX 机密虚拟机,表明CAA已成功创建底层计算资源。
常见问题
执行kubectl -n confidential-containers-system get pod后无cloud-api-adaptor-daemonset 服务运行
可能原因
Worker节点可能缺少必要标签,导致相关Pod无法正确调度到节点。
解决方案
检查节点标签。
kubectl get nodes --show-labels为目标节点添加标签。
for NODE_NAME in $(kubectl get nodes -o jsonpath='{.items[*].metadata.name}'); do kubectl label node $NODE_NAME node.kubernetes.io/worker= done等待1-2分钟后,重新检查Pod状态。
kubectl -n confidential-containers-system get pod
相关链接
联系我们
如有任何产品问题或使用建议,欢迎您加入钉群(钉群号:30521601)联系我们。