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-dns
やfluentbit-gke
などに過大なリソースが割り当てられるため、主目的のリソースが圧迫されています。
たとえば、vCPU1の3ノード構成のキャパシティは2,820m(940m x3)ですが、そのうちkube-dnsだけで520m(260m x2)を占めています。
空きリソースに余裕がない状況で運用すると、コンテナ再作成できずにサービスダウンする展開が起きうるため、ノードのキャパシティを確保しておくことは重要です。
ただしkube-system
はクラスタのベース機能を提供しているため、チューニングには注意が必要です。
実際にPodが利用しているリソースの参考値はkubectl top pod
で簡易的に把握できます。定義と実使用のギャップが大きいコンテナほどチューニングの余地があります。
Chuma Takahiro