「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のインストールについては以下を参考にしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# 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名が一致していることがわかる |