すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:ACK クラスター内の機密 VM 上で CAA を使用して機密コンテナーをデプロイする

最終更新日:Dec 20, 2025

金融リスク管理やヘルスケア業界など、機密コンピューティングが要求されるシナリオでは、Cloud API Adaptor (CAA) (Peer pods とも呼ばれる) を使用して、Intel® Trust Domain Extensions (TDX) 上に構築された機密コンピューティング環境にワークロードをデプロイできます。これにより、クラウドサービスプロバイダーが提供するサービスにおける外部攻撃や潜在的なリスクから機密データを保護し、ワークロードが業界のコンプライアンス要件を満たすことを可能にします。

Intel® TDX は、Elastic Compute Service (ECS) が機密コンピューティングを保護するために使用する CPU ハードウェアベースのセキュリティ技術です。詳細については、「TDX の概要」をご参照ください。

機能概要

CAA は、Cloud Native Computing Foundation (CNCF) のプロジェクトである Confidential Containers の主要コンポーネントです。CAA は、クラウドプラットフォーム上の API 操作を呼び出して機密 VM を自動的に作成することにより、機密コンピューティングと Kubernetes を統合できます。機密 VM はワークロードのサンドボックスとして機能し、ハードウェアベースの信頼できる実行環境 (TEE) を提供して、ワークロードのランタイムデータセキュリティを強化します。この CAA ベースのソリューションには、以下の利点があります。

  • 使いやすさ:CAA を使用すると、基盤となるベアメタルサーバーや入れ子になった仮想化スタックを維持する必要がなくなります。Container Service for Kubernetes (ACK) クラスターに CAA をデプロイした後、kubectl を使用して機密ワークロードをデプロイできます。

  • セキュリティと機密性:CAA を使用すると、ハードウェアベースのメモリ暗号化と隔離メカニズム上に構築された ECS 機密 VM 上でワークロードを実行でき、ランタイムデータの整合性と機密性を確保します。

  • コミュニティとの互換性:ACK は Confidential Containers コミュニティと連携して、機密ワークロードのデプロイをサポートしています。さらに、ACK はコードの透明性を確保し、コミュニティによる継続的な監査を可能にしています。

CAA は ACK クラスターに DaemonSet としてデプロイできます。その後、クラスターに機密ワークロードをデプロイできます。機密ワークロードは、機密 VM 上にデプロイされた Pod で実行されます。これにより、Pod のライフサイクル全体を通じてワークロードのランタイムデータセキュリティが確保され、ワークロードが外部攻撃から保護されます。以下の図は、CAA ベースのソリューションのアーキテクチャを示しています。

事前準備

  • TDX 機密コンピューティングには特定の制限事項があります。TDX 機密コンピューティングを使用する前に、これらの制限事項を理解していることを確認してください。

  • ACK マネージド Pro 版クラスターが作成されていること。クラスターは以下の要件を満たす必要があります。詳細については、「ACK マネージドクラスターの作成」をご参照ください。

    パラメーター

    説明

    リージョンゾーン

    中国 (北京) リージョンのゾーン I とシンガポールリージョンのゾーン B のみがサポートされています。

    vSwitch を作成するには、「vSwitch の作成と管理」をご参照ください。

    Kubernetes バージョン

    バージョン 1.34 のみがサポートされています。

    ACK クラスターをアップグレードするには、「クラスターの手動アップグレード」をご参照ください。

    ネットワークプラグイン

    Flannel を選択します。

    VPC の SNAT を設定

    このチェックボックスをオンにします。この機能により、クラスターはインターネットにアクセスできるようになります。

    この機能は、既存の ACK クラスターに対しても有効にできます。詳細については、「既存の ACK クラスターがインターネットにアクセスできるようにする」をご参照ください。

    RRSA OIDC

    有効化を選択します。RAM Roles for Service Accounts (RRSA) 機能を使用すると、特定の OSS ボリュームに対する API 操作を実行する権限を制限できます。これにより、クラウドリソースへのアクセスを詳細に制御し、クラスターのセキュリティを強化できます。

    この機能は、既存の ACK クラスターに対しても有効にできます。詳細については、「RRSA を使用して異なる Pod が異なるクラウドサービスにアクセスすることを承認する」をご参照ください。

    この機能を有効にした後、「URL と ARN 情報の取得」を参照して、認証用の OpenID Connect (OIDC) プロバイダーの Alibaba Cloud Resource Name (ARN) を取得します。

ステップ 1:RRSA の設定

CAA が機密 VM を管理および設定できるようにするには、CAA に ID (RAM ロール) を割り当て、必要な権限 (RAM ポリシー) を付与する必要があります。このセクションでは、Cloud API Adaptor が使用するサービスアカウントに、ECS インスタンスと Virtual Private Cloud (VPC) を管理する権限を付与する方法について説明します。これには、Pod 固有の権限制御が必要です。

1. RAM ロールの作成

信頼できる IdP の RAM ロールの作成」を参照して、RAM ロールを作成します。この例では、RAM ロールの名前は ack-caa-demo です。以下の表に、RAM ロールの主要なパラメーターを示します。

パラメーター

説明

ID プロバイダータイプ

OIDC を選択します。

ID プロバイダー

ack-rrsa-<CLUSTER_ID> を選択します。<CLUSTER_ID> は、ご利用のクラスターの ID を示します。

条件

  • oidc:iss:デフォルト値を使用します。

  • oidc:aud:デフォルト値を使用します。

  • oidc:sub:この条件を手動で追加して、RAM ロールを引き受ける必要があるサービスアカウントを指定します。この例では、Cloud API Adaptor が使用するサービスアカウントは confidential-containers-system 名前空間にあります。

    • キー:oidc:sub を選択します。

    • オペレーター:StringEquals を選択します。

    • 値:system:serviceaccount:confidential-containers-system:cloud-api-adaptor と入力します。

ロール名

ロール名を ack-caa-demo に設定します。

ロールを作成した後、ロールの詳細ページに移動し、基本情報セクションでロールの ARN を記録して認証に使用します。

2. RAM ポリシーの作成

  1. 以下のスクリプトを使用して、ECS と VPC へのアクセス権限を提供する ack-caa-policy ポリシーを作成します。詳細については、「カスタムポリシーの作成」をご参照ください。

    {
      "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 ロールへの権限付与」をご参照ください。

ステップ 2:ノードプールの作成とセキュリティグループルールの設定

CAA コントローラーをデプロイするために使用するノードプールを作成します。CAA が使用するポートを開くために、ノードプールのセキュリティグループルールを設定します。

  1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターをクリックします。

  2. クラスターページで、管理するクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、ノード > ノードプールを選択します。

  3. ノードプールの作成をクリックし、画面の指示に従ってノードプールの設定を完了します。

    以下の表では、主要なパラメーターのみを説明しています。ノードプールのパラメーターの詳細については、「ノードプールの作成と管理」をご参照ください。

    パラメーター

    説明

    マネージドノードプールの設定

    無効化を選択します。

    vSwitch

    サポートされているゾーン下の vSwitch を選択します。ゾーン I のノードがノードプールに追加されます。

    オペレーティングシステム

    Ubuntu 22.04 64 ビットを選択します。

    ノード数 (期待値)

    ノードプールの初期ノード数です。少なくとも 1 つのノードを指定する必要があります。

    詳細オプション (任意) を展開して、詳細設定を行います。

    ノードラベル

    CAA コントローラーのスケジューリングを容易にするために、以下のラベルを追加します。

    • キーを node.kubernetes.io/worker に設定します。

    • 値は空のままにします。

  4. ノードプールページに移動し、作成したノードプールの名前をクリックします。ノードプールの詳細ページで、概要タブをクリックします。ノードプール情報セクションで、セキュリティグループ ID をクリックしてセキュリティグループの詳細ページに移動します。

  5. インバウンドタブで、ルールの追加をクリックして以下のルールを追加します。

    プロトコル

    ソース

    宛先

    説明

    カスタム TCP

    現在の VPC CIDR ブロック

    15150

    CAA コンポーネントが機密 VM と通信できるようにします。

    カスタム UDP

    現在の VPC CIDR ブロック

    4789

    Virtual Extensible Local Area Network (VXLAN) に基づくネットワーク管理を有効にします。

ステップ 3:CAA のデプロイ

以下の主要コンポーネントをデプロイします:

  • Confidential Containers (CoCo) Operator:このコンポーネントは、機密コンテナーが実行されるランタイム環境を自動的にデプロイおよび管理します。例えば、Kata Containers のリモートランタイムは Kata Remote Runtime です。

  • CAA DaemonSet:CAA は DaemonSet としてノードにデプロイされます。このコンポーネントは、クラスター内の Pod スケジューリング要件に基づいて、Pod のランタイムノードとして機密 VM を動的に作成します。

1. CoCo Operator のインストール

次のコマンドを実行して CoCo Operator をインストールします:

インストールコマンド

mkdir -p kustomize && cd kustomize
mkdir release && mkdir -p ccruntime/peer-pods

cat <<EOF > release/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- "github.com/confidential-containers/operator/config/release?ref=v0.17.0"

images:
- name: quay.io/confidential-containers/operator
  newName: registry-cn-hangzhou.ack.aliyuncs.com/dev/coco-operator
EOF

cat <<EOF > ccruntime/peer-pods/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- "github.com/confidential-containers/operator/config/samples/ccruntime/peer-pods?ref=v0.17.0"

images:
- name: quay.io/confidential-containers/reqs-payload
  newName: registry-cn-hangzhou.ack.aliyuncs.com/dev/coco-reqs-payload
- name: quay.io/kata-containers/kata-deploy-ci
  newName: registry-cn-hangzhou.ack.aliyuncs.com/dev/coco-kata-deploy-ci
- name: quay.io/kata-containers/kata-deploy
  newName: registry-cn-hangzhou.ack.aliyuncs.com/dev/coco-kata-deploy
EOF

kubectl apply -k release
kubectl apply -k ccruntime/peer-pods

2. CAA DaemonSet のデプロイ

  1. プロジェクトのソースコードをダウンロードします。

    git clone https://github.com/confidential-containers/cloud-api-adaptor.git -b v0.17.0
    cd cloud-api-adaptor
  2. src/cloud-api-adaptor/install/overlays/alibabacloud/kustomization.yaml の設定を変更します。

    パラメーター

    説明

    newTag

    CAA DaemonSet のコンテナイメージのバージョンタグです。この値を v0.17.0-alibaba-alpha0 に変更します。

    SECURITY_GROUP_IDS

    セキュリティグループ ID です。ステップ 2 で作成したノードプールのセキュリティグループ ID に設定します。

    VSWITCH_ID

    vSwitch ID です。ステップ 2 で作成したノードプールが使用する vSwitch の ID に設定します。

    IMAGEID

    ノードプール内のインスタンスを起動するために使用される VM イメージの ID です。

    • 中国 (北京):この値を m-2zef6zaa0j0qz3sunhjp に変更します。

    • シンガポール:この値を m-t4n9ocuen5sy6rhbxbk1 に変更します。

  3. src/cloud-api-adaptor/install/overlays/alibabacloud/alibabacloud-cred.env ファイルを作成して認証情報を設定します。以下のコードはファイルの内容を示しています:

    <role_arn> を RAM ロールの ARN に、<provider_arn> を RRSA OIDC プロバイダーの ARN に置き換えます。

    ALIBABA_CLOUD_ROLE_ARN=<role_arn>
    ALIBABA_CLOUD_OIDC_PROVIDER_ARN=<provider_arn>
    ALIBABA_CLOUD_OIDC_TOKEN_FILE=/var/run/secrets/ack.alibabacloud.com/rrsa-tokens/token
  4. CAA ワークロードをデプロイします。

    kubectl apply -k src/cloud-api-adaptor/install/overlays/alibabacloud

    3 分待ってから、デプロイの進捗を確認します。

    kubectl -n confidential-containers-system get pod 

    期待される出力:

    NAME                                              READY   STATUS    RESTARTS   AGE
    cc-operator-controller-manager-5d79465b47-d8s2k   1/1     Running   0          2m11s
    cc-operator-daemon-install-trlvt                  1/1     Running   0          108s
    cc-operator-pre-install-daemon-qpvzw              1/1     Running   0          117s
    cloud-api-adaptor-daemonset-46spp                 1/1     Running   0          92s

    出力に cc-operator-*cloud-api-adaptor-daemonset-* が表示され、それらが Running 状態であれば、CAA ワークロードはデプロイされています。

ステップ 4:アプリケーションのデプロイ

以下の操作を実行してアプリケーションをデプロイします。アプリケーションの設定では、runtimeClassName: kata-remote の設定で機密コンテナーランタイムを指定します。Pod がスケジュールされると、Kata Remote は CAA をトリガーして TDX 機密 VM を動的に作成します。

重要

クラスターを削除する前に、CAA によって作成された機密 VM リソースが残らないように、runtimeClassName: kata-remote を持つすべてのワークロードが削除されていることを確認してください。

  1. 以下の YAML テンプレートを使用して、機密コンテナーランタイムを使用する Pod を作成するための pod-caa-demo.yaml ファイルを作成します。

    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 機密 VM が表示されている場合、CAA はアプリケーションの基盤となるコンピューティングリソースを作成しています。

よくある質問

kubectl -n confidential-containers-system get pod を実行した後、cc-operator-controller-manager Pod のみが実行中になるのはなぜですか?

考えられる原因

ワーカーノードに必要なラベルが欠落している可能性があります。これらのラベルがないと、Kubernetes スケジューラは関連する Pod をノードに配置できず、Pod は Pending 状態のままになり、すぐには表示されません。

解決策
  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. スケジューラが Pod を配置するまで 1〜2 分待ってから、再度ステータスを確認します。

    kubectl -n confidential-containers-system get pod

関連ドキュメント

お問い合わせ

ACK に関するご質問やご提案がございましたら、DingTalk グループ 30521601 にご参加の上、お問い合わせください。