Kubernetes-in-docker(kind)でkubernetesクラスタを構築する


はじめに

対象読者

  • コンテナでKubernetesクラスタを構築したい方
  • kindを試したい方

前提知識

  • Dockerやコンテナに関する知識
  • Kubernetesの基礎的な知識

背景
複数ノードのKubernetesクラスタを簡単に構築したい!!と思い、
下記のような要望を満たせないかと調べたところkind (kubernetes-in-docker)というツールの存在を知ったので使ってみました。
本記事は備忘録です。

  • 仮想マシンで構築するのは面倒なのでしたくない(ローカルでもクラウドでも)
  • クラウドのk8sサービスも使いたくない
  • docker-composeみたいに1コマンドでクラスタの作成削除ができると嬉しい
  • クラスタは使い捨てにしたい

kindとは

kindの全体像は下の図のようになります。
goアプリケーションであるkindから、クラスタの作成コマンドを叩くとkindest/nodeのコンテナが起動しkubernetesクラスタを構築します。
図中では区別していませんが、kindest/nodeのコンテナはそれぞれMasterノードとWorkerノードとして起動されます。

kindを使うと何がうれしいのか...?
公式ページにはfor testing Kubernetes itselfと記載があり、Kubernetesそのものをテストするために作られたものらしい。
多くのKubernetesユーザはfor local development or CIとあるように、ローカルでの開発やKubernetesの勉強、CI/CDのパイプラインなどの方で活用できそうです。

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.
https://kind.sigs.k8s.io/

環境構築

dockerのインストール

はじめにDockerをインストールします。

Windows10を使用しているので、Docker Desktop for Windowsをインストールしています。

C:\>docker -v
Docker version 20.10.5, build 55c4c88

goのインストール

次にgoをインストールします。
下記URLからダウンロードできるインストーラを利用してインストールできます。

C:\>go version
go version go1.16.7 windows/amd64

kindのインストール

kindのインストール方法は下記のQuick Startに記載があります。

Windows向けの実行ファイルは下記URLからダウンロードします。
https://kind.sigs.k8s.io/dl/v0.11.1/kind-windows-amd64

ダウンロードされたファイルに拡張子がついていませんが、.exeを追加するだけでOKです。
Windows環境なのでmklinkコマンドを利用してダウンロードしたファイルのシンボリックリンクを作成します。

mklink kind.exe kind-windows-amd64

これでkindコマンドが使用できるようになりました。
kind.exeのあるディレクトリで作業をする or PATHを通すのどちらかが必要)

kindでクラスタの作成

とりあえずクラスタを作成してみる

kind create clusterコマンドを実行してクラスタを起動してみました。

C:\>kind create cluster
Creating cluster "kind" ...
 • Ensuring node image (kindest/node:v1.21.1) 🖼  ...
 ✓ Ensuring node image (kindest/node:v1.21.1) 🖼
 • Preparing nodes 📦   ...
 ✓ Preparing nodes 📦
 • Writing configuration 📜  ...
 ✓ Writing configuration 📜
 • Starting control-plane 🕹️  ...
 ✓ Starting control-plane 🕹️
 • Installing CNI 🔌  ...
 ✓ Installing CNI 🔌
 • Installing StorageClass 💾  ...
 ✓ Installing StorageClass 💾
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Not sure what to do next? 😅  Check out https://kind.sigs.k8s.io/docs/user/quick-start/

特に何も指定しないとkindという名前でkubernetesクラスタが作成されるようです。

C:\>kind get clusters
kind

docker psコマンドを実行すると、下記のようにkind-control-planeという名前のコンテナが起動していることが確認できます。
デフォルトではkind-control-planeの1ノードしか起動されないようですね。

C:\>docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED         STATUS         PORTS                       NAMES
c01d1fc6b936   kindest/node:v1.21.1   "/usr/local/bin/entr…"   2 minutes ago   Up 2 minutes   127.0.0.1:57863->6443/tcp   kind-control-plane

作成したクラスタを削除します。

C:\>kind delete cluster
Deleting cluster "kind" ...

複数ノードのクラスタを作成する

kindではyamlにクラスタの構成を記述することができます。
下のyamlではMasterノード1つ、Workerノード3つで構成されるクラスタが作成されます。

mycluster.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
  extraPortMappings:
  - containerPort: 30001
    hostPort: 30001
- role: worker
  extraPortMappings:
  - containerPort: 30002
    hostPort: 30002
- role: worker
  extraPortMappings:
  - containerPort: 30003
    hostPort: 30003

下記のコマンドでmycluster.yamlを元にkubernetesクラスタを作成します。

kind create cluster --config mycluster.yaml

docker psすると、コンテナが起動していることが確認できます。
コンテナとホスト間でポートがマッピングされていることも確認できます。

C:\>docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED              STATUS              PORTS                       NAMES
8de298506989   kindest/node:v1.21.1   "/usr/local/bin/entr…"   About a minute ago   Up About a minute   0.0.0.0:30003->30003/tcp    kind-worker3
78772c73a52a   kindest/node:v1.21.1   "/usr/local/bin/entr…"   About a minute ago   Up About a minute   127.0.0.1:58237->6443/tcp   kind-control-plane
a2a7a3c46e95   kindest/node:v1.21.1   "/usr/local/bin/entr…"   About a minute ago   Up About a minute   0.0.0.0:30001->30001/tcp    kind-worker
cafaf17da932   kindest/node:v1.21.1   "/usr/local/bin/entr…"   About a minute ago   Up About a minute   0.0.0.0:30002->30002/tcp    kind-worker2

Masterノードのコンテナに入ってkubectl get nodesコマンドを実行すると、複数ノード(コンテナ)でクラスタが構築されていることが確認できます。

C:\>docker exec -it kind-control-plane bash
root@kind-control-plane:/#
root@kind-control-plane:/# kubectl get nodes
NAME                 STATUS   ROLES                  AGE     VERSION
kind-control-plane   Ready    control-plane,master   10m     v1.21.1
kind-worker          Ready    <none>                 9m48s   v1.21.1
kind-worker2         Ready    <none>                 9m48s   v1.21.1
kind-worker3         Ready    <none>                 9m48s   v1.21.1

最後にクラスタを削除します。

C:\>kind get clusters
kind

C:\>kind delete cluster
Deleting cluster "kind" ...