mcpField
A
aks-automatic-2025

aks-automatic-2025

github.com/josiahsiegelクラウド・DevOps59158 回インストール19 週間前に更新
リポジトリ

aks-automatic-2025 について

Azure Kubernetes Service の利用者向けに、AKS Automatic の知識をまとめたガイドです。クラスターの自動化、スケーリング、セキュリティ、ネットワーク、コスト設定をコマンドやマニフェスト例で説明します。

主な機能

  1. 01コントロールプレーンとノードの管理
  2. 02Karpenter によるノードの動的プロビジョニング
  3. 03HPA、VPA、KEDA によるスケーリング
  4. 04ID とネットワークのセキュリティ設定
  5. 05監視とコスト最適化のガイド

活用シーン

  1. 01AKS Automatic クラスターの作成と設定
  2. 02ワークロードの自動スケーリング設定
  3. 03ノード構成や ID の問題の調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/josiahsiegel/claude-plugin-marketplace --skill aks-automatic-2025

インストール後、Claude Code で/aks-automatic-2025を入力して読み込まれたか確認します。

詳細

AKS Automatic - 2025 年 GA 機能

Azure Kubernetes Service Automatic モード(2025 年 10 月 GA)に関する包括的なナレッジベースです。

概要

AKS Automatic は、インテリジェントな自動化と組み込みのベストプラクティスにより運用負荷を解消する、フルマネージドの Kubernetes サービスです。

主な機能(2025 年 10 月 GA)

1. 運用負荷ゼロ
  • フルマネージドのコントロールプレーンとワーカーノード
  • OS のパッチ適用とセキュリティ更新を自動化
  • 監視と診断機能を内蔵
  • セキュリティとコンプライアンスを統合
2. Karpenter の統合
  • リアルタイムの需要に基づくノードの動的プロビジョニング
  • コスト最適化のためのインテリジェントなビンパッキング
  • ノードの自動統合とプロビジョニング解除
  • 複数のノードプールとインスタンスタイプをサポート
3. オートスケーリング(デフォルトで有効)
  • Horizontal Pod Autoscaler(HPA):CPU/メモリに基づいてポッドをスケーリング
  • Vertical Pod Autoscaler(VPA):ポッドのリソース要求/上限を調整
  • KEDA:外部トリガーによるイベント駆動型オートスケーリング
4. 強化されたセキュリティ
  • 認証に Microsoft Entra ID を統合
  • Kubernetes 認可に Azure RBAC を使用
  • ネットワークポリシーをデフォルトで有効化
  • セキュリティパッチを自動適用
  • ポッドレベルの認証にワークロード ID を使用
5. 高度なネットワーク
  • IP を効率的に使用する Azure CNI Overlay
  • 高パフォーマンスのネットワークを実現する Cilium データプレーン
  • マイクロセグメンテーションのためのネットワークポリシー
  • プライベートクラスターをサポート
6. 新しい課金モデル(2025 年 10 月 19 日適用)
  • ホスト型コントロールプレーン料金:$0.16/クラスター/時間
  • 実際のノード使用量に基づくコンピューティング料金
  • クラスター管理料金は別途不要
  • Karpenter の最適化によるコスト削減
7. ノードのオペレーティングシステム
  • Kubernetes < 1.34 では Ubuntu 22.04
  • Kubernetes >= 1.34 では Ubuntu 24.04
  • ノードイメージチャネルによる OS の自動アップグレード

AKS Automatic クラスターの作成

基本的な作成
az aks create \
  --resource-group MyRG \
  --name MyAKSAutomatic \
  --sku automatic \
  --kubernetes-version 1.34 \
  --location eastus
本番環境向けの構成
az aks create \
  --resource-group MyRG \
  --name MyAKSAutomatic \
  --location eastus \
  --sku automatic \
  --tier standard \
  \
  # Kubernetes version
  --kubernetes-version 1.34 \
  \
  # Karpenter (default in automatic mode)
  --enable-karpenter \
  \
  # Networking
  --network-plugin azure \
  --network-plugin-mode overlay \
  --network-dataplane cilium \
  --service-cidr 10.0.0.0/16 \
  --dns-service-ip 10.0.0.10 \
  --load-balancer-sku standard \
  \
  # Use custom VNet (optional)
  --vnet-subnet-id /subscriptions/<sub-id>/resourceGroups/MyRG/providers/Microsoft.Network/virtualNetworks/MyVNet/subnets/AKSSubnet \
  \
  # Availability zones
  --zones 1 2 3 \
  \
  # Authentication and authorization
  --enable-managed-identity \
  --enable-aad \
  --enable-azure-rbac \
  --aad-admin-group-object-ids <group-object-id> \
  \
  # Auto-upgrade
  --auto-upgrade-channel stable \
  --node-os-upgrade-channel NodeImage \
  \
  # Security
  --enable-defender \
  --enable-workload-identity \
  --enable-oidc-issuer \
  \
  # Monitoring
  --enable-addons monitoring \
  --workspace-resource-id /subscriptions/<sub-id>/resourceGroups/MyRG/providers/Microsoft.OperationalInsights/workspaces/MyWorkspace \
  \
  # Tags
  --tags Environment=Production ManagedBy=AKSAutomatic
Azure Policy アドオンを使用
az aks create \
  --resource-group MyRG \
  --name MyAKSAutomatic \
  --sku automatic \
  --enable-addons azure-policy \
  --kubernetes-version 1.34

Karpenter の構成

AKS Automatic は、インテリジェントなノードのプロビジョニングに Karpenter を使用します。AKSNodeClass と NodePool CRD を使用して、ノードのプロビジョニングをカスタマイズできます。

デフォルトの AKSNodeClass
apiVersion: karpenter.azure.com/v1alpha1
kind: AKSNodeClass
metadata:
  name: default
spec:
  # OS Image - Ubuntu 24.04 for K8s 1.34+
  osImage:
    sku: Ubuntu
    version: "24.04"

  # VM Series
  vmSeries:
    - Standard_D
    - Standard_E

  # Max pods per node
  maxPodsPerNode: 110

  # Security
  securityProfile:
    sshAccess: Disabled
    securityType: Standard
カスタム NodePool
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: general-purpose
spec:
  # Constraints
  template:
    spec:
      requirements:
        - key: kubernetes.io/arch
          operator: In
          values: ["amd64"]
        - key: karpenter.sh/capacity-type
          operator: In
          values: ["on-demand"]
        - key: kubernetes.azure.com/agentpool
          operator: In
          values: ["general"]

      # Node labels
      labels:
        workload-type: general

      # Taints (optional)
      taints:
        - key: "dedicated"
          value: "general"
          effect: "NoSchedule"

      # NodeClass reference
      nodeClassRef:
        group: karpenter.azure.com
        kind: AKSNodeClass
        name: default

  # Limits
  limits:
    cpu: "1000"
    memory: 4000Gi

  # Disruption budget
  disruption:
    consolidationPolicy: WhenEmpty
    consolidateAfter: 30s
    expireAfter: 720h # 30 days
    budgets:
      - nodes: "10%"
        duration: 5m
AI ワークロード向けの GPU NodePool
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: gpu-workloads
spec:
  template:
    spec:
      requirements:
        - key: kubernetes.io/arch
          operator: In
          values: ["amd64"]
        - key: karpenter.sh/capacity-type
          operator: In
          values: ["on-demand"]
        - key: node.kubernetes.io/instance-type
          operator: In
          values: ["Standard_NC6s_v3", "Standard_NC12s_v3", "Standard_NC24s_v3"]

      labels:
        workload-type: gpu
        gpu-type: nvidia-v100

      taints:
        - key: "nvidia.com/gpu"
          value: "true"
          effect: "NoSchedule"

      nodeClassRef:
        group: karpenter.azure.com
        kind: AKSNodeClass
        name: gpu-nodeclass

  limits:
    cpu: "200"
    memory: 800Gi
    nvidia.com/gpu: "16"

  disruption:
    consolidationPolicy: WhenEmpty
    consolidateAfter: 300s

HPA、VPA、KEDA によるオートスケーリング

Horizontal Pod Autoscaler(HPA)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: myapp-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp
  minReplicas: 2
  maxReplicas: 50
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70
    - type: Resource
      resource:
        name: memory
        target:
          type: Utilization
          averageUtilization: 80
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 0
      policies:
        - type: Percent
          value: 100
          periodSeconds: 15
        - type: Pods
          value: 4
          periodSeconds: 15
      selectPolicy: Max
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
        - type: Percent
          value: 50
          periodSeconds: 15
Vertical Pod Autoscaler(VPA)
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: myapp-vpa
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp
  updatePolicy:
    updateMode: "Auto"  # Auto, Recreate, Initial, Off
  resourcePolicy:
    containerPolicies:
      - containerName: "*"
        minAllowed:
          cpu: 100m
          memory: 128Mi
        maxAllowed:
          cpu: 4
          memory: 8Gi
        controlledResources: ["cpu", "memory"]
        controlledValues: RequestsAndLimits
KEDA ScaledObject(イベント駆動型)
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: myapp-queue-scaler
spec:
  scaleTargetRef:
    name: myapp
  minReplicaCount: 0  # Scale to zero
  maxReplicaCount: 100
  pollingInterval: 30
  cooldownPeriod: 300
  triggers:
    # Azure Service Bus Queue
    - type: azure-servicebus
      metadata:
        queueName: myqueue
        namespace: myservicebus
        messageCount: "5"
      authenticationRef:
        name: azure-servicebus-auth

    # Azure Storage Queue
    - type: azure-queue
      metadata:
        queueName: myqueue
        queueLength: "10"
        accountName: mystorageaccount
      authenticationRef:
        name: azure-storage-auth

    # Prometheus metrics
    - type: prometheus
      metadata:
        serverAddress: http://prometheus.monitoring.svc.cluster.local:9090
        metricName: http_requests_per_second
        threshold: "100"
        query: sum(rate(http_requests_total[2m]))

ワークロード ID(AAD Pod Identity に代わる機能)

セットアップ
# Workload identity is enabled by default in AKS Automatic

# Create managed identity
az identity create \
  --name myapp-identity \
  --resource-group MyRG

# Get identity details
export IDENTITY_CLIENT_ID=$(az identity show -g MyRG -n myapp-identity --query clientId -o tsv)
export IDENTITY_OBJECT_ID=$(az identity show -g MyRG -n myapp-identity --query principalId -o tsv)

# Assign role to identity
az role assignment create \
  --assignee $IDENTITY_OBJECT_ID \
  --role "Storage Blob Data Contributor" \
  --scope /subscriptions/<sub-id>/resourceGroups/MyRG/providers/Microsoft.Storage/storageAccounts/mystorage

# Create federated credential
export AKS_OIDC_ISSUER=$(az aks show -g MyRG -n MyAKSAutomatic --query oidcIssuerProfile.issuerUrl -o tsv)

az identity federated-credential create \
  --name myapp-federated-credential \
  --identity-name myapp-identity \
  --resource-group MyRG \
  --issuer $AKS_OIDC_ISSUER \
  --subject system:serviceaccount:default:myapp-sa
Kubernetes リソース
# Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
  name: myapp-sa
  namespace: default
  annotations:
    azure.workload.identity/client-id: "<IDENTITY_CLIENT_ID>"

---
# Deployment using workload identity
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
        azure.workload.identity/use: "true"  # Enable workload identity
    spec:
      serviceAccountName: myapp-sa
      containers:
        - name: myapp
          image: myregistry.azurecr.io/myapp:latest
          env:
            - name: AZURE_CLIENT_ID
              value: "<IDENTITY_CLIENT_ID>"
            - name: AZURE_TENANT_ID
              value: "<TENANT_ID>"
            - name: AZURE_FEDERATED_TOKEN_FILE
              value: /var/run/secrets/azure/tokens/azure-identity-token
          volumeMounts:
            - name: azure-identity-token
              mountPath: /var/run/secrets/azure/tokens
              readOnly: true
      volumes:
        - name: azure-identity-token
          projected:
            sources:
              - serviceAccountToken:
                  path: azure-identity-token
                  expirationSeconds: 3600
                  audience: api://AzureADTokenExchange

監視とオブザーバビリティ

Container Insights を有効化
# Already enabled with --enable-addons monitoring
# Query logs using Azure Monitor

# Get cluster logs
az monitor log-analytics query \
  --workspace <workspace-id> \
  --analytics-query "KubePodInventory | where ClusterName == 'MyAKSAutomatic' | take 10" \
  --output table

# Get Karpenter logs
kubectl logs -n kube-system -l app.kubernetes.io/name=karpenter
Prometheus と Grafana
# Enable managed Prometheus
az aks update \
  --resource-group MyRG \
  --name MyAKSAutomatic \
  --enable-azure-monitor-metrics

# Access Grafana dashboards through Azure Portal

コストの最適化

課金モデル(2025 年 10 月)
  • コントロールプレーン:クラスターあたり $0.16/時間
  • コンピューティング:実際のノード使用量に対して課金
  • Karpenter:ビンパッキングと統合を自動化
  • ゼロへのスケール:KEDA と Karpenter で実現可能
コスト削減のヒント
  1. 重要でないワークロードには Spot インスタンスを使用
- key: karpenter.sh/capacity-type
  operator: In
  values: ["spot"]
  1. 積極的な統合を構成
disruption:
  consolidationPolicy: WhenUnderutilized
  consolidateAfter: 30s
  1. ポッド中断予算を実装
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: myapp-pdb
spec:
  minAvailable: 1
  selector:
    matchLabels:
      app: myapp
  1. 適切なサイズへの調整に VPA を使用
  • VPA は実際の使用量に基づいてリソース要求を自動調整します

Standard AKS から Automatic への移行

AKS Automatic は新しいクラスター モードです。インプレース移行はサポートされていません。以下の手順に従ってください。

  1. 新しい AKS Automatic クラスターを作成
  2. 新しいクラスターにワークロードをインストール
  3. 機能を検証
  4. トラフィックを切り替え(DNS、ロードバランサー)
  5. 古いクラスターを廃止

ベストプラクティス

✓ 新しい本番クラスターには AKS Automatic を使用します ✓ ポッド認証にはワークロード ID を有効にします ✓ 特定のワークロードタイプに合わせてカスタム NodePools を構成します ✓ 包括的なスケーリングを実現するため、HPA、VPA、KEDA を導入します ✓ バッチ処理や耐障害性が求められるワークロードにはスポットインスタンスを使用します ✓ Container Insights と Managed Prometheus を有効にします ✓ 重要なアプリには Pod Disruption Budgets を構成します ✓ マイクロセグメンテーションにはネットワークポリシーを使用します ✓ コンプライアンス対応のため、Azure Policy アドオンを有効にします ✓ Flux または Argo CD を使用して GitOps を導入します

トラブルシューティング

Karpenter のステータスを確認する
kubectl logs -n kube-system -l app.kubernetes.io/name=karpenter --tail=100
kubectl get nodepools
kubectl get nodeclaims
ノードプロビジョニングイベントを表示する
kubectl get events --field-selector involvedObject.kind=NodePool -A
ワークロード ID の問題をデバッグする
# Check service account annotation
kubectl get sa myapp-sa -o yaml

# Check pod labels
kubectl get pod <pod-name> -o yaml | grep azure.workload.identity

# Check federated credential
az identity federated-credential show \
  --identity-name myapp-identity \
  --resource-group MyRG \
  --name myapp-federated-credential

参考資料

AKS Automatic は、Azure でのマネージド Kubernetes の未来を担います。運用負荷をゼロにし、最大限の自動化を実現します!

コメント