そもそもVPAってなに?
Vertical Pod Autoscaler 略してVPA
resources requests
の値を良い感じに管理してくれるらしい。
僕はresources requests
の値を決めるとき、 kubectl top
から得た値に
多少バッファをもたせたものを採用してました。
そういう煩わしいことをしなくてもよくなるのはとても魅力的です。
詳しくはチェシャ猫さんが解説してます
http://ccvanishing.hateblo.jp/entry/2018/10/02/203205
導入方法
clusterを作る場合
gcloud beta container clusters create [CLUSTER_NAME] --enable-vertical-pod-autoscaling
clusterがすでに作られている場合
gcloud beta container clusters update [CLUSTER-NAME] --enable-vertical-pod-autoscaling
でVPAは有効になる。
https://cloud.google.com/kubernetes-engine/docs/how-to/vertical-pod-autoscaling
ちなみに対象のcluster versionは
1.11.3-gke.11 and higher
なので注意。
今回の構成
- node
- 1つ
- インスタンスサイズ
- n1-standard-1
nginx.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx
labels:
purpose: vpa
spec:
template:
metadata:
labels:
purpose: vpa
spec:
containers:
- name: nginx-test
image: nginx
resources:
requests:
cpu: 50m
limits:
cpu: 100m
vpa.yaml
apiVersion: autoscaling.k8s.io/v1beta1
kind: VerticalPodAutoscaler
metadata:
name: test-vpa
spec:
selector:
matchLabels:
purpose: vpa
updatePolicy:
updateMode: "Auto"
vpa -> deployment の順番でapplyを行い、VPAが起動できているか調査
kubectl get pod -o yaml
(省略)
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx-test
resources:
limits:
cpu: 100m
requests:
cpu: 50m
kubectl describe vpa
(省略)
Recommendation:
Container Recommendations:
Container Name: nginx-test
Lower Bound:
Cpu: 12m
Memory: 131072k
Target:
Cpu: 12m
Memory: 131072k
Uncapped Target:
Cpu: 12m
Memory: 131072k
Upper Bound:
Cpu: 3179m
Memory: 3323500k
kubectl top pod
NAME CPU(cores) MEMORY(bytes)
nginx-cc4d69bc9-297jg 0m 1Mi
無事、VPAに推奨値が反映されてることが確認できた。
deploymentをdelete->applyを行い、VPAの推奨値が反映されているか調査
kubectl get po -o yaml
(省略)
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx-test
resources:
limits:
cpu: 100m
requests:
cpu: 50m
memory: 131072k
kubectl describe vpa
(省略)
Recommendation:
Container Recommendations:
Container Name: nginx-test
Lower Bound:
Cpu: 12m
Memory: 131072k
Target:
Cpu: 12m
Memory: 131072k
Uncapped Target:
Cpu: 12m
Memory: 131072k
Upper Bound:
Cpu: 2273m
Memory: 2377214285
requests cpu
が 12m
であることを期待してたのですが、 nginx.yaml
に定義されてるものと
変わっていません。
Admission Controller
が働いてないのか…?と思うものの nginx.yaml
には書き込まれてない
requestsのmemoryは書き込まれているのでバグなのかな?
なんとしてでもrequestsの値をVPAが表示している値にする方法
VPAが表示している値より低い値でapplyすると書き換えられました。
CPU使用率を思いっきり上げVPAに反映されるか調査
yes > /dev/null &
https://techblog.ap-com.co.jp/entry/linux-cpu
を実行し、何分後にVPAに反映されるか調べた。
1分後
NAME CPU(cores) MEMORY(bytes)
nginx-cc4d69bc9-297jg 100m 3Mi
kubectl describe vpa
(省略)
Recommendation:
Container Recommendations:
Container Name: nginx-test
Lower Bound:
Cpu: 12m
Memory: 131072k
Target:
Cpu: 12m
Memory: 131072k
Uncapped Target:
Cpu: 12m
Memory: 131072k
Upper Bound:
Cpu: 2273m
Memory: 2377214285
3分後
NAME CPU(cores) MEMORY(bytes)
nginx-cc4d69bc9-297jg 100m 3Mi
Recommendation:
Container Recommendations:
Container Name: nginx-text
Lower Bound:
Cpu: 9m
Memory: 87381333
Target:
Cpu: 126m
Memory: 87381333
Uncapped Target:
Cpu: 126m
Memory: 87381333
Upper Bound:
Cpu: 7383m
Memory: 673899999
3分ぐらいでVPAに反映されるのが確認できた。
正直わからなかったこと
Updaterの挙動が見られなかった。
推奨値のレンジから外れているPodを数十分起動させてるわけではなかったので、
僕の忍耐が足りなかっただけかもしれない。
調査してみて思ったこと
betaで公開されたばかりなので、こんなもんかなという印象。
これからに期待したいけどVPA自体まだbetaになってないのですね。
この記事書いてるときに気づきました。
https://github.com/kubernetes/enhancements/issues/21
自プロダクトへのproductionに導入はまだまだ先だな〜と思うけど、便利な機能なのでバージョンアップがあれば追っていきたい。