GKE でアドオンを削ったクラスタを起動する


GKE のクラスタを普通に作ると初期状態で起動する Pod がいくつかある。
それらをクラスタ作成時のオプションでどこまで減らせるかを確認する。

## 環境情報

- Kubernetes 1.5.3
- Google Cloud SDK 147.0.0

## デフォルトのクラスタ

普通にクラスタを作って接続する。

```
$ gcloud container clusters create --machine-type=g1-small --num-nodes=1 normal-cluster
Creating cluster normal-cluster...done.
Created [https://container.googleapis.com/v1/projects/apstndb-sandbox/zones/asia-northeast1-a/clusters/normal-cluster].
kubeconfig entry generated for normal-cluster.
NAME            ZONE               MASTER_VERSION  MASTER_IP       MACHINE_TYPE  NODE_VERSION  NUM_NODES  STATUS
normal-cluster  asia-northeast1-a  1.5.3           35.187.194.255  g1-small      1.5.3         1          RUNNING

$ gcloud container clusters get-credentials normal-cluster
Fetching cluster endpoint and auth data.
kubeconfig entry generated for normal-cluster.
```

Node のリソースを確認する。

```
$ kubectl top node
NAME                                            CPU(cores)   CPU%      MEMORY(bytes)   MEMORY%
gke-normal-cluster-default-pool-eb4f0dc0-xjf1   48m          4%        855Mi           50%
```

作成したばかりなのに既に g1-small の 1.7GB の RAM の半分を使っている。
キャッシュに使われている部分もあると思うが心もとない。

### 内訳

起動している Pod を確認する。

```
$ kubectl top pod --all-namespaces
NAMESPACE     NAME                                                                  CPU(cores)   MEMORY(bytes)
kube-system   l7-default-backend-2001230086-njh1p                                   0m           0Mi
kube-system   kubernetes-dashboard-3968242289-515z6                                 0m           13Mi
kube-system   kube-dns-702851989-d1gnc                                              1m           17Mi
kube-system   kube-dns-autoscaler-1193130908-9772h                                  0m           4Mi
kube-system   fluentd-cloud-logging-gke-normal-cluster-default-pool-eb4f0dc0-xjf1   6m           86Mi
kube-system   heapster-v1.2.0.1-1244163626-4pd74                                    0m           15Mi
kube-system   kube-proxy-gke-normal-cluster-default-pool-eb4f0dc0-xjf1              14m          8Mi
```

これらの用途は下記のようなものだ。

| 名前 ||
|--------|--------|-|
|`l7-default-backend`|Ingress のデフォルトバックエンド|
|`kubernetes-dashboard`|Kubernetes ダッシュボード|
|`kube-dns`|Kubernetes の Pod, Service の名前によるアクセス|
|`kube-dns-autoscaler`|`kube-dns` のオートスケール|
|`fluentd-cloud-logging`|Cloud Logging 連携|
|`heapster`|Kubernetes のリソース監視|
|`kube-proxy`|Kubernetes の Service へのルーティング|

この中だと `fluentd-cloud-logging` が相対的に大きく、仮に 0.6 GB しか RAM のない f1-micro マシンタイプだとしたらかなり圧迫することになるだろう。
他がほぼ Go 製なのに対して Ruby 製なのと無関係ではないと考えられる。

## 作成時に各拡張を無効化したクラスタ

一通りの無効化できそうなものを無効化したクラスタを作ってみよう。

```
$ gcloud container clusters create --machine-type=g1-small --num-nodes=1 minimal-cluster \
    --no-enable-cloud-endpoints \
    --no-enable-cloud-logging \
    --no-enable-cloud-monitoring \
    --disable-addons=HttpLoadBalancing,HorizontalPodAutoscaling
Creating cluster minimal-cluster...done.
Created [https://container.googleapis.com/v1/projects/apstndb-sandbox/zones/asia-northeast1-a/clusters/minimal-cluster].
kubeconfig entry generated for minimal-cluster.
NAME             ZONE               MASTER_VERSION  MASTER_IP      MACHINE_TYPE  NODE_VERSION  NUM_NODES  STATUS
minimal-cluster  asia-northeast1-a  1.5.3           104.198.91.96  g1-small      1.5.3         1          RUNNING
$ gcloud container clusters get-credentials minimal-cluster
Fetching cluster endpoint and auth data.
kubeconfig entry generated for minimal-cluster.
```

もはや `heapstar` が起動していないので `kubectl top` サブコマンドは使えない。
`kubectl get pod` で起動している Pod を確認する。

```
$ kubectl get pod --all-namespaces
NAMESPACE     NAME                                                       READY     STATUS    RESTARTS   AGE
kube-system   kube-dns-702851989-k886h                                   4/4       Running   0          2m
kube-system   kube-dns-autoscaler-1193130908-wjh4f                       1/1       Running   0          2m
kube-system   kube-proxy-gke-minimal-cluster-default-pool-238257ab-b9h8   1/1       Running   0          3m
kube-system   kubernetes-dashboard-3968242289-wr78s                      1/1       Running   0          2m
```

一通りのオプションを指定したが、今回削れたのは下記の3つだ。

| Pod | 削除方法 |
|-----|---------|
| `l7-default-backend` | `--disable-addons=HttpLoadBalancing ` |
| `fluentd-cloud-logging` |  `--no-enable-cloud-logging` |
| `heapster` |  `--no-enable-cloud-monitoring` |

残ったものも `kube-dns` と `kube-proxy` 以外は Deployment を消せば止められそうだが、制御するオプションはないので、 Node を作り直したりする際に復活する可能性がある。

### 追記

`kube-dns-autoscaler`, `kubernetes-dashboard` ともに、 `kubectl delete deployment` で削除しても自動的に復活することを確認した。よって、今のところこの記事の内容が最小構成だと思われる。

## 参考

- [`configure-helper.sh`](https://github.com/kubernetes/kubernetes/blob/v1.5.3/cluster/gce/gci/configure-helper.sh)