Cloud Native Kansai #05 でLTしてきた

Cloud Native Kansai #05でLTをしてきました.

今回はローカル環境でのKubernetes開発環境をテーマに,マルチノードクラスタを構築できるkindというツールを紹介しました.
この記事では当日やったデモの内容や発表しきれなかったことをまとめてみようと思います.

kindを触ってみる

インストール

あらかじめdockerとgo(1.11+)インストールしておきます(各ツールのインストール方法の詳細はこの記事では割愛します).
kindは次のコマンドでインストールできます.バージョンは適宜すきなものを選んでください

$ GO111MODULE="on" go get sigs.k8s.io/kind@v0.4.0

クラスタを作る

次のコマンドを実行することでシングルノードのクラスタを作ることができます.

# --name でクラスタの名前を指定できます(デフォルト名はkind)
# --loglevel で出力されるログの詳細度合いを変更することができます [panic, fatal, error, warning, info, debug, trace] 
$ kind create cluster --name shanpu 
Creating cluster "shanpu" ...
 ✓ Ensuring node image (kindest/node:v1.15.0) 🖼
 ✓ Preparing nodes 📦
 ✓ Creating kubeadm config 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
Cluster creation complete. You can now use the cluster with:

export KUBECONFIG="$(kind get kubeconfig-path --name="shanpu")"
kubectl cluster-info

contextは~/.kube内にkind-config-{cluster_name}の形式で作成されるため環境変数$KUBECONFIGで指定します.

# `kind get kubeconfig-path`でコンテキストのパスを取得してくれます
$ export KUBECONFIG="$(kind get kubeconfig-path --name="shanpu")"

マルチノードクラスタを構築する際はyaml形式のconfigファイルを用意しておきます. configファイルでは他にも色々指定できるので気になる方は公式ドキュメントを見てみてください

# ファイル名は何でも大丈夫です
$ cat kind-config.yml
kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha3
nodes:
- role: control-plane
- role: control-plane
- role: control-plane
- role: worker
- role: worker
- role: worker

# --configでconfigファイルを生成します
$ kind create cluster --config kind-config.yml
Creating cluster "shanpu-multi" ...
 ✓ Ensuring node image (kindest/node:v1.15.0) 🖼
 ✓ Preparing nodes 📦📦📦📦📦📦📦
 ✓ Configuring the external load balancer ⚖️
 ✓ Creating kubeadm config 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
 ✓ Joining more control-plane nodes 🎮
 ✓ Joining worker nodes 🚜
Cluster creation complete. You can now use the cluster with:

export KUBECONFIG="$(kind get kubeconfig-path --name="shanpu-multi")"
kubectl cluster-info

クラスタを見てみる

クラスタの作成が終わるとnodeの数だけのコンテナが立ち上がっているのがわかると思います.
masterノードを複数作成した場合はapiサーバ用のロードバランサも自動的に作成されます.

$ docker container ls
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                                  NAMES
437c1138f1ff        kindest/node:v1.15.0           "/usr/local/bin/entr…"   5 minutes ago       Up 5 minutes                                               shanpu-multi-worker3
6cc8b3ba6920        kindest/node:v1.15.0           "/usr/local/bin/entr…"   5 minutes ago       Up 5 minutes        55447/tcp, 127.0.0.1:55447->6443/tcp   shanpu-multi-control-plane2
7b4ca009b0db        kindest/haproxy:2.0.0-alpine   "/docker-entrypoint.…"   5 minutes ago       Up 5 minutes        55450/tcp, 127.0.0.1:55450->6443/tcp   shanpu-multi-external-load-balancer
cf7660eaff59        kindest/node:v1.15.0           "/usr/local/bin/entr…"   5 minutes ago       Up 5 minutes        55449/tcp, 127.0.0.1:55449->6443/tcp   shanpu-multi-control-plane3
a35350c0f2b0        kindest/node:v1.15.0           "/usr/local/bin/entr…"   5 minutes ago       Up 5 minutes        55448/tcp, 127.0.0.1:55448->6443/tcp   shanpu-multi-control-plane
2e5aba47f81a        kindest/node:v1.15.0           "/usr/local/bin/entr…"   5 minutes ago       Up 5 minutes                                               shanpu-multi-worker2
6b3b8b49e07d        kindest/node:v1.15.0           "/usr/local/bin/entr…"   21 minutes ago      Up 21 minutes       55238/tcp, 127.0.0.1:55238->6443/tcp   shanpu-control-plane
97345685ba51        kindest/node:v1.15.0           "/usr/local/bin/entr…"   22 minutes ago      Up 22 minutes       55205/tcp, 127.0.0.1:55205->6443/tcp   demo-control-plane

このnodeコンテナの中にKubernetesクラスタを動かす上で必要なコンポーネントが自動的に用意されています.
ちなみにkubectl topは機能しません.別途メトリクスサーバー(ポッド)をデプロイする必要があります.

$ kubectl get all -n kube-system
pod/coredns-5c98db65d4-mc7sl                       1/1     Running   0          24m
pod/coredns-5c98db65d4-vxbh2                       1/1     Running   0          24m
pod/etcd-shanpu-control-plane                      1/1     Running   0          23m
pod/kindnet-2h7zv                                  1/1     Running   1          24m
pod/kube-apiserver-shanpu-control-plane            1/1     Running   0          23m
pod/kube-controller-manager-shanpu-control-plane   1/1     Running   0          24m
pod/kube-proxy-97ctv                               1/1     Running   0          24m
pod/kube-scheduler-shanpu-control-plane            1/1     Running   0          24m


NAME               TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
service/kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   25m

NAME                        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                 AGE
daemonset.apps/kindnet      1         1         1       1            1           <none>                        25m
daemonset.apps/kube-proxy   1         1         1       1            1           beta.kubernetes.io/os=linux   25m

NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/coredns   2/2     2            2           25m

NAME                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/coredns-5c98db65d4   2         2         2       24m

またリソース使用量は概ねmasterノードで1GiB,workerノードで200MiBくらいです.

$ docker stats
CONTAINER ID        NAME                                  CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
64431e8f7650        shanpu-multi-worker                   5.86%               222.4MiB / 7.787GiB   2.79%               1.77MB / 226kB      725kB / 98.3kB      105
437c1138f1ff        shanpu-multi-worker3                  2.37%               222.3MiB / 7.787GiB   2.79%               1.76MB / 219kB      1.35MB / 53.2kB     108
6cc8b3ba6920        shanpu-multi-control-plane2           18.42%              1.049GiB / 7.787GiB   13.47%              19.1MB / 11.8MB     1.85MB / 147kB      334
7b4ca009b0db        shanpu-multi-external-load-balancer   1.07%               58.4MiB / 7.787GiB    0.73%               21.6MB / 21.6MB     8.45MB / 0B         5
cf7660eaff59        shanpu-multi-control-plane3           14.27%              1.393GiB / 7.787GiB   17.89%              11.9MB / 8.23MB     1.2MB / 147kB       267
a35350c0f2b0        shanpu-multi-control-plane            17.50%              877.6MiB / 7.787GiB   11.01%              18.9MB / 34.6MB     7.4MB / 57.8MB      262
2e5aba47f81a        shanpu-multi-worker2                  2.50%               185.8MiB / 7.787GiB   2.33%               1.77MB / 226kB      1.34MB / 98.3kB     107
6b3b8b49e07d        shanpu-control-plane                  32.94%              600.2MiB / 7.787GiB   7.53%               23.4kB / 126kB      33.7MB / 57.9MB     349

クラスタのログをとる

kindにはログを出力するコマンドが用意されています.

$ kind export logs --name shanpu  
Exported logs to: ...

クラスタを削除する

次のコマンドでクラスタを削除することができます. またコンテキストファイルも同時に削除されます.

$ kind delete cluster --name shanpu 
Deleting cluster "shanpu" ...
$KUBECONFIG is still set to use /Users/shanpu/.kube/kind-config-shanpu even though that file has been deleted, remember to unset it

リンク

github.com

  • ドキュメント

kind.sigs.k8s.io

おわりに

kindいかがでしたでしょうか
この記事を書いてる時点ではまだpre-releaseですがKubernetesの検証用ツールとしては十分な機能とパフォーマンスを発揮してくれていると思います.
またSlackのKubernetesワークスペースには#kindというチャンネルがあります.気になった人はぜひのぞいてみてはいかがでしょうか.

この発表を通じて関西のKubernetes熱がさらに高まるとうれしいなあ( ´ω`)