在金融风控、医疗健康等需要实现机密计算的场景下,您可以在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.22.0),再部署机密计算工作负载。工作负载以Pod形式创建并运行在机密虚拟机内,整个容器生命周期的运行时数据受硬件保护,可防止来自虚拟机外部的攻击。流程如下:
准备工作
TDX机密计算环境存在一些已知功能限制,在使用前请充分了解。
已创建一个ACK托管集群Pro版,且满足以下需求。详细信息,请参见创建ACK托管集群。
配置项
说明
地域和可用区
仅支持华北2(北京)、华东1(杭州)、中国香港和新加坡。
如需创建vSwitch,请参见创建和管理交换机。
Kubernetes 版本
1.34及以上。
如需升级集群,请参见手动升级集群。
网络插件
Flannel。
为专有网络配置 SNAT
开启,为集群开启访问公网的能力。
也支持为已创建的集群启用该能力,请参见为集群开启访问公网的能力。
RRSA OIDC
开启。RRSA可在集群内实现Pod维度的OpenAPI权限隔离,从而实现云资源访问权限的细粒度隔离,降低安全风险。
也支持为已创建的集群启用该能力,请参见通过RRSA配置ServiceAccount的RAM权限实现Pod权限隔离。
启用后,请参见获取集群中OIDC提供商的URL和ARN信息获取提供商ARN,供后续配置身份认证使用。
步骤一:配置RRSA
CAA 需要操作ECS和VPC资源才能创建和管理机密虚拟机。通过RRSA为Cloud API Adaptor ServiceAccount配置RAM角色与权限策略,可将权限收敛到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 依赖的端口。
本节点池仅用于运行 CAA 控制面组件,不直接承载业务 Pod。节点池无需使用机密计算实例规格,选择普通节点即可。
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择。
单击创建节点池,按照页面提示完成节点池的配置。
下表仅介绍主要配置项。详细配置项说明请参见创建和管理节点池。
配置项
描述
托管配置
选择不开启。
交换机
选择可用区下的vSwitch,节点池会在该可用区下弹出节点。
操作系统
Ubuntu 24.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
根据集群所在地域,执行对应命令安装。
中国内地
通过阿里云镜像源安装,避免拉取社区镜像超时。
mkdir cert-manager
cat << EOF > cert-manager/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- https://github.com/jetstack/cert-manager/releases/download/v1.15.3/cert-manager.yaml
images:
- name: quay.io/jetstack/cert-manager-controller
newName: registry-cn-hangzhou.ack.aliyuncs.com/dev/cert-manager-controller
- name: quay.io/jetstack/cert-manager-webhook
newName: registry-cn-hangzhou.ack.aliyuncs.com/dev/cert-manager-webhook
- name: quay.io/jetstack/cert-manager-cainjector
newName: registry-cn-hangzhou.ack.aliyuncs.com/dev/cert-manager-cainjector
EOF
kubectl apply -k cert-manager中国香港及海外
直接使用社区镜像安装。
mkdir cert-manager
cat << EOF > cert-manager/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- https://github.com/jetstack/cert-manager/releases/download/v1.15.3/cert-manager.yaml
EOF
kubectl apply -k cert-manager2、部署 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.22.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虚拟机启动镜像,按集群所在地域取值,取值请参见下表。
各地域对应的镜像ID如下。
地域
地域ID
镜像ID
华北2(北京)
cn-beijingm-2ze2vxvrxsbue3sf8b02华东1(杭州)
cn-hangzhoum-bp146ws6x3iyuwjvbdw2中国香港
cn-hongkongm-j6c3kfz2vhu6ze04wacb新加坡
ap-southeast-1m-t4ng1w8ipua3c0o57hor创建集群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工作负载。根据集群所在地域,执行对应操作。
中国内地
使用以下内容新建文件
./mirror-values.yaml,配置使用阿里云镜像源。image: name: registry-cn-hangzhou.ack.aliyuncs.com/dev/coco-cloud-api-adaptor tag: v0.22.0 resourceCtrl: image: repository: registry-cn-hangzhou.ack.aliyuncs.com/dev/peerpod-ctrl tag: v0.22.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.22.0 authProxy: image: registry-cn-hangzhou.ack.aliyuncs.com/dev/kube-rbac-proxy:v0.14.0 kata-deploy: image: reference: confidential-ai-registry.cn-shanghai.cr.aliyuncs.com/product/kata-deploy tag: 4.0.0 kubectlImage: reference: registry-cn-hangzhou.ack.aliyuncs.com/dev/kata-containers-kubectl tag: latest执行以下命令部署。
helm dependency update helm install peerpods . \ -f providers/alibabacloud.yaml \ -f ./mirror-values.yaml \ --set secrets.mode=reference \ --set secrets.existingSecretName=my-provider-creds \ --set alibabacloud.rrsa.enable=true \ --dependency-update \ -n confidential-containers-system中国香港及海外
执行以下命令部署。
helm dependency update helm install peerpods . \ -f providers/alibabacloud.yaml \ --set secrets.mode=reference \ --set secrets.existingSecretName=my-provider-creds \ --set alibabacloud.rrsa.enable=true \ --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
相关链接
Kata Containers CI Dashboard:阿里云PeerPods已加入官方nightly CI测试,可在Confidential Containers页签的Cloud API Adaptor子页签查看测试结果。
联系我们
如有任何产品问题或使用建议,欢迎您加入钉群(钉群号:30521601)联系我们。