「Kubernetesの環境を作るのはハードルが高すぎる。。VMを用意するなり、AWSと契約するなりしなきゃ・・」
そんなあなたに今回はkindというk8sクラスタ構築ツールについて解説します。
kind(Kubernetes IN Docker) は、Dockerコンテナの中にKubernetesのクラスタを構築できるツールです。
kindの原理や使い方についてわかりやすく解説するので、これでPC一台でVM仮想化をしなくてもk8sクラスタを構築できます。
kubectlを叩いた実践的な作業も可能です。
Kindとは
kindはDockerコンテナをk8sクラスタを構成するVMと見立ててk8sクラスタを構築するツールです。
https://kind.sigs.k8s.io/
k8sが公式で提供しているツールであり、Dockerがあればインストールが可能です。
「k8sクラスタ構築のためには、最低でもMASTERノードにさまざまなコンポーネントが必要じゃないの?」と思ったあなたへ。
すでに勉強が進んでいそうですね。
そんなあなたに伝わるように解説します。
Dockerを用いたコンテナ型仮想化
まずDockerを用いてコンテナ型の仮想化をする場合、環境は以下になります。よく見る図ですよね。

ホストOSにDockerをインストールした場合は、Dockerをコンテナエンジンとしてコンテナが起動し、その上(中)でアプリケーションが動作します。
「VMにはゲストOSをインストールする必要があるが、コンテナはゲストOSがなくてもアプリケーションが動作できる軽量な環境」といった解説を見たことがあるでしょう。
k8sクラスタの構成
続いてk8sクラスタの構成は以下になります。

2025年7月現在、k8s上ではDockerではなくcontainerdをコンテナエンジンとして利用することが推奨されています。
containerdは軽量で高機能なコンテナ実行ランタイムです。
従来、k8sクラスタ上のVMもDockerを利用していましたが、簡単に述べると「Dockerは不要なプロセスが多いからcontainerdで良い!」と、k8s側がDockerを使わない仕様に変更しました。
containerdは軽量なコンテナランタイムであり、Dockerはcontainerdを含んでコンテナを管理できるツールだと考えましょう。
そしてk8sクラスタの構築時はcontainerdがインストールされた状態のVMを起動し、その上でPodという単位でコンテナを管理します。
ゲストOSにはk8sクラスタとして動作するための、さまざまなコンポーネントがPodあるいは、単にVMのプロセスとして稼働しています。
kindを使ったk8sクラスタの構成
k8sクラスタを構築する場合、上記のようにVMを作る必要があります。オートスケーリングのことを考えれば、クラウド上のサービスを頼る必要もあるでしょう。
しかし、「VirtualBoxは重くなるから入れたくない!」「AWSは金がかかるから使いたくない!」など、k8sクラスタを構築するには精神的、金銭的なハードルがあります(もちろんほかにもあるでしょう)。
そこで登場したのがkindです。kindを用いればDockerコンテナをk8sクラスタのVMと見立ててk8sクラスタを構築できます。図に起こすと以下の具合です。

ホストOSにDockerをインストールし、Dockerコンテナをk8sクラスタのVMと見立てて必要なコンポーネントが動作します。
そしてコンテナ上で、k8sクラスタVMと同様にPodの利用が可能です。
kindのインストール方法
以下のコマンド実行でインストールが可能です。
Dockerやbrewのインストールについては以下を参考にしてください。
# Docker起動
$ colima start
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# kindのインストール
$ brew install kind
# クラスタ作成
$ kind create cluster --name test-cluster
# config取得
$ kind get kubeconfig --name test-cluster > .kube/config
# kubectl install
$ brew install kubectl
# kubectlの操作ができることを確認
$ kubectl get pods
No resources found in default namespace.
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
test-cluster-control-plane Ready control-plane 3m43s v1.33.1
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
17a345f522df kindest/node:v1.33.1 "/usr/local/bin/entr…" 3 minutes ago Up 3 minutes 127.0.0.1:54210->6443/tcp test-cluster-control-plane
コンテナ名とnode名が一致していることがわかる
