Azure Kubernetes Service (AKS) でのポッド サンドボックス (プレビュー)

信頼されていないか、悪意がある可能性のあるコードからコンテナー ワークロードをセキュリティで保護するために、AKS にはポッド サンドボックス (プレビュー) というメカニズムが含まれるようになりました。 ポッドサンドボックスは、コンテナー アプリケーションと、コンテナー ホストの共有カーネルおよびコンピューティング リソースとの間の分離境界を提供します。 たとえば、CPU、メモリ、ネットワークなどです。 ポッドサンドボックスは、他のセキュリティ対策またはデータ保護制御を補完して、アーキテクチャ全体の機密情報をセキュリティで保護するための規制、業界、またはガバナンスのコンプライアンス要件を満たすのに役立ちます。

この記事は、この新機能とその実装方法を理解するのに役立ちます。

前提条件

  • Azure CLI、バージョン 2.44.1 以降。 az --version を実行してバージョンを見つけ、az upgrade を実行してバージョンをアップグレードします。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。

  • aks-preview Azure CLI 拡張機能バージョン 0.5.123 以降。

  • Azure サブスクリプションに KataVMIsolationPreview 機能を登録すること。

  • AKS は、すべての AKS ネットワーク プラグインでバージョン 1.24.0 以降のポッド サンドボックス (プレビュー) をサポートします。

  • Kubernetes クラスターを管理するには、Kubernetes のコマンドライン クライアントである kubectl を使用します。 Azure Cloud Shell には kubectl が付属しています。 az aks install-cli コマンドを使用して kubectl をローカルにインストールできます。

aksプレビューの Azure CLI 拡張機能をインストールする

重要

AKS のプレビュー機能は、セルフサービスのオプトイン単位で利用できます。 プレビューは、"現状有姿のまま" および "利用可能な限度" で提供され、サービス レベル アグリーメントおよび限定保証から除外されるものとします。 AKS プレビューは、ベストエフォート ベースでカスタマー サポートによって部分的にカバーされます。 そのため、これらの機能は、運用環境での使用を意図していません。 詳細については、次のサポート記事を参照してください。

aksプレビュー拡張機能をインストールして、次のコマンドを実行します:

az extension add --name aks-preview

次のコマンドを実行して、リリースされた最新バージョンの拡張機能に更新します:

az extension update --name aks-preview

KataVMIsolationPreview 機能フラグを登録する

KataVMIsolationPreview 機能フラグは、次の例のとおり、KataVMIsolationPreview コマンドを使用して登録します。

az feature register --namespace "Microsoft.ContainerService" --name "KataVMIsolationPreview"

状態が [登録済み] と表示されるまでに数分かかります。 登録の状態は、az feature show コマンドで確認します。

az feature show --namespace "Microsoft.ContainerService" --name "KataVMIsolationPreview"

状態が Registered として表示されたら、az provider register コマンドを使用して Microsoft.ContainerService リソース プロバイダーの登録を最新の情報に更新します。

az provider register --namespace "Microsoft.ContainerService"

制限事項

ポッド サンドボックス (プレビュー) のこのプレビューでの制約を次に示します。

しくみ

AKS でこの機能を実現するために、AKS スタック用の Azure Linux コンテナー ホストで実行される Kata Containers は、ハードウェアによって強制される分離を提供します。 ポッド サンドボックスは、各 Kata ポッドに別個のカーネルなどの、ハードウェア分離の利点を拡張します。 ハードウェア分離では、ポッドごとにリソースが割り当てられ、同じホストで実行されている他の Kata Containers や名前空間コンテナーとリソースを共有しません。

このソリューション アーキテクチャは、次のコンポーネントに基づいています。

Kata Containers を使用したポッド サンドボックスのデプロイは、コンテナーをデプロイする標準的なコンテナー ワークフローと同様です。 デプロイには、ポッド テンプレートで定義できる kata-runtime オプションが含まれています。

ポッドでこの機能を使用するための唯一の違いは、runtimeClassName "kata-mshv-vm-isolation" をポッド スペックに追加することです。

ポッドが "kata-mshv-vm-isolation" runtimeClass を使用すると、コンテナーをホストするポッド サンドボックスとして機能する VM が作成されます。 コンテナー リソース マニフェスト (containers[].resources.limits) で CPU とメモリの制限が指定されていない場合、VM の既定のメモリは 2 GB で、既定の CPU は 1 つのコアです。 コンテナー リソース マニフェストで CPU またはメモリの制限を指定すると、VM には "1 + x 個の CPU" を使用するための 1 引数を持つ containers[].resources.limits.cpu と、"2 GB + y のメモリー" を指定するための 2 引数を持つ containers[].resources.limits.memory が設定されます。 コンテナーで使用できる CPU とメモリは、コンテナーの制限までです。 containers[].resources.requests は、CPU とメモリのオーバーヘッドを削減するための取り組み中であるため、このプレビューの間は無視されます。

新しいクラスターをデプロイする

次の手順を実行して、Azure CLI を使用して AKS Linux AKS クラスターをデプロイします。

  1. az aks create コマンドを使用し、次のパラメーターを指定して、AKS クラスターを作成します。

    • --workload-runtime: "KataMshvVmIsolation" を指定して、ノード プールでポッドサンドボックス機能を有効にします。 このパラメーターにより、次の他のパラメーターが次の要件を満たすようになります。 ない場合、コマンドは失敗し、対応するパラメーターに関する問題を報告します。
    • --os-sku: AzureLinux。 このプレビュー リリースでは、Azure Linux OS SKU のみがこの機能をサポートします。
    • --node-vm-size: 第 2 世代 VM であり、入れ子になった仮想化をサポートする任意の Azure VM サイズが機能します。 たとえば、Dsv3 VM です。

    次の例では、myResourceGroup 内の 1 つのノードで myAKSCluster という名前のクラスターを作成します。

    az aks create --name myAKSCluster --resource-group myResourceGroup --os-sku AzureLinux --workload-runtime KataMshvVmIsolation --node-vm-size Standard_D4s_v3 --node-count 1
    
  2. 次のコマンドを実行して、Kubernetes クラスターのアクセス資格情報を取得します。 az aks バージョン変更資格情報 コマンドを使用してクラスター名とリソース グループ名の既定値を置き換えます。

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  3. kubectl get pods コマンドを使用して、すべての名前空間内のすべてのポッドを一覧表示します。

    kubectl get pods --all-namespaces
    

既存のクラスターにデプロイする

既存の AKS クラスターでこの機能を使用するには、次の要件を満たす必要があります。

次のコマンドを使用して、ポッド サンドボックス (プレビュー) をホストするノード プールを作成することで、それを有効にします。

  1. az aks nodepool add コマンドを使用して、AKS クラスターにノード プールを追加します。 次のパラメーターを指定します。

    • --resource-group: AKS クラスターを作成する既存のリソース グループの名前を入力します。
    • クラスター名: AKS クラスターの一意の名前 ("myAKSCluster" など) を入力します。
    • --name: "nodepool2" などのクラスター ノード プールの一意の名前を入力します。
    • --workload-runtime: "KataMshvVmIsolation" を指定して、ノード プールでポッドサンドボックス機能を有効にします。 --workload-runtime パラメーターにより、次の他のパラメーターが次の要件を満たすようになります。 ない場合、コマンドは失敗し、対応するパラメーターに関する問題を報告します。
      • --os-sku: AzureLinux。 プレビュー リリースでは、Azure Linux OS SKU のみがこの機能をサポートします。
      • --node-vm-size: 第 2 世代 VM であり、入れ子になった仮想化をサポートする任意の Azure VM サイズが機能します。 たとえば、Dsv3 VM です。

    次の例では、"myResourceGroup" の "nodepool2" に 1 つのノードを持つノード プールを "myAKSCluster" に追加します。

    az aks nodepool add --cluster-name myAKSCluster --resource-group myResourceGroup --name nodepool2 --os-sku AzureLinux --workload-runtime KataMshvVmIsolation --node-vm-size Standard_D4s_v3
    
  2. az aks update コマンドを実行して、クラスターでポッドサンドボックス (プレビュー) を有効にします。

    az aks update --name myAKSCluster --resource-group myResourceGroup
    

信頼されたアプリケーションをデプロイする

AKS クラスター内の共有カーネルに信頼されたアプリケーションをデプロイする方法を示すには、次の手順を実行します。

  1. 信頼されたポッドを記述する "trusted-app.yaml" という名前のファイルを作成して、次のマニフェストを貼り付けます。

    kind: Pod
    apiVersion: v1
    metadata:
      name: trusted
    spec:
      containers:
      - name: trusted
        image: mcr.microsoft.com/aks/fundamental/base-ubuntu:v0.0.11
        command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
    
  2. kubectl apply コマンドを実行して Kubernetes ポッドをデプロイし、"trusted-app.yaml" ファイルを指定します。

    kubectl apply -f trusted-app.yaml
    

    コマンドの出力は、次の例のようになります。

    pod/trusted created
    

信頼されていないアプリケーションをデプロイする

AKS クラスター上のポッド サンドボックスに信頼されないアプリケーションをデプロイする方法を示すには、次の手順を実行します。

  1. 信頼されていないポッドを記述する "untrusted-app.yaml" という名前のファイルを作成して、次のマニフェストを貼り付けます。

    kind: Pod
    apiVersion: v1
    metadata:
      name: untrusted
    spec:
      runtimeClassName: kata-mshv-vm-isolation
      containers:
      - name: untrusted
        image: mcr.microsoft.com/aks/fundamental/base-ubuntu:v0.0.11
        command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
    

    runtimeClassNameSpec の値は kata-mhsv-vm-isolation です。

  2. kubectl apply コマンドを実行して Kubernetes ポッドをデプロイし、"untrusted-app.yaml" ファイルを指定します。

    kubectl apply -f untrusted-app.yaml
    

    コマンドの出力は、次の例のようになります。

    pod/untrusted created
    

カーネル分離の構成を確認する

  1. AKS クラスター内のコンテナーにアクセスするために、kubectl exec コマンドを実行してシェル セッションを開始します。 この例では、"信頼されていない" ポッド内のコンテナーにアクセスしています。

    kubectl exec -it untrusted -- /bin/bash
    

    Kubectl がクラスターに接続し、"信頼されていない" ポッド内の最初のコンテナー内で /bin/sh を実行し、ターミナルの入力と出力のストリームをコンテナーのプロセスに転送します。 "信頼された" ポッドをホストしているコンテナーへのシェル セッションを開始することもできます。

  2. "信頼されていない" ポッドのコンテナーへのシェル セッションを開始した後、コマンドを実行して、"信頼されていない" コンテナーがポッド サンドボックスで実行されていることを確認できます。 サンドボックスの外部にある "信頼された" コンテナーとは異なるカーネル バージョンを持っていることがわかります。

    カーネルのバージョンを確認するには、次のコマンドを実行します。

    uname -r
    

    ポッド サンドボックスのカーネルからの出力は次の例のようになります。

    root@untrusted:/# uname -r
    5.15.48.1-8.cm2
    
  3. "信頼された" ポッドのコンテナーへのシェル セッションを開始して、カーネル出力を確認します。

    kubectl exec -it trusted -- /bin/bash
    

    カーネルのバージョンを確認するには、次のコマンドを実行します。

    uname -r
    

    "信頼された" ポッドを実行している VM からの出力は、次の例のようになります。これは、ポッド サンドボックス内で実行されている "信頼されていない" ポッドとは異なるカーネルです。

    5.15.80.mshv2-hvl1.m2
    

クリーンアップ

この機能の評価が完了したら、Azure の料金を回避するために、不要なリソースをクリーンアップします。 評価またはテストの一部として新しいクラスターをデプロイした場合は、az aks delete コマンドを使用してクラスターを削除できます。

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

既存のクラスターでポッド サンドボックス (プレビュー) を有効にした場合は、kubectl delete pod コマンドを使用してポッドを削除できます。

kubectl delete pod pod-name

次のステップ

ハードウェアの分離と Azure プラットフォームのメンテナンス イベントの制御を使用するための、AKS クラスターを持つノード用の Azure 専用ホストの詳細について確認します。