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
リンク
- ドキュメント
おわりに
kindいかがでしたでしょうか
この記事を書いてる時点ではまだpre-releaseですがKubernetesの検証用ツールとしては十分な機能とパフォーマンスを発揮してくれていると思います.
またSlackのKubernetesのワークスペースには#kind
というチャンネルがあります.気になった人はぜひのぞいてみてはいかがでしょうか.
この発表を通じて関西のKubernetes熱がさらに高まるとうれしいなあ( ´ω`)