GKEの垂直Pod自動スケーリング

Google Kubernetes Engineが提供する 垂直Pod自動スケーリング(Vertical Pod Autoscaling)は、Podのコンテナリソース(CPU/RAM)を自動調整する機能です。
ノード数を自動調整する水平スケーリングとは別で、併用も可能です。

垂直Pod自動スケーリングは以下の条件で動作します。

  • クラウドコンソールなどで、機能を有効にしておく
  • VerticalPodAutoscalerリソースを作成しておく

VerticalPodAutoscaler リソース

VerticalPodAutoscalerリソースは、挙動を設定するものです。以下のようなマニフェストを作成し、kubectl applyするとその後は自動で動作します。

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  namespace: kube-system
  name: kubesystem-fluentbit-vpa
  spec:
    targetRef:
      apiVersion: "apps/v1"
      kind: DaemonSet
      name: fluentbit-gke
    updatePolicy:
      updateMode: "Auto"
    resourcePolicy:
      containerPolicies:
      - containerName: "*"
        mode: "Auto"
        minAllowed:
          cpu: 20m
          memory: 40Mi
        maxAllowed:
          memory: 150Mi

targetRefのAPIはラベルセレクタのような柔軟性はなく、Controllerの種類と名前の組み合わせによる指定のみに対応しています。

VerticalPodAutoscalerのうちresourcePolicyは定義しなくても動作します。
resourcePolicyはリソース自動管理をガイドする設定で、指定しない場合は完全に自動で動作します。

kubectl applyしたのち、kubectl describe vpa <resource_name>で動作を確認しておきます。
適切に動作している場合には、リソースの推奨値が表示されます。何か不備があればエラーログが表示されるため、修正する必要があります。

vpaはリソースの推奨値が定まったタイミングでコンテナを再起動し、新たなリソース定義を適用します。
kubectl describe pod <target_pod_name>を実行すると実際のリソース割り当てを確認できます。

VPAの使いどころ

垂直Pod自動スケーリングはどのコンテナも管理できるため、自動でリソース調整したい任意のコンテナに利用できます。

VPAならではの使いどころとしてkube-systemネームスペースのリソース定義変更があります。
kube-systemのコンテナは既定値で動作するため、基本的にリソース割り当てを変更する手段がありませんが、VPAなら調整できます。

とくにサイズの小さいクラスタでは、kube-dnsfluentbit-gkeなどに過大なリソースが割り当てられるため、主目的のリソースが圧迫されています。
たとえば、vCPU1の3ノード構成のキャパシティは2,820m(940m x3)ですが、そのうちkube-dnsだけで520m(260m x2)を占めています。

空きリソースに余裕がない状況で運用すると、コンテナ再作成できずにサービスダウンする展開が起きうるため、ノードのキャパシティを確保しておくことは重要です。 ただしkube-systemはクラスタのベース機能を提供しているため、チューニングには注意が必要です。

実際にPodが利用しているリソースの参考値はkubectl top podで簡易的に把握できます。定義と実使用のギャップが大きいコンテナほどチューニングの余地があります。

中馬崇尋
Chuma Takahiro