このチュートリアルでは、プライベート Azure Kubernetes Service (AKS) クラスターを Azure エンクレーブにデプロイする方法について説明します。 カスタマー マネージドの暗号化、ネットワーク統合、セキュリティで保護されたアクセス パターンを使用して、完全にプライベートな AKS クラスターを作成します。
このチュートリアルでは、以下の内容を学習します。
- プライベート AKS に必要なAzure機能を有効にする
- AKS に必要なリソースを検証する
- プライベート AKS クラスターをデプロイする
- カスタマー マネージド キー暗号化を構成する
- AKS 接続用のコミュニティ エンドポイントを作成する
- 複数のリソース グループを AKS ワークロードに関連付ける
- AKS クラスターにアクセスして検証する
前提条件
- チュートリアル 2-3: Azure Virtual Desktop ワークロードのデプロイの完了
- ノード、API サーバー、プライベート エンドポイント サブネットを含む AKS エンクレーブ
- チュートリアル 2-2: Azure Enclave 環境の作成の一般的な依存関係 (Key Vault、マネージド ID、ディスク暗号化セット)
- AKS 用プライベート DNS ゾーンがデプロイされました
- AKS ワークロード リソース グループの共同作成者ロール
- サブスクリプションのAzure Kubernetes Service 共同作成者ロール
- 高度な操作用にインストールされたAzure CLIまたはAzure PowerShell
Important
このチュートリアルは、プライベート AKS クラスター テンプレートの動作に合わせ、チュートリアル 2-2 の AVE 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 クラスターをデプロイします。
サービス カタログ テンプレートを使用する
- AKS ワークロードで、[+ Azure サービスの追加] を選択します。
- プライベート AKS クラスターを検索して選択します。
- デプロイを構成します。
[基本] タブ
-
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
- [確認および作成]を選択します。
- すべての設定を慎重に確認します。
- を選択してを作成します。
Note
AKS クラスターは、マネージド リソース グループを自動的に作成します。
AKS 接続用のコミュニティ エンドポイントを作成する
AKS では、複数のAzure サービスへの送信接続が必要です。 これらの要件のコミュニティ エンドポイントを作成します。
Note
チュートリアル 2-1 で AKS コミュニティ エンドポイントを作成した場合は、必要なすべての FQDN が含まれているかどうかを確認します。
コミュニティ エンドポイントを構成する
自分のコミュニティ(例えば
cmt-fabrikam)に行ってください。[コミュニティ エンドポイント] を選択>+ 既存の
ce-aks-servicesまたは編集します。次の規則が存在することを確認します。
ルール 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
-
名前:
[ 確認と作成 ] を選択し、[ 作成 ] または [保存] を選択します。
NSG 送信規則を構成する
送信セキュリティ規則を NSG に追加して、AKS トラフィックを許可します。
-
ネットワーク セキュリティ グループに移動します>
nsg-aks-nodes。 - [ 送信セキュリティ規則>+ 追加] を選択します。
- HTTPS 送信の規則を追加します。
-
ソース:
VirtualNetwork -
宛て先:
Internet -
宛先ポート:
443 -
プロトコル:
TCP -
アクション:
Allow -
優先度:
1000 -
名前:
Allow_HTTPS_Outbound
-
ソース:
AKS リソース グループをワークロードに関連付ける
AKS は、クラスター インフラストラクチャ用のマネージド リソース グループ (MRG) を作成します。 ユーザー リソース グループと MRG の両方をワークロードに関連付けます。
Azure Portal の使用
- Azure ポータルで Azure エンクレーブ サービスに移動します。
-
コミュニティを選択します (例:
cmt-fabrikam)。 -
[エンクレーブ] を選択し、AKS エンクレーブ (
ve-aksなど) を開きます。 -
[ワークロード] を選択し、AKS ワークロード (
wl-aksなど) を開きます。 - ワークロードの概要で、[ プロパティ ] または [リンクされたリソース グループ] を選択します。
- [ + リソース グループの追加] を選択します。
- ユーザー リソース グループを追加します。
- サブスクリプションを選択: ご利用中のサブスクリプション
-
[リソース グループ] を選択します。
rg-aks-cluster - 追加を選択する
- [+ リソース グループの追加] をもう一度選択します。
- AKS マネージド リソース グループを追加します。
- マネージド RG 名はパターンに従います。
MC_rg-aks-cluster_aks-prod-01_<region> - サブスクリプションを選択: ご利用中のサブスクリプション
- リソース グループの選択: AKS マネージド リソース グループ
- 追加を選択する
- マネージド RG 名はパターンに従います。
- 両方のリソース グループがワークロードのリンクされたリソース グループの一覧に表示されていることを確認します。
Tip
AKS マネージド リソース グループ名を見つけるには、ポータルで AKS クラスターに移動し、[概要] ページの [ノード リソース グループ ] プロパティを確認します。
AKS クラスターにアクセスする
管理者 VM またはエンクレーブ内のAzure Bastionを介してプライベート AKS クラスターにアクセスします。
管理者 VM に接続する
- Azure Bastionまたは RDP 経由で管理者 VM に接続します。
- 管理者用 VM に Azure CLI がインストールされていることを確認してください。
- 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 クラスターのデプロイが失敗する
解決策:
- 機能フラグが登録されていることを確認する:
EncryptionAtHost、EnableAPIServerVnetIntegrationPreview - ノード数とポッド密度に適したサブネット サイズを確認する
- ディスク暗号化セットとマネージド 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 のワークロードをデプロイするためのチュートリアル シリーズを完了しました。
推奨される次の手順
- AKS の自動スケールを構成する
- Helm を使用してアプリケーションをデプロイする
- Flux を使用して GitOps を実装する
- イングレス コントローラーの構成
- ワークロード ID を有効にする