GKEがVertical Pod Autoscalerに対応したらしいので調査した

# そもそも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

```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
```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
```

３分ぐらいでVPAに反映されるのが確認できた。

# 正直わからなかったこと

Updaterの挙動が見られなかった。
推奨値のレンジから外れているPodを数十分起動させてるわけではなかったので、
僕の忍耐が足りなかっただけかもしれない。

# 調査してみて思ったこと

betaで公開されたばかりなので、こんなもんかなという印象。
これからに期待したいけどVPA自体まだbetaになってないのですね。
この記事書いてるときに気づきました。
https://github.com/kubernetes/enhancements/issues/21

自プロダクトへのproductionに導入はまだまだ先だな〜と思うけど、便利な機能なのでバージョンアップがあれば追っていきたい。