次の方法で共有


Azure Kubernetes Service (AKS) で Metrics Server VPA を構成する

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 の仕様の値をオーバーライドします。 次の手順を実行して、メトリック サーバーを更新します。

  1. 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 はノード数です。

  2. kubectl apply コマンドを使って ConfigMap を作成し、YAML マニフェストの名前を指定します。

    kubectl apply -f metrics-server-config.yaml
    
  3. Metrics Server ポッドを再起動します。 Metrics Server ポッドは 2 つあり、次のコマンドはそのすべてを削除します。

    kubectl -n kube-system delete po -l k8s-app=metrics-server
    
  4. 更新されたリソースが有効になったことを確認するには、次のコマンドを実行して 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 では検証されないので、baseCPUcpuPerNodebaseMemorymemoryPerNode に注意してください。 推奨される方法として、リソースの不要な消費を避けるために、値を段階的に増やします。 ConfigMap の更新または作成時に、リソースの使用状況を事前に監視してください。 大量のリソース要求があると、ノードに悪影響が及ぶ可能性があります。

Metrics Server リソースの使用量を手動で構成する

Metrics Server VPA は、ノードの数によってリソースの使用量を調整します。 クラスターのスケールアップまたはスケールダウンが頻繁に行われる場合、Metrics Server が頻繁に再起動する可能性があります。 この場合、VPA をバイパスし、そのリソースの使用量を手動で制御できます。 VPA を構成するこの方法は、前のセクションで説明した手順に加えて実行する必要はありません。

Metrics Server の VPA をバイパスし、そのリソースの使用量を手動で制御する場合は、次の手順のようにします。

  1. 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 メビバイト

    ノードの数を変更しても、自動スケーリングはトリガーされません。

  2. kubectl apply コマンドを使って ConfigMap を作成し、YAML マニフェストの名前を指定します。

    kubectl apply -f metrics-server-config.yaml
    
  3. Metrics Server ポッドを再起動します。 Metrics Server ポッドは 2 つあり、次のコマンドはそのすべてを削除します。

    kubectl -n kube-system delete po -l k8s-app=metrics-server
    
  4. 更新されたリソースが有効になったことを確認するには、次のコマンドを実行して 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}]
    

トラブルシューティング

  1. 次の 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}]
    
  2. 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 の設計に関するページをご覧ください。