在ACK集群中基于机密虚拟机实现CAA机密容器方案

更新时间:
复制 MD 格式

在金融风控、医疗健康等需要实现机密计算的场景下,您可以在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形式创建并运行在机密虚拟机内,整个容器生命周期的运行时数据受硬件保护,可防止来自虚拟机外部的攻击。流程如下:

image

准备工作

步骤一:配置RRSA

CAA 需要操作ECSVPC资源才能创建和管理机密虚拟机。通过RRSACloud API Adaptor ServiceAccount配置RAM角色与权限策略,可将权限收敛到Pod级别。

1、创建RAM角色

请参见创建可信实体为身份提供商的RAM角色创建一个RAM角色。本示例RAM角色名为ack-caa-demo,主要参数如下。

配置项

描述

身份提供者类型

OIDC。

身份提供者

选择ack-rrsa-<CLUSTER_ID>。其中,<CLUSTER_ID>为集群ID。

条件

  • oidc:iss:保持默认。

  • oidc:aud:保持默认。

  • oidc:sub:手动添加该条件,进一步精确可扮演RAM角色的ServiceAccount(confidential-containers-system命名空间下的Cloud API Adaptor)。

    • 条件键:选择oidc:sub

    • 运算符:选择StringEquals

    • 条件值:按照页面提示添加以下条件值:

      • system:serviceaccount:confidential-containers-system:cloud-api-adaptor

      • system:serviceaccount:confidential-containers-system:peerpod-ctrl-controller-manager

角色名称

ack-caa-demo。

创建后,您可以在RAM角色详情页面的基本信息区域,获取其ARN,供后续配置身份认证使用。

2、创建权限策略

  1. 参见下方脚本创建一个名为 ack-caa-policy的 RAM 权限策略,授予ECSVPC的操作权限。操作入口,请参见创建自定义权限策略

    {
      "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": "*"
        }
      ]
    }
  2. 为此前创建的RAM角色授予权限策略ack-caa-policy。操作入口,请参见管理RAM角色的权限

步骤二:创建节点池并配置安全组

创建一个节点池承载 CAA 的控制器工作负载,并为该节点池的安全组开放 CAA 依赖的端口。

本节点池仅用于运行 CAA 控制面组件,不直接承载业务 Pod。节点池无需使用机密计算实例规格,选择普通节点即可。
  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点池

  3. 单击创建节点池,按照页面提示完成节点池的配置。

    下表仅介绍主要配置项。详细配置项说明请参见创建和管理节点池

    配置项

    描述

    托管配置

    选择不开启

    交换机

    选择可用区下的vSwitch,节点池会在该可用区下弹出节点。

    操作系统

    Ubuntu 24.04 64

    期望节点数

    节点池初始节点数量,需为1个节点及以上。

    以下为高级配置(页面下拉,展开高级选项(选填)

    节点标签(Labels)

    新增如下节点标签,便于CAA控制器的调度。

    • 键:node.kubernetes.io/worker

    • 值:留空

  4. 在节点池列表,单击节点池名称,然后单击基本信息页签,在节点池信息区域单击安全组ID,跳转至安全组详情页面。

  5. 入方向区域,单击增加规则,增加如下两条规则。

    协议

    访问来源

    访问目的

    说明

    自定义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-manager

2、部署 Cloud API Adaptor

  1. 创建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
  2. 下载项目源码。

    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
  3. 修改 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-beijing

    m-2ze2vxvrxsbue3sf8b02

    华东1(杭州)

    cn-hangzhou

    m-bp146ws6x3iyuwjvbdw2

    中国香港

    cn-hongkong

    m-j6c3kfz2vhu6ze04wacb

    新加坡

    ap-southeast-1

    m-t4ng1w8ipua3c0o57hor

  4. 创建集群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
  5. 部署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创建的机密虚拟机资源残留。

  1. 将以下文件保存为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'
  2. 部署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
  3. 访问ECS管理控制台,在左侧导航栏单击实例,查看以podvm-开头的TDX 机密虚拟机,表明CAA已成功创建底层计算资源。

常见问题

执行kubectl -n confidential-containers-system get pod后无cloud-api-adaptor-daemonset 服务运行

可能原因

Worker节点可能缺少必要标签,导致相关Pod无法正确调度到节点。

解决方案
  1. 检查节点标签。

    kubectl get nodes --show-labels
  2. 为目标节点添加标签。

    for NODE_NAME in $(kubectl get nodes -o jsonpath='{.items[*].metadata.name}'); do
      kubectl label node $NODE_NAME node.kubernetes.io/worker=
    done
  3. 等待1~2分钟后,重新检查Pod状态。

    kubectl -n confidential-containers-system get pod

相关链接

联系我们

如有任何产品问题或使用建议,欢迎您加入钉群(钉群号:30521601)联系我们。