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-dns
とfluentd-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