クイックスタート: Azure CLI を使用して、コンフィデンシャル コンピューティング Intel SGX エージェント ノードを含む AKS クラスターをデプロイする

このクイックスタートでは、Azure CLI を使用して、エンクレーブ対応 (DCsv2/DCSv3) VM ノードを含む Azure Kubernetes Service (AKS) クラスターをデプロイします。 その後、シンプルな Hello World アプリケーションをエンクレーブで実行します。 クラスターのプロビジョニングとコンフィデンシャル コンピューティング ノードの追加は Azure portal から行うこともできますが、このクイックスタートでは、Azure CLI に焦点を絞って説明します。

AKS は、開発者またはクラスター オペレーターが迅速にクラスターをデプロイして管理できるようにするマネージド Kubernetes サービスです。 詳細については、AKS の概要に関するページと AKS のコンフィデンシャル ノードの概要に関するページを参照してください。

コンフィデンシャル コンピューティング ノードの特徴は次のとおりです。

注意

DCsv2/DCsv3 VM には、利用可能なリージョンが限られた特殊なハードウェアが使用されます。 詳細については、利用可能な SKU とサポートされるリージョンに関するページを参照してください。

前提条件

このクイック スタートでは以下が必要です。

  • 自分のサブスクリプションで最低 8 つの DCsv2、DCSv3、DCdsv3 コアが利用できること。

    既定では、Azure サブスクリプションの Intel SGX VM サイズに対して事前に割り当てられたクォータはありません。 サブスクリプションの VM コア クォータを要求するには、次の手順に従う必要があります。

エンクレーブ対応のコンフィデンシャル コンピューティング ノードと Intel SGX アドオンを使用して AKS クラスターを作成する

Intel SGX アドオンが有効になっている AKS クラスターを作成し、そのクラスターにノード プールを追加し、Hello World エンクレーブ アプリケーションを使用して作成した内容を確認するには、次の手順に従います。

システム ノード プールと AKS Intel SGX アドオンを使用して AKS クラスターを作成する

注意

前述の前提条件を満たす AKS クラスターが既にある場合は、次のセクションに進み、コンフィデンシャル コンピューティング ノード プールを追加してください。

Intel SGX AKS アドオン "confcom" では、Intel SGX デバイス ドライバーがご使用のコンテナーに公開されて、ポッド yaml に変更が追加されるのを防ぎます。

まず、az group create コマンドを使用して、このクラスター用のリソース グループを作成します。 次の例では、myResourceGroup という名前のリソース グループを eastus2 リージョンに作成します。

az group create --name myResourceGroup --location eastus2

次に、az aks create コマンドを使用して、コンフィデンシャル コンピューティング アドオンが有効になっている AKS クラスターを作成します。

az aks create -g myResourceGroup --name myAKSCluster --generate-ssh-keys --enable-addons confcom

上記のコマンドを実行すると、コンフィデンシャル コンピューティングノード以外のシステム ノード プールを持つ新しい AKS クラスターがデプロイされます。 システム ノード プールには、コンフィデンシャル コンピューティング Intel SGX ノードをお勧めしません。

コンフィデンシャル コンピューティング機能を備えたユーザー ノード プールを AKS クラスターに追加する

次のコマンドを実行して、3 つのノードを含む Standard_DC4s_v3 サイズのユーザー ノード プールを AKS クラスターに追加します。 サポートされている DCsv2/DCsv3 SKU とリージョンの一覧から、大きいサイズの別の SKU を選択できます。

az aks nodepool add --cluster-name myAKSCluster --name confcompool1 --resource-group myResourceGroup --node-vm-size Standard_DC4s_v3 --node-count 2

このコマンドを実行すると、DCsv3 の新しいノード プールが、コンフィデンシャル コンピューティング アドオン デーモンセット (SGX デバイス プラグイン) と共に表示されます。

ノード プールとアドオンを確認する

az aks get-credentials コマンドを使用して、AKS クラスターの資格情報を取得します。

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster

ノードが正しく作成され、SGX 関連のデーモンセットが DCsv2 ノード プールで実行されていることを確認するには、kubectl get pods コマンドを使用します。

kubectl get pods --all-namespaces
kube-system     sgx-device-plugin-xxxx     1/1     Running

出力内容が上記のコードと一致する場合は、AKS クラスターで機密性の高いアプリケーションを実行する準備ができています。

このクイックスタートの「分離されたエンクレーブ アプリケーションから Hello World をデプロイする」セクションに進んで、エンクレーブでアプリをテストすることができます。 または、次の手順に従って AKS にさらにノード プールを追加します (AKS は、SGX ノードプールと非 SGX ノードプールの混在をサポートしています。)

コンフィデンシャル コンピューティング ノード プールを既存の AKS クラスターに追加する

このセクションでは、このクイックスタートで前述した前提条件を満たす AKS クラスターが既に実行されていることを前提としています。

既存のクラスターでコンフィデンシャル コンピューティング AKS アドオンを有効にする

次のコマンドを実行して、コンフィデンシャル コンピューティング アドオンを有効にします。

az aks enable-addons --addons confcom --name MyManagedCluster --resource-group MyResourceGroup

DCsv3 ユーザー ノード プールをクラスターに追加する

注意

コンフィデンシャル コンピューティング機能を使用するには、既存の AKS クラスターに、DCsv2/DCsv3 VM SKU に基づくノード プールが少なくとも 1 つ必要です。 コンフィデンシャル コンピューティングに使用される DCs-v2/Dcs-v3 VM SKU の詳細については、利用可能な SKU とサポートされるリージョンに関するページを参照してください。

次のコマンドを実行して、ノード プールを作成します。

az aks nodepool add --cluster-name myAKSCluster --name confcompool1 --resource-group myResourceGroup --node-count 2 --node-vm-size Standard_DC4s_v3

confcompool1 という名前の新しいノード プールが作成されたことを確認します。

az aks nodepool list --cluster-name myAKSCluster --resource-group myResourceGroup

デーモンセットがコンフィデンシャル ノード プールで実行されていることを確認する

既存の AKS クラスターにサインインして、次の確認を実行します。

kubectl get nodes

出力内容に、AKS クラスターに新しく追加された confcompool1 プールが表示されます。 他のデーモンセットも表示される場合があります。

kubectl get pods --all-namespaces
kube-system     sgx-device-plugin-xxxx     1/1     Running

出力内容が上記のコードと一致する場合は、AKS クラスターで機密性の高いアプリケーションを実行する準備ができています。

分離されたエンクレーブ アプリケーションから Hello World をデプロイする

これで、テスト アプリケーションをデプロイする準備ができました。

hello-world-enclave.yaml という名前のファイルを作成し、次の YAML マニフェストを貼り付けます。 このサンプル アプリケーション コードは、Open Enclave プロジェクトにあります。 このデプロイでは、confcom アドオンがデプロイ済みであることを前提としています。

Note

次の例では、パブリック コンテナー イメージを Docker Hub からプルします。 匿名の pull request を行うのではなく、Docker Hub アカウントを使用して認証するようにプル シークレットを設定することをお勧めします。 パブリック コンテンツを操作するときの信頼性を向上させるために、プライベートの Azure Container Registry にイメージをインポートして管理します。 パブリック イメージの操作に関する詳細を参照してください

apiVersion: batch/v1
kind: Job
metadata:
  name: oe-helloworld
  namespace: default
spec:
  template:
    metadata:
      labels:
        app: oe-helloworld
    spec:
      containers:
      - name: oe-helloworld
        image: mcr.microsoft.com/acc/samples/oe-helloworld:latest
        resources:
          limits:
            sgx.intel.com/epc: "10Mi"
          requests:
            sgx.intel.com/epc: "10Mi"
        volumeMounts:
        - name: var-run-aesmd
          mountPath: /var/run/aesmd
      restartPolicy: "Never"
      volumes:
      - name: var-run-aesmd
        hostPath:
          path: /var/run/aesmd
  backoffLimit: 0

または、次に示すように、コンテナーのデプロイに対してノード プール選択デプロイを実行することもできます。

apiVersion: batch/v1
kind: Job
metadata:
  name: oe-helloworld
  namespace: default
spec:
  template:
    metadata:
      labels:
        app: oe-helloworld
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: agentpool
                operator: In
                values:
                - acc # this is the name of your confidential computing nodel pool
                - acc_second # this is the name of your confidential computing nodel pool
      containers:
      - name: oe-helloworld
        image: mcr.microsoft.com/acc/samples/oe-helloworld:latest
        resources:
          limits:
            sgx.intel.com/epc: "10Mi"
          requests:
            sgx.intel.com/epc: "10Mi"
        volumeMounts:
        - name: var-run-aesmd
          mountPath: /var/run/aesmd
      restartPolicy: "Never"
      volumes:
      - name: var-run-aesmd
        hostPath:
          path: /var/run/aesmd
  backoffLimit: 0

ここで、kubectl apply コマンドを使用して、セキュア エンクレーブで開くサンプル ジョブを作成します (次の出力例を参照)。

kubectl apply -f hello-world-enclave.yaml
job "oe-helloworld" created

次のコマンドを実行すると、このワークロードによって高信頼実行環境 (エンクレーブ) が正常に作成されたことを確認できます。

kubectl get jobs -l app=oe-helloworld
NAME       COMPLETIONS   DURATION   AGE
oe-helloworld   1/1           1s         23s
kubectl get pods -l app=oe-helloworld
NAME             READY   STATUS      RESTARTS   AGE
oe-helloworld-rchvg   0/1     Completed   0          25s
kubectl logs -l app=oe-helloworld
Hello world from the enclave
Enclave called into host to print: Hello World!

リソースをクリーンアップする

このクイックスタートで作成したコンフィデンシャル コンピューティング ノード プールを削除するには、次のコマンドを使用します。

az aks nodepool delete --cluster-name myAKSCluster --name confcompool1 --resource-group myResourceGroup

AKS クラスターを削除するには、次のコマンドを使用します。

az aks delete --resource-group myResourceGroup --cluster-name myAKSCluster

次の手順