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
で削除しても自動的に復活することを確認した。よって、今のところこの記事の内容が最小構成だと思われる。