この記事では、Azure Kubernetes Service (AKS) でのコスト最適化アドオンのスケーリングの概要について説明します。 コスト最適化アドオンのスケーリングでは、既定の構成をオーバーライドするか、自動スケールを有効にすることで、カスタム CPU とメモリを必要とするアドオンを管理できます。 この機能により、リソースがアドオン ポッドに過度に割り当てられないようにし、コスト削減とクラスターの効率が向上します。
概要
コスト最適化アドオンのスケーリングを有効にすると 、Vertical Pod Autoscaler (VPA) アドオンがインストールされ、サポートされているアドオンが使用状況に基づいて自動スケーリングできるようになります。
この機能を使用すると、デプロイとデーモンセットでのリソースの既定の CPU/メモリ要求と制限、許可される最大および最小の CPU/メモリ、VPA カスタム リソース内の VPA 更新モードをカスタマイズすることもできます。 詳細については、「 AKS アドオンのリソース構成をカスタマイズする」を参照してください。
サポートされている AKS アドオン
次の AKS マネージド アドオンは、コスト最適化アドオンのスケーリング機能をサポートしています。
| アドオン | 有効化ビヘイビアー | VPA カスタム リソース名 | VPA カスタム リソースを確認するコマンド |
|---|---|---|---|
| CoreDNS | 新しい AKS クラスターで既定で有効になっています。 | coredns |
kubectl get vpa coredns --namespace kube-system |
| ワークロードアイデンティティ | 手動で有効化する必要があるオプションのアドオン。 | azure-wi-webhook-controller-manager |
kubectl get vpa azure-wi-webhook-controller-manager --namespace kube-system |
| イメージの整合性 | 手動で有効化する必要があるオプションのアドオン。 | ratify |
kubectl get vpa ratify --namespace gatekeeper-system |
| ネットワーク可観測性 (網膜) | 手動で有効化する必要があるオプションのアドオン。 |
retina-agent と retina-operator |
kubectl get vpa retina-agent --namespace kube-system と kubectl get vpa retina-operator --namespace kube-system |
コスト最適化アドオンスケーリングでサポートされる VPA モード
VPA では現在、コスト最適化アドオンのスケーリングに対して次のモードがサポートされています。
- オフ: VPA はリソースの推奨事項データを提供しますが、ターゲット ポッドには適用しません。
- 初期 (既定のモード): VPA は、再起動時にターゲット ポッドに CPU とメモリの推奨事項を自動的に適用しますが、再起動自体は開始しません。
- 自動: VPA は、推奨事項に基づいてポッドの CPU 要求とメモリ要求を自動的に更新します。
注
コスト最適化アドオンのスケーリングを有効にする場合は、次の情報を考慮してください。
- Deployment、DaemonSet、または VPA カスタム リソースを削除すると、変更は AKS アドオンの初期構成に戻ります。
- コスト最適化アドオンのスケーリング機能により、 VPA アドオンは 、サポートされている AKS アドオンを自動スケールできます。 セルフホステッド VPA では機能しません。
- コスト最適化アドオンのスケーリングを有効にすると、AKS によってアドオン ポッドが再起動されます。 現在、CoreDNS は、再起動中の中断の可能性を回避するための唯一の例外です。 詳細については、「 CoreDNS の自動スケール動作」を参照してください。
Warnung
コスト最適化アドオンのスケーリングを有効にする場合は、アドオンのシステム ノード プールに十分なコンピューティング リソースがあることを確認します。 AKS では、コンピューティング リソースの適切なサイズ設定を自動的に行うために、 クラスター オートスケーラー または ノードの自動プロビジョニング をオンにすることをお勧めします。 コスト最適化アドオン スケーリング機能を使用する場合は、保留中のアドオン ポッドを監視します。 VPA では、使用可能なノード容量を超えるリソース要求が推奨される場合があります。その場合、ポッドがスケジュールできない可能性があります。 サポートされているアドオンの要求と制限の 最小値/最大値をカスタマイズ することで、この動作を制御できます。
[前提条件]
- Kubernetes バージョン 1.25 以降を実行している AKS クラスター。
- Azure CLI バージョン 2.60.0 以降がインストールおよび構成されています。 バージョンを確認するには、
az --versionを実行します。 インストールまたはアップグレードが必要な場合は、Azure CLI のインストールを参照してください。 -
aks-previewして、コスト最適化アドオンのスケーリングプレビュー機能を登録します。
Von Bedeutung
AKS のプレビュー機能は、セルフサービスのオプトイン単位で利用できます。 プレビューは、"現状有姿のまま" および "利用可能な限度" で提供され、サービス レベル アグリーメントおよび限定保証から除外されるものとします。 AKS プレビューは、ベストエフォート ベースでカスタマー サポートによって部分的にカバーされます。 そのため、これらの機能は、運用環境での使用を意図していません。 詳細については、次のサポート記事を参照してください。
aks-preview Azure CLI 拡張機能をインストールする
aks-previewコマンドを使用してaz extension add拡張機能をインストールします。az extension add --name aks-previewaz extension updateコマンドを使って拡張機能の最新バージョンに更新します。az extension update --name aks-preview
コスト最適化アドオンのスケーリング プレビュー機能を登録する
az feature registerコマンドを使用して、コスト最適化アドオン スケーリング プレビュー機能を登録します。az feature register --namespace "Microsoft.ContainerService" --name "AKS-AddonAutoscalingPreview"状態が [登録済み] と表示されるまでに数分かかります。
az feature showコマンドを使用して、登録の状態を確認します。az feature show --namespace "Microsoft.ContainerService" --name "AKS-AddonAutoscalingPreview"状態が [登録済み] と表示されたら、
az provider registerコマンドを使用して Microsoft.ContainerService プロバイダーの登録を更新します。az provider register --namespace Microsoft.ContainerService
AKS クラスターでコスト最適化アドオンのスケーリングを有効にする
アドオンを有効にすると、AKS クラスターによって VPA アドオンが自動的にインストールされます。 コスト最適化アドオンのスケーリング機能をサポートする AKS アドオンの有効化動作は異なります。
注
Bicep、ARM テンプレート、または Terraform を使用している場合は、 VerticalPodAutoscaler を "True" に設定し、 AddonAutoscaling を "enabled" に設定します。
新しいクラスターでコスト最適化アドオンのスケーリングを有効にする
az aks createフラグを指定して--enable-optimized-addon-scalingコマンドを使用して、新しい AKS クラスターでコスト最適化アドオンのスケーリングを有効にします。az aks create --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME --enable-optimized-addon-scaling
既存のクラスターでコスト最適化アドオンのスケーリングを有効にする
az aks updateフラグを指定して--enable-optimized-addon-scalingコマンドを使用して、既存の AKS クラスターでコスト最適化アドオンのスケーリングを有効にします。az aks update --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME --enable-optimized-addon-scaling
AKS クラスターでコスト最適化アドオンのスケーリングを無効にする
az aks updateフラグを指定して--disable-optimized-addon-scalingコマンドを使用して、AKS クラスターでのコスト最適化アドオンのスケーリングを無効にします。az aks update --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME --disable-optimized-addon-scaling
注
コスト最適化アドオンのスケーリング機能を無効にしても、VPA アドオンは既定では無効になりません。 VPA を無効にするには、 AKS クラスターでの VPA の無効化を参照してください。
既定のリソース構成をカスタマイズする
クラスターでコスト最適化アドオンスケーリング機能を有効にすると、アドオン リソースの既定の CPU/メモリ設定と、サポートされている AKS アドオンの既定の VPA 構成をカスタマイズできます。 詳細については、「 AKS アドオンのリソース構成をカスタマイズする」を参照してください。
VPA 推奨値を手動で適用する
注
初期モードでは、VPA は、ポッドが作成または更新された場合にのみ、推奨される CPU 要求とメモリ要求を適用します。 推奨事項をすぐに有効にする場合は、ポッドを手動で更新してください。 推奨値を手動で適用する前に、 VPA カスタム リソースで VPA 更新モードが 初期 または 自動 に設定されていることを確認します。
ポッドの状態と CPU/メモリ使用率を確認して、ポッドが想定どおりに実行されていることを確認します。
次の例では、
kubectl get podコマンドを使用して CoreDNS ポッドの状態を確認します。kubectl get pod <coredns-pod-name> --namespace kube-system -o yaml次の出力は、CoreDNS ポッドの状態の例を示しています。
apiVersion: v1 kind: Pod metadata: name: <coredns-pod-name> namespace: kube-system spec: ... containers: - name: coredns resources: limits: cpu: "3" memory: "500Mi" requests: cpu: "100m" memory: "70Mi"kubectl get vpaコマンドを使用して、VPA 推奨値を取得します。kubectl get vpa coredns --namespace kube-system次の出力は、CoreDNS ポッドの VPA 推奨値の例を示しています。
NAME MODE CPU MEM PROVIDED AGE coredns Initial 11m 23574998 True 44mVPA で推奨される値を使用する場合は、
kubectl delete podコマンドを使用してポッドを手動で削除し、VPA 推奨値でポッドを再起動します。kubectl delete pod <coredns-pod-name> --namespace kube-systemポッドが再起動したら、
kubectl get podコマンドを使用してポッドの状態と CPU/メモリの更新を確認します。kubectl get pod <coredns-pod-name> --namespace kube-system -o yaml次の出力は、VPA の推奨値を適用した後の CoreDNS ポッドの状態の例を示しています。
apiVersion: v1 kind: Pod metadata: name: <coredns-pod-name> namespace: kube-system spec: ... containers: - name: coredns resources: limits: cpu: "330m" memory: "168392842" requests: cpu: "11m" memory: "23574998"
トラブルシューティング
クラスターでコスト最適化アドオンのスケーリング機能を有効にすると、アドオン リソースの既定の CPU とメモリの設定をカスタマイズしたり、サポートされている AKS マネージド アドオンの既定の VPA 構成を変更したりできます。
自動スケールが有効なアドオン ポッドが保留中の状態にある場合、または自動スケールが有効なアドオンに対する VPA の推奨事項が表示されない場合は、次の手順に従って問題のトラブルシューティングを行います。
AKS マネージドの VPA アドオンの状態を確認する
kubectl get podsコマンドを使用して、すべての VPA システム コンポーネントが実行されているかどうかを確認します。kubectl get pods --namespace kube-system | grep vpa出力には、次の例のように、
kube-system名前空間で実行されている 3 つのポッド (vpa-admission-controller、vpa-recommender、vpa-updater) が表示されます。vpa-admission-controller 2/2 2 2 4m11s vpa-recommender 1/1 1 1 4m11s vpa-updater 1/1 1 1 4m11s3 つの VPA ポッドごとに、
kubectl logsコマンドを使用してログでエラーがないか確認します。<pod-name>は必ず VPA ポッドの名前に置き換えてください。kubectl logs <pod-name> --namespace kube-system | grep -e '^E[0-9]\{4\}'kubectl getコマンドを使用して、カスタム リソース定義 (CRD) が作成されたことを確認します。kubectl get customresourcedefinition | grep verticalpodautoscalers
ポッドの状態と CPU またはメモリの使用率を確認する
kubectl get podコマンドを使用してポッドの状態を確認します。kubectl get pod <pod-name> --namespace=kube-systemポッドの状態が
Pendingの場合は、ポッドの状態プロパティを確認して、ポッドが実行されていない理由を確認します。kubectl describe pod <pod-name> --namespace kube-system -o yaml次の出力は、状態が
Pendingのポッドの状態の例を示しています。apiVersion: v1 kind: Pod ... status: conditions: - lastProbeTime: null lastTransitionTime: "2023-05-03T17:05:26Z" message: '0/1 nodes are available: 1 Insufficient cpu, 1 Insufficient memory. preemption: 0/1 nodes are available: 1 Insufficient cpu, 1 Insufficient memory..' reason: Unschedulable status: "False" type: PodScheduled phase: Pending qosClass: GuaranteedCPU またはメモリが不足しているためにポッドが
Pendingされていることが出力に示されている場合は、次のアクションを検討してください。- さらにノードを追加し、リソース使用率が低いノードでポッドをスケジュールできるようにします。
- 更新モードを Off に変更してターゲット アドオン ポッドの VPA を無効にし、ノードで使用可能なリソース値に 要求/制限を手動で更新 します。 リソース制限を非常に低い値に設定する場合は注意してください。これにより、ノードで使用できるリソースを超えるリソースを使用しようとすると、ポッドで OOMキルや CPUスロットリングが発生する可能性があるためです。
次のステップ
- クラスターを自動的にスケーリングするように、クラスターの 自動スケーラー または ノードの自動プロビジョニング を構成します。
Azure Kubernetes Service