ノードの自動プロビジョニング (プレビュー)
AKS にワークロードをデプロイする場合は、必要な VM サイズに関するノード プール構成を決定する必要があります。 ワークロードがより複雑になり、実行するためにさまざまな CPU、メモリ、機能を必要とするようになると、多数のリソース要求に対して VM 構成を設計しなければならないというオーバーヘッドが困難になります。
ノード自動プロビジョニング (NAP) (プレビュー) は、保留中のポッド リソース要件に基づいて、これらのワークロードを最も効率的でコスト効率の高い方法で実行するための最適な VM 構成を決定します。
NAP はオープン ソースの Karpenter プロジェクトに基づいており、AKS プロバイダー もオープン ソースです。 NAP では、AKS クラスターに Karpenter が自動的にデプロイおよび構成および管理されます。
重要
AKS のノード自動プロビジョニング (NAP) は現在プレビュー段階です。 ベータ版、プレビュー版、または一般提供としてまだリリースされていない Azure の機能に適用される法律条項については、「Microsoft Azure プレビューの追加使用条件」を参照してください。
開始する前に
- Azure サブスクリプションが必要です。 Azure サブスクリプションをお持ちでない場合は、無料のアカウントを作成できます。
- Azure CLI をインストールする必要があります。
aks-preview
Azure CLI 拡張機能をインストールします。 最小バージョン 0.5.170。- NodeAutoProvisioningPreviewfeature フラグを登録します。
aks-preview
CLI 拡張機能をインストールする
az extension add
コマンドを使用してaks-preview
CLI 拡張機能をインストールします。az extension add --name aks-preview
az extension update
コマンドを使用して拡張機能を更新して、最新バージョンが確実にインストールされた状態にします。az extension update --name aks-preview
NodeAutoProvisioningPreview
機能フラグを登録する
az feature register
コマンドを使用して、NodeAutoProvisioningPreview
機能フラグを登録します。az feature register --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
状態が [登録済み] と表示されるまでに数分かかります。
az feature show
コマンドを使用して、登録の状態を確認します。az feature show --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
状態が Registered と表示されたら、
az provider register
コマンドを使用して Microsoft.ContainerService リソース プロバイダーの登録を最新の情報に更新します。az provider register --namespace Microsoft.ContainerService
制限事項
- 許可される唯一のネットワーク構成は、Powered by Cilium を使用した Azure CNI オーバーレイです。
- ノード プールでクラスター オートスケーラーが有効になっているクラスターでは有効にできません
サポートされていない機能
- Windows ノード プール
- ノード kubelet へのカスタム構成の適用
- IPv6 クラスター
- サービス プリンシパル
Note
システム割り当てまたはユーザー割り当てマネージド ID のどちらかを使用できます。
- ディスク暗号化セット
- CustomCATrustCertificates
- 開始/停止モード
- HTTP プロキシ
- OutboundType ミューテーション。 すべての OutboundType がサポートされていますが、作成後に変更することはできません。
ノードの自動プロビジョニングの有効化
新しいクラスターでノードの自動プロビジョニングを有効にする
az aks create
コマンドを使用して新しいクラスターでノードの自動プロビジョニングを有効にし、--node-provisioning-mode
をAuto
に設定します。 また、--network-plugin
をazure
に、--network-plugin-mode
をoverlay
に、--network-dataplane
をcilium
に設定する必要があります。az aks create \ --name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --node-provisioning-mode Auto \ --network-plugin azure \ --network-plugin-mode overlay \ --network-dataplane cilium \ --generate-ssh-keys
既存のクラスターでノードの自動プロビジョニングを有効にする
az aks update
コマンドを使用して既存のクラスターでノードの自動プロビジョニングを有効にし、--node-provisioning-mode
をAuto
に設定します。 また、--network-plugin
をazure
に、--network-plugin-mode
をoverlay
に、--network-dataplane
をcilium
に設定する必要があります。az aks update --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP_NAME --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
Azure Kubernetes Service