チュートリアル 2-4: Azure エンクレーブにAzure Kubernetes Service (AKS)ワークロードをデプロイする

このチュートリアルでは、プライベート Azure Kubernetes Service (AKS) クラスターを Azure エンクレーブにデプロイする方法について説明します。 カスタマー マネージドの暗号化、ネットワーク統合、セキュリティで保護されたアクセス パターンを使用して、完全にプライベートな AKS クラスターを作成します。

このチュートリアルでは、以下の内容を学習します。

  • プライベート AKS に必要なAzure機能を有効にする
  • AKS に必要なリソースを検証する
  • プライベート AKS クラスターをデプロイする
  • カスタマー マネージド キー暗号化を構成する
  • AKS 接続用のコミュニティ エンドポイントを作成する
  • 複数のリソース グループを AKS ワークロードに関連付ける
  • AKS クラスターにアクセスして検証する

前提条件

Important

このチュートリアルは、プライベート AKS クラスター テンプレートの動作に合わせ、チュートリアル 2-2AVE AKS エンクレーブ デプロイによって作成されたリソースを必要とします。

始める前の準備

Azure エンクレーブの AKS について

Azure エンクレーブの AKS では、次の機能が提供されます。

  • 完全プライベート クラスター: プライベート エンドポイント経由でのみアクセス可能な API サーバー
  • ネットワークの分離: すべてのトラフィックがエンクレーブ境界内に留まります
  • カスタマー マネージド暗号化: CMK で暗号化されたコントロール プレーンとデータ プレーンの両方
  • セキュリティで保護されたワークロード境界: エンクレーブ セキュリティ ポリシーに含まれる Kubernetes リソース

リソースの名前付け規則

このチュートリアルでは、名前の例を使用します。 組織の名前付け規則を使用します。

  • エンクレーブ: aks-enclave
  • ワークロード: aks-workload
  • リソース グループ: rg-aks-cluster
  • AKS クラスター: aks-prod-01

必要なAzure機能を有効にする

Azure エンクレーブの AKS では、サブスクリプションで特定のAzure機能を有効にする必要があります。

EncryptionAtHost 機能を有効にする

この機能により、AKS ノードの VM ホスト レベルでの暗号化が有効になります。

# Register the feature
az feature register --namespace Microsoft.Compute --name EncryptionAtHost

# Check registration status (may take 10-15 minutes)
az feature show --namespace Microsoft.Compute --name EncryptionAtHost

# Once registered, refresh the provider
az provider register --namespace Microsoft.Compute

API Server 仮想ネットワーク統合を有効にする (プレビュー)

この機能により、AKS API サーバーを仮想ネットワークに直接統合できます。

# Register the feature
az feature register --namespace Microsoft.ContainerService --name EnableAPIServerVnetIntegrationPreview

# Check registration status
az feature show --namespace Microsoft.ContainerService --name EnableAPIServerVnetIntegrationPreview

# Once registered, refresh the provider
az provider register --namespace Microsoft.ContainerService

Important

続行する前に、両方の機能が "state": "Registered" 表示されるまで待ちます。 通常、登録には 10 ~ 15 分かかります。

SSH キーの準備 (省略可能)

Note

AKS ノード アクセスの SSH キー認証は非推奨になっています。 この手順は現在必須ですが、今後のテンプレート バージョンでは省略可能です。 直接ノード アクセスが必要ない場合は、テンプレートの更新時にこのセクションをスキップできます。

SSH キー ペアを生成する

# Create .ssh directory if it doesn't exist
$sshDir = "$env:USERPROFILE\.ssh"
if (-not (Test-Path $sshDir)) {
    New-Item -ItemType Directory -Path $sshDir
}

# Generate SSH key pair
ssh-keygen -t rsa -b 4096 -f "$sshDir\aks-nodes" -N '""'

# Display the public key
Get-Content "$sshDir\aks-nodes.pub"

SSH キーを Key Vault に格納する

# Read the SSH public key
$sshPublicKey = Get-Content "$env:USERPROFILE\.ssh\aks-nodes.pub" -Raw

# Store in Key Vault as a secret
az keyvault secret set `
    --vault-name "kv-ave-shared-<uniqueid>" `
    --name "aks-ssh-public-key" `
    --value $sshPublicKey

プライベート AKS クラスターをデプロイする

次に、完全な暗号化と監視を使用して AKS クラスターをデプロイします。

サービス カタログ テンプレートを使用する

  1. AKS ワークロードで、[+ Azure サービスの追加] を選択します。
  2. プライベート AKS クラスターを検索して選択します。
  3. デプロイを構成します。

[基本] タブ

  • AKS クラスター名: aks-prod-01
  • Kubernetes バージョン: 最新の安定バージョン ( 1.32 など) を選択する

モニタリング

  • Log Analyticsワークスペース名: エンクレーブまたはコミュニティログの保存先を選択します。

Encryption

  • ディスク暗号化セット名: チュートリアル 2-2 で使用した名前を入力します。
  • 暗号化キー名: キー コンテナーのキー名を入力します。
  • Key Vault: そのキー名のキー コンテナーを選択してください。

アクセス

  • AKS ID 名: チュートリアル 2-2 で使用した名前を入力します。
  • AKS ID リソース グループ名: ID が配置されている場所と一致するようにリソース グループ名を更新します。

ネットワーク

  • AKS サブネット名: AKS サブネット名を入力します
  • エージェント プール サブネット名: エージェント プールのサブネット名を入力します
  • サービス トラフィックの CIDR: 172.16.0.0/16
  • Kubernetes DNS サービスの IP アドレス: 172.16.0.10

サブネットの構成:

  • ノード サブネット: エンクレーブから aksSubnet を選択する
  • API サーバー サブネット: エンクレーブから agentSubnet を選択してください
  • プライベート エンドポイント サブネット: エンクレーブから AzureVirtualEnclaveSubnet を選択する

ノードプール

Nextを選択して、このチュートリアルのこのタブをスキップします。

タグ

  • 環境: Production
  • ワークロード: AKS
  • ManagedBy: Azure Enclave
  1. [確認および作成]を選択します。
  2. すべての設定を慎重に確認します。
  3. を選択してを作成します。

Note

AKS クラスターは、マネージド リソース グループを自動的に作成します。

AKS 接続用のコミュニティ エンドポイントを作成する

AKS では、複数のAzure サービスへの送信接続が必要です。 これらの要件のコミュニティ エンドポイントを作成します。

Note

チュートリアル 2-1 で AKS コミュニティ エンドポイントを作成した場合は、必要なすべての FQDN が含まれているかどうかを確認します。

コミュニティ エンドポイントを構成する

  1. 自分のコミュニティ(例えば cmt-fabrikam)に行ってください。

  2. [コミュニティ エンドポイント] を選択>+ 既存のce-aks-servicesまたは編集します。

  3. 次の規則が存在することを確認します。

    ルール 1: Microsoft Container Registry

    • 名前: mcr
    • 宛て先: mcr.microsoft.com,*.data.mcr.microsoft.com
    • プロトコル: HTTPS
    • ポート: 443

    規則 2: AKS 管理

    • 名前: aks-management
    • 宛て先: *.hcp.<region>.azmk8s.io,<region>.dp.kubernetesconfiguration.azure.com
    • プロトコル: HTTPS
    • ポート: 443

    規則 3: Azure管理

    • 名前: azure-management
    • 宛て先: management.azure.com,login.microsoftonline.com
    • プロトコル: HTTPS
    • ポート: 443

    規則 4: パッケージ リポジトリ

    • 名前: packages
    • 宛て先: packages.microsoft.com,acs-mirror.azureedge.net,azure.archive.ubuntu.com
    • プロトコル: HTTPS
    • ポート: 443

    規則 5: Azure Monitor (有効な場合)

    • 名前: monitoring
    • 宛て先: *.ods.opinsights.azure.com,*.oms.opinsights.azure.com,dc.services.visualstudio.com
    • プロトコル: HTTPS
    • ポート: 443
  4. [ 確認と作成 ] を選択し、[ 作成 ] または [保存] を選択します

NSG 送信規則を構成する

送信セキュリティ規則を NSG に追加して、AKS トラフィックを許可します。

  1. ネットワーク セキュリティ グループに移動します>nsg-aks-nodes
  2. [ 送信セキュリティ規則>+ 追加] を選択します。
  3. HTTPS 送信の規則を追加します。
    • ソース: VirtualNetwork
    • 宛て先: Internet
    • 宛先ポート: 443
    • プロトコル: TCP
    • アクション: Allow
    • 優先度: 1000
    • 名前: Allow_HTTPS_Outbound

AKS リソース グループをワークロードに関連付ける

AKS は、クラスター インフラストラクチャ用のマネージド リソース グループ (MRG) を作成します。 ユーザー リソース グループと MRG の両方をワークロードに関連付けます。

Azure Portal の使用

  1. Azure ポータルで Azure エンクレーブ サービスに移動します。
  2. コミュニティを選択します (例: cmt-fabrikam)。
  3. [エンクレーブ] を選択し、AKS エンクレーブ (ve-aks など) を開きます。
  4. [ワークロード] を選択し、AKS ワークロード (wl-aks など) を開きます。
  5. ワークロードの概要で、[ プロパティ ] または [リンクされたリソース グループ] を選択します。
  6. [ + リソース グループの追加] を選択します。
  7. ユーザー リソース グループを追加します。
    • サブスクリプションを選択: ご利用中のサブスクリプション
    • [リソース グループ] を選択します。rg-aks-cluster
    • 追加を選択する
  8. [+ リソース グループの追加] をもう一度選択します。
  9. AKS マネージド リソース グループを追加します。
    • マネージド RG 名はパターンに従います。 MC_rg-aks-cluster_aks-prod-01_<region>
    • サブスクリプションを選択: ご利用中のサブスクリプション
    • リソース グループの選択: AKS マネージド リソース グループ
    • 追加を選択する
  10. 両方のリソース グループがワークロードのリンクされたリソース グループの一覧に表示されていることを確認します。

Tip

AKS マネージド リソース グループ名を見つけるには、ポータルで AKS クラスターに移動し、[概要] ページの [ノード リソース グループ ] プロパティを確認します。

AKS クラスターにアクセスする

管理者 VM またはエンクレーブ内のAzure Bastionを介してプライベート AKS クラスターにアクセスします。

管理者 VM に接続する

  1. Azure Bastionまたは RDP 経由で管理者 VM に接続します。
  2. 管理者用 VM に Azure CLI がインストールされていることを確認してください。
  3. Azure にサインインします。
az login

AKS 資格情報を取得する

# Get cluster credentials
az aks get-credentials `
    --resource-group rg-aks-cluster `
    --name aks-prod-01 `
    --admin

# Verify connection
kubectl get nodes

予想される出力は、 Ready 状態のノードを示しています。

NAME                                STATUS   ROLES   AGE   VERSION
aks-systempool-12345678-vmss000000  Ready    agent   5m    v1.29.5
aks-systempool-12345678-vmss000001  Ready    agent   5m    v1.29.5
aks-systempool-12345678-vmss000002  Ready    agent   5m    v1.29.5

テスト ワークロードをデプロイする

サンプル アプリケーションをデプロイしてクラスターを検証します。

名前空間を作成する

kubectl create namespace test-app

サンプル アプリケーションをデプロイする

# Save as test-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: test-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: mcr.microsoft.com/oss/nginx/nginx:1.25.3
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: test-app
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
# Apply the deployment
kubectl apply -f test-deployment.yaml

# Check deployment status
kubectl get deployments -n test-app
kubectl get pods -n test-app
kubectl get services -n test-app

デプロイメントを検証する

AKS クラスターの包括的な検証を実行します。

クラスターの正常性を確認する

# Check node status
kubectl get nodes -o wide

# Check system pods
kubectl get pods -n kube-system

# Check node conditions
kubectl describe nodes | grep -A 5 Conditions

暗号化の検証

# Check if encryption at host is enabled
az aks show --resource-group rg-aks-cluster --name aks-prod-01 --query "securityProfile.enableEncryptionAtHost"

# Check disk encryption set
az aks show --resource-group rg-aks-cluster --name aks-prod-01 --query "diskEncryptionSetId"

ネットワークの接続を検証する

# Test DNS resolution
kubectl run -it --rm debug --image=mcr.microsoft.com/dotnet/runtime-deps:6.0 --restart=Never -- nslookup kubernetes.default

# Test internet connectivity through community endpoints
kubectl run -it --rm debug --image=curlimages/curl --restart=Never -- curl -I https://mcr.microsoft.com

# Check service connectivity
kubectl get services -A

監視とログを確認する

# Check if Container Insights is enabled
az aks show --resource-group rg-aks-cluster --name aks-prod-01 --query "addonProfiles.omsagent.enabled"

# Query logs in Log Analytics
az monitor log-analytics query `
    --workspace <workspace-id> `
    --analytics-query "ContainerLog | where TimeGenerated > ago(1h) | limit 10"

Azure Policyコンプライアンスを確認する

# Check Azure Policy add-on status
kubectl get pods -n kube-system | grep azure-policy

# View policy violations (if any)
kubectl get constrainttemplates
kubectl get constraints

他のユーザーの kubectl アクセスを構成する

他のユーザーに AKS クラスターへのアクセス権を付与します。

Azure RBAC の使用

# Assign Azure Kubernetes Service Cluster User Role
az role assignment create `
    --assignee user@contoso.com `
    --role "Azure Kubernetes Service Cluster User Role" `
    --scope "/subscriptions/<subscription-id>/resourceGroups/rg-aks-cluster/providers/Microsoft.ContainerService/managedClusters/aks-prod-01"

# For admin access
az role assignment create `
    --assignee user@contoso.com `
    --role "Azure Kubernetes Service Cluster Admin Role" `
    --scope "/subscriptions/<subscription-id>/resourceGroups/rg-aks-cluster/providers/Microsoft.ContainerService/managedClusters/aks-prod-01"

Kubernetes RBAC の使用

# Create role binding for namespace access
kubectl create rolebinding user-viewer `
    --clusterrole=view `
    --user=user@contoso.com `
    --namespace=test-app

一般的な問題のトラブルシューティング

クラスターの作成が失敗する

現象: AKS クラスターのデプロイが失敗する

解決策:

  • 機能フラグが登録されていることを確認する: EncryptionAtHostEnableAPIServerVnetIntegrationPreview
  • ノード数とポッド密度に適したサブネット サイズを確認する
  • ディスク暗号化セットとマネージド ID に適切なアクセス許可があることを確認する
  • アクティビティ ログで特定のエラー メッセージを確認する

ノード未準備

現象: ノードに NotReady 状態が表示される

解決策:

  • ノード サブネットが必要なエンドポイントへの送信接続を持っているかどうかを確認する
  • コミュニティ エンドポイントに必要なすべての AKS FQDN が含まれているかどうかを確認する
  • NSG ルールでポート 443 の送信トラフィックを許可することを確認する
  • ノード ログを確認します。 kubectl describe node <node-name>

ポッドがイメージをプルできない

症状: ポッドがImagePullBackOffで停止している

解決策:

  • コミュニティエンドポイントに mcr.microsoft.com*.data.mcr.microsoft.com が含まれていることを確認
  • NSG が送信 HTTPS を許可することを確認する (ポート 443)
  • DNS 解決が機能することを確認する: ポッドからの nslookup mcr.microsoft.com
  • プライベート レジストリを使用している場合は、イメージ プルのシークレットを確認する

API サーバーに接続できない

現象: kubectl コマンドが接続タイムアウトで失敗する

解決策:

  • エンクレーブ接続を使用して管理者 VM またはリソースを使用していることを確認する
  • プライベート DNS ゾーンが仮想ネットワークにリンクされていることを確認する
  • API サーバーのサブネット構成を確認する
  • DNS 解決をテストします: nslookup <cluster-fqdn>

監視が機能しない

症状: Azure Monitorにログまたはメトリックがありません

解決策:

  • Container Insights アドオンが有効になっていることを確認する
  • コミュニティ エンドポイントに FQDN の監視が含まれているかどうかを確認する
  • クラスターから Log Analytics ワークスペースにアクセスできることを確認する
  • omsagent ポッドが実行中であることを確認します: kubectl get pods -n kube-system | grep omsagent

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

継続的な料金を回避するには、不要になったらリソースを削除します。

AKS クラスターを削除する

# Delete AKS cluster (also deletes managed resource group)
az aks delete --resource-group rg-aks-cluster --name aks-prod-01 --yes --no-wait

# Delete user resource group
az group delete --name rg-aks-cluster --yes --no-wait

# Delete infrastructure resource group
az group delete --name rg-aks-infrastructure --yes --no-wait

Warning

AKS クラスターを削除すると、すべてのワークロードとデータが完全に削除されます。 必要に応じて、バックアップがあることを確認します。

次のステップ

Azure Enclave で Azure Virtual Desktop と AKS のワークロードをデプロイするためのチュートリアル シリーズを完了しました。