kind(Kubernetes-in–Docker)でお手軽にローカルKubernetesクラスターを構築

Kubernetes

minikubeばかり使ったいたので、今更ですがkindを使ってみます。

kubernetes-sigs/kind
Kubernetes IN Docker - local clusters for testing Kubernetes - kubernetes-sigs/kind

kindとは

公式ページを見てみると、以下のような説明がありました。

kind is a tool for running local Kubernetes clusters using Docker container “nodes”.
kind was primarily designed for testing Kubernetes itself, but may be used for local development or CI.

直訳してみると、kindは、Dockerコンテナの「ノード」を使用してローカルのKubernetesクラスタを実行するためのツールです。 kindは、主にKubernetes自体をテストするために設計されたが、ローカル開発またはCIに使用される場合もあるらしい。

minikubeはVMを使ってシングルノードクラスタをローカルで実行できるツールです。kindもKubernetesクラスタをローカルで実行できるのですが、ノードがコンテナです。とても手軽そうなので、今回はこのkindをインストールして使ってみす。

やってみる

インストール

クイックスタートにあるインストール手順をやってみましょう。MacOSなので、Homebrewを使うのが簡単そうですね。

クラスターの作成

kindでは、KubernetesクラスタのノードをDockerコンテナとして動かすので、まずMacでDockerを起動します。そして、下記コマンドを実行します。

すると、Kubernetesクラスタのブートストラップが始まります。ノードとなるコンテナのイメージは、kindest/nodeから適当バージョンが選ばれるようです。他のイメージを使いたい場合は、kind create cluster --image=で指定することもできるらしい。

インストールが終わるとkubeconfigも作成され、kindというcontextがセットされます。kubectlを使ってkindクラスターにアクセスできます。



もう少し試してみる

ノードとなるコンテナを覗く

kindの特長は、やはりノードがコンテナで動いているという点です。そこでまずはノードとなるコンテナを覗いてみます。Dockerで見てみると、たしかにコンテナが1つできています。前述のようにkindest/nodeというイメージを使っていて、Dockerコンテナの名前はkind-control-planeです。

まずこのNodeイメージには、kubeletkubeadmsystemdのほか、コアコンポーネントとなるetcdcorednspausekube-apiserverなどのコンテナイメージも含まれています。

docker execコマンドで、このノードコンテナの中を見てみましょう。

まず、デフォルトで選択されるノードイメージにはUbuntuが使われています。

systemdでkubeletサービスが動いているのも確認できます。Static Podはおなじみのパス/etc/kubernetes/manifestsにあるらしい。コントロールプレーンのコンポーネントは、Static Podとして動いています。

その他も同様にいろいろ触ってみたり、GitHubリポジトリのDockerfileを眺めてみると、面白いと思います。

初期状態のPodを除く

クラスターを構築した直後は、以下のPodが動いています。先程見たようにほとんどがコントロールプレーンを構成するPodです。

見慣れない名前のPodもあります。kindnetlocal-path-provisionerです。

kindnetは、kindで利用されているCNIです。

そしてlocal-path-provisionerは、hostPathベースのPersistentVolumeを作成ためのものです。hostPathを使ったDynamic provisioningにも対応しているらしい。

どちらもDaemonSetとして、クラスタ内で実行されています。

クラスターの設定を変える

クイックスタートのAdvancedを見てみると、Kindクラスターのカスタマイズ方法が書いてあります。YAMLファイルに設定を書くことで、マルチノードにしたり、ノードのコンテナイメージを定義したりできます。



以上.

コメント