Metrics Server は、Kubernetes の組み込み自動スケーリング パイプライン用のコンテナー リソース メトリックのスケーラブルで効率的なソースです。 Azure Kubernetes Service (AKS) では、Metrics Server のポッドの垂直自動スケーリングが有効になります。 Metrics Server は、Horizontal Pod Autoscaler などの他の Kubernetes アドオンで一般的に使われます。
Vertical Pod Autoscaler (VPA) を使うと、Metrics Server で CPU やメモリ リソースの制約が常に発生するときに、リソースの制限を調整できます。
開始する前に
AKS クラスターでは、Kubernetes バージョン 1.24 以降が実行されています。
Metrics Server の調整
Metrics Server の調整レートが高く、その 2 つのポッドのメモリ使用状況が不均衡な場合は、Metrics Server が指定された既定値より多くのリソースを必要としていることを示します。
係数値を更新するには、オーバーレイ kube-system 名前空間で ConfigMap を作成し、Metrics Server の仕様の値をオーバーライドします。 次の手順を実行して、メトリック サーバーを更新します。
metrics-server-config.yaml という ConfigMap ファイルを作成し、次のマニフェストをコピーします。
apiVersion: v1 kind: ConfigMap metadata: name: metrics-server-config namespace: kube-system labels: kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: EnsureExists data: NannyConfiguration: |- apiVersion: nannyconfig/v1alpha1 kind: NannyConfiguration baseCPU: 100m cpuPerNode: 1m baseMemory: 100Mi memoryPerNode: 8Mi
この ConfigMap の例では、リソースの制限と要求が次のように変更されます。
- cpu: (100+1n) ミリコア
- メモリ: (100+8n) メビバイト
ここで、n はノード数です。
kubectl apply コマンドを使って ConfigMap を作成し、YAML マニフェストの名前を指定します。
kubectl apply -f metrics-server-config.yaml
Metrics Server ポッドを再起動します。 Metrics Server ポッドは 2 つあり、次のコマンドはそのすべてを削除します。
kubectl -n kube-system delete po -l k8s-app=metrics-server
更新されたリソースが有効になったことを確認するには、次のコマンドを実行して Metrics Server VPA のログを確認します。
kubectl -n kube-system logs metrics-server-pod-name -c metrics-server-vpa
更新された調整設定が適用されたことを示す結果は、次の出力例のようになります。
ERROR: logging before flag.Parse: I0315 23:12:33.956112 1 pod_nanny.go:68] Invoked by [/pod_nanny --config-dir=/etc/config --cpu=44m --extra-cpu=0.5m --memory=51Mi --extra-memory=4Mi --poll-period=180000 --threshold=5 --deployment=metrics-server --container=metrics-server] ERROR: logging before flag.Parse: I0315 23:12:33.956159 1 pod_nanny.go:69] Version: 1.8.14 ERROR: logging before flag.Parse: I0315 23:12:33.956171 1 pod_nanny.go:85] Watching namespace: kube-system, pod: metrics-server-545d8b77b7-5nqq9, container: metrics-server. ERROR: logging before flag.Parse: I0315 23:12:33.956175 1 pod_nanny.go:86] storage: MISSING, extra_storage: 0Gi ERROR: logging before flag.Parse: I0315 23:12:33.957441 1 pod_nanny.go:116] cpu: 100m, extra_cpu: 1m, memory: 100Mi, extra_memory: 8Mi ERROR: logging before flag.Parse: I0315 23:12:33.957456 1 pod_nanny.go:145] Resources: [{Base:{i:{value:100 scale:-3} d:{Dec:<nil>} s:100m Format:DecimalSI} ExtraPerNode:{i:{value:0 scale:-3} d:{Dec:<nil>} s: Format:DecimalSI} Name:cpu} {Base:{i:{value:104857600 scale:0} d:{Dec:<nil>} s:100Mi Format:BinarySI} ExtraPerNode:{i:{value:0 scale:0} d:{Dec:<nil>} s: Format:BinarySI} Name:memory
ConfigMap は AKS では検証されないので、baseCPU、cpuPerNode、baseMemory、memoryPerNode に注意してください。 推奨される方法として、リソースの不要な消費を避けるために、値を段階的に増やします。 ConfigMap の更新または作成時に、リソースの使用状況を事前に監視してください。 大量のリソース要求があると、ノードに悪影響が及ぶ可能性があります。
Metrics Server リソースの使用量を手動で構成する
Metrics Server VPA は、ノードの数によってリソースの使用量を調整します。 クラスターのスケールアップまたはスケールダウンが頻繁に行われる場合、Metrics Server が頻繁に再起動する可能性があります。 この場合、VPA をバイパスし、そのリソースの使用量を手動で制御できます。 VPA を構成するこの方法は、前のセクションで説明した手順に加えて実行する必要はありません。
Metrics Server の VPA をバイパスし、そのリソースの使用量を手動で制御する場合は、次の手順のようにします。
metrics-server-config.yaml という ConfigMap ファイルを作成し、次のマニフェストをコピーします。
apiVersion: v1 kind: ConfigMap metadata: name: metrics-server-config namespace: kube-system labels: kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: EnsureExists data: NannyConfiguration: |- apiVersion: nannyconfig/v1alpha1 kind: NannyConfiguration baseCPU: 100m cpuPerNode: 0m baseMemory: 100Mi memoryPerNode: 0Mi
この ConfigMap 例では、リソース制限と要求を次のように変更します。
- CPU: 100 ミリコア
- メモリ: 100 メビバイト
ノードの数を変更しても、自動スケーリングはトリガーされません。
kubectl apply コマンドを使って ConfigMap を作成し、YAML マニフェストの名前を指定します。
kubectl apply -f metrics-server-config.yaml
Metrics Server ポッドを再起動します。 Metrics Server ポッドは 2 つあり、次のコマンドはそのすべてを削除します。
kubectl -n kube-system delete po -l k8s-app=metrics-server
更新されたリソースが有効になったことを確認するには、次のコマンドを実行して Metrics Server VPA のログを確認します。
kubectl -n kube-system logs metrics-server-pod-name -c metrics-server-vpa
更新された調整設定が適用されたことを示す結果は、次の出力例のようになります。
ERROR: logging before flag.Parse: I0315 23:12:33.956112 1 pod_nanny.go:68] Invoked by [/pod_nanny --config-dir=/etc/config --cpu=44m --extra-cpu=0.5m --memory=51Mi --extra-memory=4Mi --poll-period=180000 --threshold=5 --deployment=metrics-server --container=metrics-server] ERROR: logging before flag.Parse: I0315 23:12:33.956159 1 pod_nanny.go:69] Version: 1.8.14 ERROR: logging before flag.Parse: I0315 23:12:33.956171 1 pod_nanny.go:85] Watching namespace: kube-system, pod: metrics-server-545d8b77b7-5nqq9, container: metrics-server. ERROR: logging before flag.Parse: I0315 23:12:33.956175 1 pod_nanny.go:86] storage: MISSING, extra_storage: 0Gi ERROR: logging before flag.Parse: I0315 23:12:33.957441 1 pod_nanny.go:116] cpu: 100m, extra_cpu: 0m, memory: 100Mi, extra_memory: 0Mi ERROR: logging before flag.Parse: I0315 23:12:33.957456 1 pod_nanny.go:145] Resources: [{Base:{i:{value:100 scale:-3} d:{Dec:<nil>} s:100m Format:DecimalSI} ExtraPerNode:{i:{value:0 scale:-3} d:{Dec:<nil>} s: Format:DecimalSI} Name:cpu} {Base:{i:{value:104857600 scale:0} d:{Dec:<nil>} s:100Mi Format:BinarySI} ExtraPerNode:{i:{value:0 scale:0} d:{Dec:<nil>} s: Format:BinarySI} Name:memory}]
トラブルシューティング
次の configmap を使う場合、Metrics Server VPA のカスタマイズは適用されません。
baseCPU
にユニットを追加する必要があります。apiVersion: v1 kind: ConfigMap metadata: name: metrics-server-config namespace: kube-system labels: kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: EnsureExists data: NannyConfiguration: |- apiVersion: nannyconfig/v1alpha1 kind: NannyConfiguration baseCPU: 100 cpuPerNode: 1m baseMemory: 100Mi memoryPerNode: 8Mi
更新された調整設定が適用されていないことを示す結果は、次の出力例のようになります。
ERROR: logging before flag.Parse: I0316 23:32:08.383389 1 pod_nanny.go:68] Invoked by [/pod_nanny --config-dir=/etc/config --cpu=44m --extra-cpu=0.5m --memory=51Mi --extra-memory=4Mi --poll-period=180000 --threshold=5 --deployment=metrics-server --container=metrics-server] ERROR: logging before flag.Parse: I0316 23:32:08.383430 1 pod_nanny.go:69] Version: 1.8.14 ERROR: logging before flag.Parse: I0316 23:32:08.383441 1 pod_nanny.go:85] Watching namespace: kube-system, pod: metrics-server-7d78876589-hcrff, container: metrics-server. ERROR: logging before flag.Parse: I0316 23:32:08.383446 1 pod_nanny.go:86] storage: MISSING, extra_storage: 0Gi ERROR: logging before flag.Parse: I0316 23:32:08.384554 1 pod_nanny.go:192] Unable to decode Nanny Configuration from config map, using default parameters ERROR: logging before flag.Parse: I0316 23:32:08.384565 1 pod_nanny.go:116] cpu: 44m, extra_cpu: 0.5m, memory: 51Mi, extra_memory: 4Mi ERROR: logging before flag.Parse: I0316 23:32:08.384589 1 pod_nanny.go:145] Resources: [{Base:{i:{value:44 scale:-3} d:{Dec:<nil>} s:44m Format:DecimalSI} ExtraPerNode:{i:{value:5 scale:-4} d:{Dec:<nil>} s: Format:DecimalSI} Name:cpu} {Base:{i:{value:53477376 scale:0} d:{Dec:<nil>} s:51Mi Format:BinarySI} ExtraPerNode:{i:{value:4194304 scale:0} d:{Dec:<nil>} s:4Mi Format:BinarySI} Name:memory}]
Kubernetes バージョン 1.23 以降のクラスターの場合、Metrics Server には PodDisruptionBudget があります。 これにより、少なくとも 1 つの Metrics Server ポッドが使用できるようになります。
kubectl -n kube-system get po
を実行した後でこのようになる場合は、カスタマイズされたリソースの使用量が少ない可能性があります。 それを解決するには、係数値を大きくします。metrics-server-679b886d4-pxwdf 1/2 CrashLoopBackOff 6 (36s ago) 6m33s metrics-server-679b886d4-svxxx 1/2 CrashLoopBackOff 6 (54s ago) 6m33s metrics-server-7d78876589-hcrff 2/2 Running 0 37m
次のステップ
Metrics Server は、コア メトリック パイプラインのコンポーネントです。 詳しくは、Metrics Server API の設計に関するページをご覧ください。
Azure Kubernetes Service