Help us understand the problem. What is going on with this article?

貧者の GKE / 無料枠だけでクラスタを作ろう

Deprecated: この記事の内容は既に2年以上経過しており、有用なものではなくなっていると考えられます。無料枠だけでクラスタを動かすことができても GKE のシステムコンポーネントの削減には限界があり、実用的ではありません。

Google Cloud Next '17 で GCP 無料枠の拡大が発表された。
特に注目なのは US リージョンに限るが GCE f1-micro 1インスタンス, 30 GB の HDD が永続で無料なことだろう。
GKE は5ノードまではマスタの課金はなく、ノードは GCE ノードとして課金されるので、この恩恵が受けられるはずだ。

検証環境

Kubernetes 1.5.4
Google Cloud SDK 148.0.1

挫折

普通にクラスタを作ろうとすると下記のようなエラーで弾かれる。

$ gcloud container clusters create --zone=us-central1-a --machine-type=f1-micro --disk-size=30 --num-nodes=1 free-cluster
ERROR: (gcloud.container.clusters.create) ResponseError: code=400, message=Clusters of f1-micro instances must contain at least 3 nodes. Please make the cluster larger or use a different machine type.

f1-micro は3ノード以上にするか、他のマシンタイプを使えと言われてしまう。
f1-micro 3ノードにした場合、2ノード分を支払うことになるが、それでは g1-small や Commited use discounts を受けた n1-standard-1 に対するメリットが無くなる。

解決

とりあえず3ノードで作成してみる。

$ gcloud container clusters create --zone=us-central1-a --machine-type=f1-micro --disk-size=30 --num-nodes=3 free-cluster
Creating cluster free-cluster...done.
Created [https://container.googleapis.com/v1/projects/apstndb-sandbox/zones/us-central1-a/clusters/free-cluster].
kubeconfig entry generated for free-cluster.
NAME          ZONE           MASTER_VERSION  MASTER_IP        MACHINE_TYPE  NODE_VERSION  NUM_NODES  STATUS
free-cluster  us-central1-a  1.5.4           130.211.174.186  f1-micro      1.5.4         3          RUNNING

ここでおもむろにクラスタサイズを1にリサイズしてみると、通ってしまう。

$ gcloud container clusters resize free-cluster --zone=us-central1-a --size=1
Pool [default-pool] for [free-cluster] will be resized to 1.

Do you want to continue (Y/n)?  y

Resizing free-cluster...done.
Updated [https://container.googleapis.com/v1/projects/apstndb-sandbox/zones/us-central1-a/clusters/free-cluster].

f1-micro 1ノードのクラスタができた。これならきっと無料になるはずだ。

$ gcloud container clusters list
NAME            ZONE               MASTER_VERSION  MASTER_IP        MACHINE_TYPE  NODE_VERSION  NUM_NODES  STATUS
free-cluster    us-central1-a      1.5.4           130.211.174.186  f1-micro      1.5.4         1          RUNNING

別解

実は、 GKE クラスタのノードプールを削除すると0ノードのクラスタにすることができる。

$ gcloud container node-pools delete default-pool --zone=us-central1-a --cluster=free-cluster
The following node pool will be deleted.
[default-pool] in cluster [free-cluster] in zone [us-central1-a]

Do you want to continue (Y/n)?  y

Deleting node pool default-pool...done.
Deleted [https://container.googleapis.com/v1/projects/apstndb-sandbox/zones/us-central1-a/clusters/free-cluster/nodePools/default-pool].

$ gcloud container clusters list free-cluster
NAME            ZONE               MASTER_VERSION  MASTER_IP        MACHINE_TYPE  NODE_VERSION  NUM_NODES  STATUS
free-cluster    us-central1-a      1.5.4           130.211.174.186                1.5.4                    RUNNING

3ノード未満の f1-micro のクラスタを作ることができない制限はノードプール作成時にはチェックされない。

$ gcloud container node-pools create default-pool --cluster=free-cluster \
    --disk-size=30 --machine-type=f1-micro --num-nodes=1 --zone=us-central1-a
Creating node pool default-pool...done.
Created [https://container.googleapis.com/v1/projects/apstndb-sandbox/zones/us-central1-a/clusters/free-cluster/nodePools/default-pool].
NAME          MACHINE_TYPE  DISK_SIZE_GB  NODE_VERSION
default-pool  f1-micro      30            1.5.4

この方法でも f1-micro 1ノードだけのクラスタを作ることができた。

% gcloud container clusters list
NAME            ZONE               MASTER_VERSION  MASTER_IP        MACHINE_TYPE  NODE_VERSION  NUM_NODES  STATUS
free-cluster    us-central1-a      1.5.4           130.211.174.186  f1-micro      1.5.4         1          RUNNING

リソース

起動したクラスタに接続し、 Pod を確認してみよう。

$ gcloud container clusters get-credentials free-cluster --zone=us-central1-a
Fetching cluster endpoint and auth data.
kubeconfig entry generated for free-cluster.

$ kubectl get pod --all-namespaces
NAMESPACE     NAME                                                                READY     STATUS    RESTARTS   AGE
kube-system   fluentd-cloud-logging-gke-free-cluster-default-pool-fc901d64-db1f   1/1       Running   0          8m
kube-system   heapster-v1.2.0.1-1382115970-dq43k                                  0/2       Pending   0          16m
kube-system   kube-dns-4101612645-tg7t4                                           4/4       Running   0          20m
kube-system   kube-dns-autoscaler-2715466192-5b6r8                                1/1       Running   0          16m
kube-system   kube-proxy-gke-free-cluster-default-pool-fc901d64-db1f              1/1       Running   0          9m
kube-system   kubernetes-dashboard-3543765157-z31pv                               1/1       Running   0          16m
kube-system   l7-default-backend-2234341178-3p94b                                 1/1       Running   0          16m

heapster Pod が Pending になっている。
原因を kubectl describe pod で確認してみよう。

$ kubectl describe pod --namespace kube-system heapster-v1.2.0.1-1382115970-dq43k
(省略)
Events:
  FirstSeen     LastSeen        Count   From                    SubObjectPath   Type            Reason                  Message
  ---------     --------        -----   ----                    -------------   --------        ------                  -------
  20m           13m             29      {default-scheduler }                    Warning         FailedScheduling        no nodes available to schedule pods
  12m           1s              47      {default-scheduler }                    Warning         FailedScheduling        pod (heapster-v1.2.0.1-1382115970-dq43k) failed to fit in any node
fit failure summary on nodes : Insufficient memory (1)
  20m   0s      121     {rescheduler }          Normal  PodDoestFitAnyNode      Critical pod kube-system_heapster-v1.2.0.1-1382115970-dq43k doesn't fit on any node.

どうやら f1-micro の 0.6 GB のメモリではデフォルトで起動される Pod を全て起動することもできないようだ。

このままでは何も起動できないので、「GKE でアドオンを削ったクラスタを起動する」を参考にどうにか空きを作ることを検討しよう。

まとめ

  • 無料枠の GCE インスタンスだけでも GKE クラスタは作成可能
    • リサイズ
    • ノードプールの削除&作成
  • f1-micro 1ノードではデフォルトの設定で起動される全 Pod の起動は不可能
    • 頑張ってダイエット!
apstndb
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした