それなりに適当にやってます

なんとなくそれっぽいメモとか備忘録とか適当に。 2018年5月にブログ移転しました。 古い記事は未整理です。

GKE(Google Kubernetes Engine) クラスタを立ててみた

こちらのページ 安価なGKE(k8s)クラスタを作って趣味開発に活用する - えいのうにっき を参考にさせて頂き、プリエンティブ・インスタンスを使った GKE(Google Kubernetes Engine) クラスタを立ててみた。

gcloud コマンドの更新と kubectl コマンドのインストール

とりあえずローカル環境の更新と、kubectl コマンドのインストール

$ sudo apt update
$ sudo apt upgrade              #<-Ubuntu環境なので。gcloud コマンドで出来る環境なら gloucd components update
$ sudo apt install kubectl      #<-〃 gcloud コマンドで出来る環境なら gcloud components update kubectl

GKEクラスタの作成(プリエンティブル)

どんなオプションがあるのかーとか見ながらコマンドを実行したいのでインタラクティブシェルで実行

$ gcloud alpha interactive
$ gcloud config set container/new_scopes_behavior true
$ gcloud container clusters create example-gke --preemptible \
  --machine-type=f1-micro --disk-size=10 --enable-autorepair \
  --cluster-version=1.10.4-gke.0
...
NAME         LOCATION           MASTER_VERSION  MASTER_IP       MACHINE_TYPE  NODE_VERSION  NUM_NODES  STATUS
example-gke  asia-northeast1-c  1.10.4-gke.0    xxx.xxx.xxx.xxx  f1-micro      1.10.4-gke.0  3          RUNNING

参考にさせて頂いたページのコマンド通りだと、下記のWARNING が出たので先に container/new_scopes_behavior を有効にし --enable-autorepair を加えた。--num-nodes は既定で 3 のようだったので外した。

WARNING: Currently node auto repairs are disabled by default. In the future this will change and they will be enabled by default. Use `--[no-]enable-autorepair` flag  to suppress this warning.
WARNING: Starting in Kubernetes v1.10, new clusters will no longer get compute-rw and storage-ro scopes added to what is specified in --scopes (though the latter will remain included in the default --scopes). To use these scopes, add them explicitly to --scopes. To use the new behavior, set container/new_scopes_behavior property (gcloud config set container/new_scopes_behavior true).

あと最初にコマンドを実行してみた時にはマスターのバージョンが既定で 1.8.10-gke.0 で作成されたのでバージョン指定いれてみた。指定可能なバージョンの一覧は gcloud container get-server-config で見れた。

GKEクラスタ・ノードの追加

続けてインタラクティブシェルの状態で example-gke クラスタに、新しいノードプール added-pool を追加する。追加したノードはマスターのバージョンに合わせて作成された。作成後コンソールでノード数が増加したことを確認

$ gcloud container node-pools create added-pool \
  --cluster example-gke --machine-type=f1-micro --num-nodes=1 \
  --disk-size=10 --enable-autorepair
$ gcloud container node-pools list --cluster example-gke
NAME          MACHINE_TYPE  DISK_SIZE_GB  NODE_VERSION
default-pool  f1-micro      10            1.10.4-gke.0    #<-既定で作成された pool
added-pool    f1-micro      10            1.10.4-gke.0    #<-追加で作成した pool

Pod (ワークロード) の作成

とりあえず Hello World (;^ω^)

$ vi helloworld.yml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: helloworld
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
        - image: "strm/helloworld-http"
          imagePullPolicy: Always
          name: hello-world-container
          ports:
            - containerPort: 80
$ kubectl create -f helloworld.yml
deployment.apps "helloworld" created

$ kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
helloworld-b58876bbd-9khhz   1/1       Running   0          4m
helloworld-b58876bbd-nn4m7   1/1       Running   0          4m

サービスの作成

Pod にアクセスできるようにしてみる。

$ vi helloworld-service.yml
apiVersion: "v1"
kind: "Service"
metadata:
  name: "helloworld-service"
  namespace: "default"
  labels:
    app: "hello-world"
spec:
  ports:
  - protocol: "TCP"
    port: 80
    targetPort: 80
  selector:
    app: "hello-world"
  type: "LoadBalancer"
  loadBalancerIP: ""
$ kubectl create -f helloworld-service.yml
service "helloworld-service" created

$ kubectl get services
NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
helloworld-service   LoadBalancer   10.23.248.153   <pending>     80:32694/TCP   24s
kubernetes           ClusterIP      10.23.240.1     <none>        443/TCP        7m

$ kubectl get service helloworld-service
NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
helloworld-service   LoadBalancer   10.23.248.153   xxx.xxx.xxx.xxx   80:32694/TCP   2m

で、作成されたサービスのEXTERNAL-IPを指定し helloworld〜 なページが見れることなどを確認した。

ノードの停止

とりあえずノード止めたらどうなる?というのが見たかったので、ノード消してみた。 とはいえGCEインスタンスなので Pod が動いているノードに狙いを定めて消すだけ(;^ω^) 結果・・・

  • 削除を実行したインスタンスが再作成された
  • 一時的に Pod の数が半分になったけど、一定時間後に復旧
  • HelloWorld のページも問題なく見れた

ということは確認できた。とりあえず遊ぶだけならこれで十分かな。

削除

一通り確認したので削除する。一気に消しても良いけど確認の意味で順番に試す。

  • サービス と Pod(ワークロード) の削除
$ kubectl delete -f helloworld-service.yml
$ kubectl delete -f helloworld.yml
  • ノードプールの削除
$ gcloud container node-pools delete added-pool --cluster example-gke
$ gcloud container node-pools list --cluster example-gke
NAME          MACHINE_TYPE  DISK_SIZE_GB  NODE_VERSION
default-pool  f1-micro      10            1.10.4-gke.0
  • GKEクラスタの削除
$ gcloud container clusters delete example-gke

参考URL

んー楽ちん。 Docker / Kubernetes の勉強しつつ、GKEのドキュメントを読み進める。

以上