GKEのブートディスクを10GBにしてDiskPressureが発生した

# GKEのブートディスクを10GBにしてDiskPressureが発生した

Google kubernetes Engineを使ってKubernetes(K8s)クラスタを構築した際に、
ブートディスクのサイズを低く設定しすぎてDiskPressureが発生したので自戒も込めて残してておく。

## TL;DR

- GKEでistioを使ってアプリケーションを動かしたいのであれば、ブートディスクは10GBにはしないほうが良い。
- スィートスポットは各アプリケーションで見つけるべき。

## 環境

- ブートディスクのサイズを10GB
<img width="778" alt="afdasfasdgsdafjerou.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13809/8adf5c5c-9508-a561-662d-b5bd8f3f7ae1.png">

- istioを有効にする

<img width="774" alt="sahdjfashdfasdfasdf.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13809/baba1dfc-bfb5-8447-5975-21cbf1bb9929.png">

作成されたクラスタ。

```
$ gcloud container clusters list
NAME     LOCATION           MASTER_VERSION  MASTER_IP        MACHINE_TYPE   NODE_VERSION    NUM_NODES  STATUS
cluster  asia-northeast1-a  1.14.10-gke.17  xxx.xxx.xxx.xxx  n1-standard-1  1.14.10-gke.17  3          RUNNING
```

## istioのサンプルアプリをdeploy


istioのgetting startedに従う。

- https://istio.io/docs/setup/getting-started/

ダウンロード。

```
$ curl -L https://istio.io/downloadIstio | sh -
$ cd istio-1.5.0
```

manifestのapply。

```
$ istioctl manifest apply --set profile=demo

- Applying manifest for component Base...
✔ Finished applying manifest for component Base.
- Applying manifest for component Pilot...
✔ Finished applying manifest for component Pilot.
  Waiting for resources to become ready...
  Waiting for resources to become ready...
  Waiting for resources to become ready...
  Waiting for resources to become ready...
  Waiting for resources to become ready...
  Waiting for resources to become ready...
  Waiting for resources to become ready...
  Waiting for resources to become ready...
  Waiting for resources to become ready...
- Applying manifest for component IngressGateways...
- Applying manifest for component EgressGateways...
- Applying manifest for component AddonComponents...
✔ Finished applying manifest for component EgressGateways.
✔ Finished applying manifest for component IngressGateways.
✔ Finished applying manifest for component AddonComponents.
✔ Installation complete
```

labelの追加。

```
$ kubectl label namespace default istio-injection=enabled
$ kubectl get namespace -L istio-injection

NAME              STATUS   AGE     ISTIO-INJECTION
default           Active   4h17m   enabled
istio-system      Active   4h17m   disabled
kube-node-lease   Active   4h17m
kube-public       Active   4h17m
kube-system       Active   4h17m
```

アプリケーションのデプロイ。

```
$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created

$ kubectl get services
NAME          TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
details       ClusterIP   10.24.6.27    <none>        9080/TCP   32s
kubernetes    ClusterIP   10.24.0.1     <none>        443/TCP    4h18m
productpage   ClusterIP   10.24.6.168   <none>        9080/TCP   31s
ratings       ClusterIP   10.24.1.121   <none>        9080/TCP   32s
reviews       ClusterIP   10.24.11.5    <none>        9080/TCP   31s
```

動作確認。

```
$ kubectl exec -it $(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}') -c ratings -- curl productpage:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
```

### node の状態を確認

DiskPressureが発生している。
<img width="1361" alt="dgfhfdghsssghfda.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13809/a25b4ed1-da20-f63d-4290-e1adf76c34ce.png">

## nodeのディスク容量を確認する

GKEはGCE(Google Compute Engine)のインスタンス上に作られる為、SSHして調べる。
10GB設定したが、`/dev/sda1`には5.7GBと表示されている。

```
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       1.2G  691M  530M  57% /
devtmpfs        1.9G     0  1.9G   0% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           1.9G  1.7M  1.9G   1% /run
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
tmpfs           1.0M  188K  836K  19% /etc/machine-id
tmpfs           256K     0  256K   0% /mnt/disks
tmpfs           1.9G     0  1.9G   0% /tmp
overlayfs       1.0M  188K  836K  19% /etc
/dev/sda8        12M   28K   12M   1% /usr/share/oem
/dev/sda1       5.7G  3.8G  2.0G  66% /mnt/stateful_partition
tmpfs           1.0M  132K  892K  13% /var/lib/cloud
```

`/dev/sda1`は`/var`などで使われるFilesystem。

```
$ df -T /var/
Filesystem     Type 1K-blocks    Used Available Use% Mounted on
/dev/sda1      ext4   5971884 3904764   2050736  66% /var
```

`/var`以下で一番使っているのは`/var/lib/docker`

```
$ sudo du --max-depth=1 -h  /var/lib/docker
32M     /var/lib/docker/containers
76K     /var/lib/docker/network
4.0K    /var/lib/docker/tmp
7.4M    /var/lib/docker/image
4.0K    /var/lib/docker/runtimes
20K     /var/lib/docker/plugins
28K     /var/lib/docker/volumes
20K     /var/lib/docker/builder
4.0K    /var/lib/docker/trust
72K     /var/lib/docker/buildkit
8.3G    /var/lib/docker/overlay2
4.0K    /var/lib/docker/swarm
8.3G    /var/lib/docker
```

10GB設定だと、istioとアプリケーションの設定だけでDiskが枯渇してしまう。

## 対応方法

ストレージクラスを上げたnode poolを作成し、drain/codonなどで移設ずる。