Kubernetesのシステムリソース調整

kubernetesの機能は、kube-systemネームスペース内のコンテナとして稼動しています。通常、kube-systemのシステムpodは直接操作することはなく、自動運用です。

kube-systemのリソースを調整したい場合、 Vertical Pod Autoscaler機能(VPA)を利用する手があります。

VPAも自動運用ではありますが、稼動状況をフィードバックしてリソース要求を調整します。クラスタ稼動の安定性に影響がありうることには注意が必要です。

Vertical Pod Autoscalerを有効にする

GKEの場合、以下のコマンドでVPAを有効に切り替えられます。

$ gcloud container clusters update some_cluster --enable-vertical-pod-autoscaling

新規クラスタのVPA有効化など詳細については、 公式ドキュメントを参照してください。

VPAにシステムpodを管理させる

VPAの挙動は、VerticalPodAutoscalerのマニフェストで設定します。kube-dnsfluentd-gkeをターゲットとする設定例は以下のとおりです。

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  namespace: kube-system
  name: kube-dns-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind: Deployment
    name: kube-dns
  updatePolicy:
    updateMode: "Auto"

---

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  namespace: kube-system
  name: fluentd-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind: DaemonSet
    name: fluentd-gke
  updatePolicy:
    updateMode: "Auto"

spec.updatePolicy.updateModeが挙動を決めています。“Auto"はVPAが随時リソース調整を行うモードです。ほかに、Pod起動時に調整する"Initial"などがあります。

labelで指定する場合は以下のような書き方になります。

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  namespace: kube-system
  name: kubesystem-deployment-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind: Deployment
    matchExpressions:
    - { key: k8s-app, operator: In, values: [kube-dns, metrics-server] }
  updatePolicy:
    updateMode: "Auto"

このリソースをkubectl applyするとVPAがターゲットのリソース管理を開始します。Autoの場合はしばらく待つとターゲットのpod再構成が走り、CPUなどのリクエスト設定が変わります。

targetRefのリソースについては、以下のコマンドで確認できます。

$ kubectl get deployment,daemonset -n kube-system

Vertical Pod Autoscalerのリソースは以下のコマンドで確認できます。

$ kubectl get vpa -nkube-system

まとめ

引用したStackOverflowの議論のとおり、kube-systemは小規模クラスタでやや過剰なリソース要求になります。
典型的には、CPUが1つのサーバーのキャパシティ1000msに対してkube-dnsが260ms要求すると、それだけで25%ロックされます。kube-systemは他にも100ms単位でロックするpodがあり、利用開始時点で利用可能なCPUリクエストのキャパシティが相当削られています。

VPAを利用すると、ロックはするものの使っていないkube-systemリソースを空きリソースとして利用できるようになります。繰返しになりすが、kube-systemのリソースはクラスタの安定稼動と関連しており、VPAの機能依存になる点はトレードオフになります。

中馬崇尋
Chuma Takahiro