Kubernetes を触ってみたいだけなのに、そのために EKS や GKE のクラスタを立てるのは重すぎます。ローカルで十分です。Kind(Kubernetes in Docker)なら、Docker さえ入っていれば数分で使い捨てのクラスタが手に入ります。
Kubernetes が引き受ける範囲

Docker だけで運用していると、コンテナが落ちたら誰かが再起動し、負荷が上がったら手で数を増やすことになります。Kubernetes はそこを自動化します。
- 落ちたコンテナを検知して起動し直す
- 負荷に応じてコンテナの数を増減する
- 古いバージョンを少しずつ入れ替える(ローリングアップデート)
最低限おさえる用語
Cluster はシステム全体です。複数のマシン(ノード)を束ねて、ひとつの大きな計算資源として扱います。Kind や GKE が用意してくれるのがこれです。
Pod は Kubernetes が扱う最小単位です。ここが Docker との一番の違いで、コンテナを直接動かすのではなく、コンテナを入れた Pod を動かします。さやの中に豆が入っているイメージで、通常は豆がひとつ、必要なら複数を同居させられます。
なぜ Minikube ではなく Kind か
Minikube が VM を立てるのに対して、Kind はノードそのものを Docker コンテナとして動かします。起動が速く、要らなくなればコンテナごと消せるので、壊して作り直す前提の学習用途に向いています。
実際に動かす
macOS を前提に書きますが、Linux でも WSL でも同じです。
1. インストール
brew install kind kind --version
2. クラスタを作る
kind create cluster --name my-cluster
初回はノードイメージのダウンロードが走るので少し待ちます。終わると kubectl のコンテキストが kind-my-cluster に切り替わっているので、確認しておきます。
kubectl cluster-info --context kind-my-cluster
3. Nginx を動かす
kubectl create deployment nginx --image=nginx kubectl get pods
STATUS が ContainerCreating から Running に変われば起動しています。変わらないときは kubectl describe pod <名前> の Events を見ると、イメージの取得で止まっているのか、スケジューリングで止まっているのかが分かります。
4. ブラウザから見る
Pod はクラスタの内側にいるので、そのままでは届きません。ポートフォワードで手元のポートを繋ぎます。
kubectl port-forward deployment/nginx 8080:80
http://localhost:8080 で Nginx の初期ページが出れば成功です。このコマンドは動かしっぱなしにしておく必要があり、止めると接続も切れます。
5. 消す
kind delete cluster --name my-cluster
クラスタごと消えます。コンテナが残っていないかは docker ps -a で確認できます。
先に知っておくとよいこと
Kind のクラスタはローカルの Docker に閉じているので、type: LoadBalancer の Service を作っても EXTERNAL-IP は <pending> のままになります。外部 IP を払い出す仕組みがクラウド側にないためです。
外部公開まで試したいなら、port-forward で済ませるか、NodePort を使うか、extraPortMappings を書いた設定ファイルからクラスタを作り直すことになります。ここは一度必ずつまずくところなので、先に知っておくと楽です。