ノードの自動プロビジョニング (プレビュー)

AKS にワークロードをデプロイする場合は、必要な VM サイズに関するノード プール構成を決定する必要があります。 ワークロードがより複雑になり、実行するためにさまざまな CPU、メモリ、機能を必要とするようになると、多数のリソース要求に対して VM 構成を設計しなければならないというオーバーヘッドが困難になります。

ノード自動プロビジョニング (NAP) (プレビュー) は、保留中のポッド リソース要件に基づいて、これらのワークロードを最も効率的でコスト効率の高い方法で実行するための最適な VM 構成を決定します。

NAP はオープン ソースの Karpenter プロジェクトに基づいており、AKS プロバイダー もオープン ソースです。 NAP では、AKS クラスターに Karpenter が自動的にデプロイおよび構成および管理されます。

重要

AKS のノード自動プロビジョニング (NAP) は現在プレビュー段階です。 ベータ版、プレビュー版、または一般提供としてまだリリースされていない Azure の機能に適用される法律条項については、「Microsoft Azure プレビューの追加使用条件」を参照してください。

開始する前に

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

  1. az extension add コマンドを使用して aks-preview CLI 拡張機能をインストールします。

    az extension add --name aks-preview
    
  2. az extension update コマンドを使用して拡張機能を更新して、最新バージョンが確実にインストールされた状態にします。

    az extension update --name aks-preview
    

NodeAutoProvisioningPreview 機能フラグを登録する

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

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

    状態が [登録済み] と表示されるまでに数分かかります。

  2. az feature show コマンドを使用して、登録の状態を確認します。

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

    az provider register --namespace Microsoft.ContainerService
    

制限事項

  • 許可される唯一のネットワーク構成は Cilium + Overlay + Azure です
  • ノード プールでクラスター オートスケーラーが有効になっているクラスターでは有効にできません

サポートされていない機能:

  • Windows ノード プール
  • ノード kubelet へのカスタム構成の適用
  • IPv6 クラスター
  • サービス プリンシパル

    Note

    システム割り当てまたはユーザー割り当てマネージド ID のどちらかを使用できます。

  • ディスク暗号化セット
  • CustomCATrustCertificates
  • 開始/停止モード
  • HTTP プロキシ
  • OutboundType ミューテーション。 すべての OutboundType がサポートされていますが、作成後に変更することはできません。

ノードの自動プロビジョニングの有効化

ノードの自動プロビジョニングを有効にするには、az aks create コマンドを使用して新しいクラスターを作成し、--node-provisioning-mode を "Auto" に設定します。 また、オーバーレイ ネットワークと cilium ネットワーク ポリシーも使用する必要があります。

az aks create --name karpuktest --resource-group karpuk --node-provisioning-mode Auto --network-plugin azure --network-plugin-mode overlay --network-dataplane cilium

ノード プール

ノードの自動プロビジョニングでは、VM SKU のリストを始点として使用して、保留状態にあるワークロードに最適な VM SKU を決定します。 初期プールで必要な SKU を制御できるため、特定の SKU ファミリ、VM の種類、およびプロビジョナが使用するリソースの最大量を指定できます。

たとえば、予約インスタンスである特定の VM SKU がある場合は、それらの VM のみを開始プールとして使用できます。

クラスター内に複数のノード プール定義を含めることができますが、AKS では、既定のノード プール定義をデプロイし、変更することができます。

apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
  name: default
spec:
  disruption:
    consolidationPolicy: WhenUnderutilized
    expireAfter: Never
  template:
    spec:
      nodeClassRef:
        name: default

      # Requirements that constrain the parameters of provisioned nodes.
      # These requirements are combined with pod.spec.affinity.nodeAffinity rules.
      # Operators { In, NotIn, Exists, DoesNotExist, Gt, and Lt } are supported.
      # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#operators
      requirements:
      - key: kubernetes.io/arch
        operator: In
        values:
        - amd64
      - key: kubernetes.io/os
        operator: In
        values:
        - linux
      - key: karpenter.sh/capacity-type
        operator: In
        values:
        - on-demand
      - key: karpenter.azure.com/sku-family
        operator: In
        values:
        - D

サポートされているノード プロビジョナの要件

既知のラベルを持つ SKU セレクター

セレクター 説明
karpenter.azure.com/sku-family VM SKU ファミリ D、F、L など。
karpenter.azure.com/sku-name 明示的な SKU 名 Standard_A1_v2
karpenter.azure.com/sku-version SKU バージョン ("v" を使用しない場合は 1 を使用できます) 1 , 2
karpenter.sh/capacity-type VM 割り当ての種類 (スポット/オンデマンド) スポットまたはオンデマンド
karpenter.azure.com/sku-cpu VM 内の CPU の数 16
karpenter.azure.com/sku-memory VM 内のメモリ (MiB) 131072
karpenter.azure.com/sku-gpu-name GPU 名 A100
karpenter.azure.com/sku-gpu-manufacturer GPU 製造元 nvidia
karpenter.azure.com/sku-gpu-count VM あたりの GPU 数 2
karpenter.azure.com/sku-networking-accelerated VM に高速ネットワークがあるかどうか [true, false]
karpenter.azure.com/sku-storage-premium-capable VM が Premium IO ストレージをサポートしているかどうか [true, false]
karpenter.azure.com/sku-storage-ephemeralos-maxsize エフェメラル OS ディスクのサイズ制限 (Gb) 92
topology.kubernetes.io/zone 可用性ゾーン [uksouth-1,uksouth-2,uksouth-3]
kubernetes.io/os オペレーティング システム (プレビュー中は Linux のみ) linux
kubernetes.io/arch CPU アーキテクチャ (AMD64 または ARM64) [amd64, arm64]

VM SKU の機能と使用できる値を一覧表示するには、Azure CLI から vm list-skus コマンドを使用します。

az vm list-skus --resource-type virtualMachines --location <location> --query '[].name' --output table

ノード プールの制限

既定では、NAP は、利用可能な Azure クォータ内でワークロードのスケジューリングしようとします。 また、ノード プールで使用されるリソースの上限を指定し、ノード プール仕様内の制限を指定することもできます。

  # Resource limits constrain the total size of the cluster.
  # Limits prevent Karpenter from creating new instances once the limit is exceeded.
  limits:
    cpu: "1000"
    memory: 1000Gi

ノード プールの重み

複数のノード プールが定義されている場合は、ワークロードをスケジューリングする場所の優先順位を設定できます。 ノード プール定義の相対的な重みを定義します。

  # Priority given to the node pool when the scheduler considers which to select. Higher weights indicate higher priority when comparing node pools.
  # Specifying no weight is equivalent to specifying a weight of 0.
  weight: 10

Kubernetes とノード イメージの更新

NAP を使用する AKS では、Kubernetes バージョンのアップグレードと VM OS ディスクの更新が既定で管理されます。

Kubernetes のアップグレード

NAP ノード プールの Kubernetes アップグレードは、コントロール プレーン Kubernetes バージョンに従います。 クラスターのアップグレードを実行すると、NAP ノードも自動的に更新され、同じバージョン管理に従います。

ノード イメージの更新

既定では、NAP ノード プールの仮想マシンは新しいイメージが使用可能になると自動的に更新されます。 特定のノード イメージ バージョンでノード プールをピン留めする場合は、ノード クラスで imageVersion を設定できます。

kubectl edit aksnodeclass default

ノード クラス定義内で、imageVersion を AKS リリース ノートに記載されている公開リリースのいずれかに設定します。 また、AKS リリース トラッカーを参照して、リージョン内のイメージの可用性を確認することもできます

imageVersion は、ノード イメージの日付部分であり、Ubuntu 22.04 のみがサポートされています。たとえば、"AKSUbuntu-2204-202311.07.0" は "202311.07.0" になります

apiVersion: karpenter.azure.com/v1alpha2
kind: AKSNodeClass
metadata:
  annotations:
    kubernetes.io/description: General purpose AKSNodeClass for running Ubuntu2204
      nodes
    meta.helm.sh/release-name: aks-managed-karpenter-overlay
    meta.helm.sh/release-namespace: kube-system
  creationTimestamp: "2023-11-16T23:59:06Z"
  generation: 1
  labels:
    app.kubernetes.io/managed-by: Helm
    helm.toolkit.fluxcd.io/name: karpenter-overlay-main-adapter-helmrelease
    helm.toolkit.fluxcd.io/namespace: 6556abcb92c4ce0001202e78
  name: default
  resourceVersion: "1792"
  uid: 929a5b07-558f-4649-b78b-eb25e9b97076
spec:
  imageFamily: Ubuntu2204
  imageVersion: 202311.07.0
  osDiskSizeGB: 128

imageVersion 仕様を削除すると、ノード プールは最新のノード イメージ バージョンに更新されます。

ノードの中断

ノード上のワークロードがスケールダウンされると、NAP はノード プール仕様の中断ルールを使用して、それらのノードを削除するタイミングと方法を決定し、ワークロードをより効率的に再スケジューリングする可能性があります。

ノードは kubectl delete node を使用して手動で削除することもできますが、NAP はノードを最適化するタイミングを制御することもできます。

  disruption:
    # Describes which types of Nodes NAP should consider for consolidation
    consolidationPolicy: WhenUnderutilized | WhenEmpty
    # 'WhenUnderutilized', NAP will consider all nodes for consolidation and attempt to remove or replace Nodes when it discovers that the Node is underutilized and could be changed to reduce cost

    #  `WhenEmpty`, NAP will only consider nodes for consolidation that contain no workload pods
    
    # The amount of time NAP should wait after discovering a consolidation decision
    # This value can currently only be set when the consolidationPolicy is 'WhenEmpty'
    # You can choose to disable consolidation entirely by setting the string value 'Never'
    consolidateAfter: 30s

選択イベントの監視

ノードの自動プロビジョニングでは、デプロイとスケジューリングの決定を監視するために使用できるクラスター イベントが生成されます。 Kubernetes イベント ストリームを介してイベントを表示できます。

kubectl get events -A --field-selector source=karpenter -w