高度な Container Networking Services を使用して Cilium mTLS 暗号化をデプロイする (プレビュー)

Important

Advanced Cluster Networking Services での Cilium mTLS 暗号化は現在プレビュー段階です。 ベータ版、プレビュー版、または他の方法で一般公開されていない Azure の機能に適用される法的条件については、Microsoft Azure プレビューの追加利用規約を参照してください。

この記事では、Azure Kubernetes Service (AKS) クラスターで Advanced Container Networking Services を使用して Cilium mTLS 暗号化をデプロイする方法について説明します。

前提条件

  • アクティブなサブスクリプションを持つ Azure アカウント。 アカウントをお持ちでない場合は、開始する前に 無料アカウント を作成してください。
  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Get started with Azure Cloud Shell」を参照してください。

  • CLI 参照コマンドをローカルで実行する場合は、Azure CLI を インストール します。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。

    • ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、「Azure CLI を使用して Azure に認証する」を参照してください。

    • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、「Azure CLI で拡張機能を使用および管理する」を参照してください。

    • az version を実行して、インストールされているバージョンと依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

  • この記事の手順に必要な Azure CLI の最小バージョンは 2.71.0 です。 バージョンを見つけるには、 az --versionを実行します。 インストールまたはアップグレードが必要な場合は、Azure CLI のインストールを参照してください。

  • Cilium mTLS 暗号化は、Cilium を搭載した Azure CNI でのみサポートされます。 他のネットワーク プラグインを使用している場合、Cilium mTLS 暗号化はサポートされていません。 Cilium を使用した Azure CNI の構成に関するページを参照してください。

  • AKS クラスターで Kubernetes バージョン 1.34.0 以降が実行されていることを確認します。

  • クラスターで Cilium バージョン 1.18 以降が使用されていることを確認します。

aks-preview Azure CLI 拡張機能をインストールする

Important

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

az extension addまたは az extension update コマンドを使用して、Azure CLI プレビュー拡張機能をインストールまたは更新します。

aks-preview Azure CLI 拡張機能の最小バージョンは 14.0.0b6

# Install the aks-preview extension
az extension add --name aks-preview
# Update the extension to make sure you have the latest version installed
az extension update --name aks-preview

AdvancedNetworkingmTLSPreview フィーチャーフラグを登録する

AdvancedNetworkingmTLSPreview コマンドを使用して、az feature register 機能フラグを登録します。

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

az feature show コマンドを使用して、登録が成功したことを確認します。 登録が完了するまで数分かかります。

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

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

高度なコンテナー ネットワーク サービスと mTLS 暗号化を有効にする

これ以降の作業では、アドバンスト コンテナー ネットワークサービスが有効になっている AKS クラスターが必要となります。

az aks create コマンドにアドバンスト コンテナー ネットワークサービスのフラグ --enable-acns を指定すると、アドバンスト コンテナー ネットワークサービスのすべての機能を備えた新しい AKS クラスターが作成されます。 これらの機能には以下が含まれます。

  • コンテナー ネットワークの監視: トラフィックに関する分析情報を提供します。 詳細については、 Container Network Observability に関するページを参照してください。

  • Container Network Security: 完全修飾ドメイン名 (FQDN) フィルター処理、L7 ポリシー、転送中暗号化などのセキュリティ機能を提供します。 詳細については、 Container Network Security に関するページを参照してください。

Cilium データ プレーンを持つクラスターでは、Kubernetes バージョン 1.29 以降の Container Network Observability と Container Network Security がサポートされます。

ACNS を有効にした後でも、Cilium mTLS 暗号化は既定で無効になります。 mTLS を有効にするには、フラグ --acns-transit-encryption-type mTLSを使用して暗号化の種類を設定します。

# Set environment variables for the AKS cluster name and resource group. Make sure to replace the placeholders with your own values.
export CLUSTER_NAME="<aks-cluster-name>"
export RESOURCE_GROUP="<resourcegroup-name>"

# Create an AKS cluster
az aks create \
    --name $CLUSTER_NAME \
    --resource-group $RESOURCE_GROUP \
    --location eastus \
    --network-plugin azure \
    --network-plugin-mode overlay \
    --network-dataplane cilium \
    --enable-acns \
    --acns-transit-encryption-type mTLS \
    --generate-ssh-keys

既存のクラスターで高度なコンテナー ネットワーク サービスと mTLS 暗号化を有効にする

advanced Container Networking Services フラグを使用した az aks update コマンド --enable-acnsコンテナー ネットワーク監視機能コンテナー ネットワーク セキュリティ 機能を含むすべての Advanced Container Networking Services 機能を使用して、既存の AKS クラスターを更新します。

Important

既存のクラスターで mTLS 暗号化を有効にすると、すべてのノードで Cilium エージェントのロールアウト再起動がトリガーされます。 大規模なクラスターの場合、このプロセスには時間がかかる場合があり、ワークロードに一時的に影響を与える可能性があります。 中断を最小限に抑えるために、メンテナンス期間中またはトラフィックの少ない期間中に更新プログラムを計画します。

az aks update \
    --resource-group $RESOURCE_GROUP \
    --name $CLUSTER_NAME \
    --enable-acns \
    --acns-transit-encryption-type mTLS

クラスターの資格情報を取得する

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

az aks get-credentials --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP

名前空間を登録する

mTLS にアプリケーションを登録するには、アプリケーション ポッドを含む名前空間に mTLS ラベルを適用します。

kubectl label namespace <namespace-name> io.cilium/mtls-enabled=true

登録済みワークロードと登録されていないワークロード間のトラフィックは、接続の問題やハード エラーを引き起こすことなくプレーンテキストで続行されます。

mTLS が有効になっていることを確認する

Cilium mTLS の名前空間を登録した後、次の方法を使用して認証と暗号化がアクティブであることを確認できます。

  1. ztunnel が有効になっていることを確認します。

    kubectl -n kube-system describe cm cilium-config | grep enable-ztunnel -A2
    

    ztunnel 暗号化が有効になっていることを示す出力が表示されます。

  2. 登録されている名前空間を確認します。

    kubectl get namespaces -l io.cilium/mtls-enabled=true
    

    これにより、ztunnel 登録のラベルが付いたすべての名前空間が表示されます。

    これらの名前空間が実際に StateDB テーブルに登録されていることを確認するには、

    kubectl exec -n kube-system ds/cilium -- cilium-dbg statedb dump | jq '.["mtls-enrolled-namespaces"]'
    

    このクエリの結果には、登録リコンサイルサーによって正常に処理された名前空間が表示されます。

  3. ポッドが SPIRE に登録されていることを確認する

    SPIRE サーバー コンテナーに Exec し、エントリを一覧表示します。

    kubectl exec -n kube-system spire-server-0 -c spire-server -- \
    /opt/spire/bin/spire-server entry show
    

    このコマンドは、SPIRE Server データストアに対してクエリを実行し、登録されているすべてのワークロード ID を出力します。

    SPIFFE 形式に一致するエントリを探します。

    spiffe://<trust-domain>/ns/<namespace>/sa/<serviceaccount>
    
  4. ztunnel でのポッド登録の確認

    Ztunnel は、登録されたワークロードを含め、アクティブな構成を検査できるローカル管理者エンドポイントを公開します。

    ztunnel ポッドを選択します。

    kubectl get pods -n kube-system \
    -l app.kubernetes.io/name=ztunnel-cilium \
    -o wide
    

    ztunnel 管理者エンドポイントをポートフォワードします。 ztunnel は、ポート 15000 で管理 API を公開します (既定では localhost のみ)。

    kubectl port-forward -n kube-system <ZTUNNEL_POD> 15000:15000
    

    ztunnel 構成ダンプを検査します。

    curl -s http://localhost:15000/config_dump | jq
    

    ポッドが登録されていることを確認します。 構成ダンプで、ワークロードの SPIFFE ID または名前空間/サービス アカウントを検索します。 次のようなエントリが表示されます。

"workloads": [
    {
    "capacity": 1,
    "clusterId": "Kubernetes",
    "name": "test-server-5dc49df4cf-grr2f",
    "namespace": "ztunnel-test-enrolled",
    "networkMode": "Standard",
    "node": "10.224.0.5",
    "protocol": "HBONE",
    "serviceAccount": "default",
    "status": "Healthy",
    "trustDomain": "cluster.local",
    "uid": "30f37433-a83f-4e30-9946-f62cf5d10924",
    "workloadIps": [
        "192.168.0.50"
    ],
    "workloadType": "deployment"
    }
]

既存のクラスターで mTLS を無効にする

無効にする前に、mTLS から名前空間の登録を解除することをお勧めします。

kubectl label namespace <namespace-name> io.cilium/mtls-enabled-

mTLS 暗号化は、他の ACNS 機能に影響を与えることなく、個別に無効にすることができます。 無効にするには、フラグ --acns-transit-encryption-typenone に設定します。

az aks update \
    --resource-group $RESOURCE_GROUP \
    --name $CLUSTER_NAME \
    --enable-acns \
    --acns-transit-encryption-type none