DevOps

Kind でローカルに Kubernetes クラスタを立てる

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

Kubernetes が引き受ける範囲

Kubernetes Neon Logo

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

STATUSContainerCreating から 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 を書いた設定ファイルからクラスタを作り直すことになります。ここは一度必ずつまずくところなので、先に知っておくと楽です。