kind (Kubernetes in Docker) を試してみる

こんにちは。GMO NIKKO の Y.S です。

先日、kind という ローカル環境でマルチノードな Kubernetes クラスタを動かすことができるツールがあることを知り、試してみたので紹介します。kind という名前は docker in docker の dind 風に、Kubernetes-inDocker で kind とのことです。

Docker 上のコンテナを Kubernetes のワーカーノードとして利用することで、Kubernetes クラスタを構築し、ローカル環境で Minikube のようなシングルノードではできないマルチノードなクラスタを動作させることができます。

また、高速・軽量・クラスプラットフォームという特徴があり、ローカル環境だでけなく、CI のテスト環境にもよく利用されているようです。例えば、Kubernetes 本体のテストでも使用されています。

Kubernetes のバージョンを変更してクラスタを作ることもできるので、新しい Kubernetes バージョンでの動作確認、古い Kubernetes バージョンでの後方互換の確認、といったケースでも使えます。

今回は Docker Desktop for Mac の環境に kind をインストールしていきます。(Docker Desktop の Kubernetes は無効にしておきます)

kind の QuickStart に従って Go の最新版(1.13 以上)をインストールします。今回は Mac 用の公式インストーラを使いました。

インストールされた go と GOPATH 配下にインストールされることになる kind を実行できるよう、PATH 変数に追加します。

kind をインストールします。

kind コマンドを使ってクラスタを作成します。

最初の node image の取得にしばらく時間がかかりましたが、それでも数分で立ちがりました。kubectl の環境変数をセットして、いくつかコマンドを試してみます。

デフォルトではクラスタ名 kind のシングルノードクラスタが作られます。

また、Kubernetes のバージョンは執筆時点で最新安定版の 1.15.3 のバージョンとなっています。 heapster の pod は含まれてなくてメトリクスは取れないようです。docker stats コマンドで見ると下のようなリソース使用状況でした。

次にマルチノードのクラスタをクラスタ名 kind-2 で作成してみます。

ノードの数だけそれに対応するコンテナが作られています。

nginx をデプロイしてみます。

curl で nginx のデフォルトページが出力されることを確認します。

シングルノードのクラスタではできなかった、pod の配置を制御する podAffinity と podAntiAffinity の設定を変えて実際の pod の配置がどうなるか試して見ます。

まず、デプロイ済みの nginx の pod が配置されているノードを確認します。

配置されたノードを見てみると、2つのワーカーノード ( kind-2-worker, kind-2-worker2 ) にぞれぞれに配置されているので、 同じノードに配置されるように podAffinity を設定してみます。

同じノードに配置されました。次に同じノードに配置されないよう podAntiAffinity を設定してみます。

pod が違うノードに配置されていることが確認できました。一通り動作確認できたので、クラスタ削除してクリーンアップします。

クラスタの削除は作成時よりも早く処理が終わりました。

今回は Docker Desktop for Mac の環境で、マルチノードなKubernetes クラスタを作り、podAffinity と podAntiAffinity の設定を試してみました。現状では、デフォルトでメトリクスのデータが取れないなど一部機能に制限はありますが、実際に使われる マルチノードなKubernetes クラスタに近い環境でワークロードのテストができ、クラスタの作成・削除も手軽にできるので、非常に便利に感じました。興味がある人は是非お試しください。