ローカルKubernetesという名の悩み
テストのためにKubernetesクラスターを起動しただけで、ノートPCが「悲鳴」を上げたことはありませんか?私自身、以前はそのような状況に陥っていました。16GBのRAMを搭載したマシンでもファンがジェットエンジンのように鳴り響き、Docker Desktopがシステムリソースを食いつぶしていました。単純なHello Worldアプリをデプロイするだけで、イメージのプルとノードの初期化を待つのに午前中が丸々潰れてしまうこともありました。
Minikubeのような従来のツールの多くは、完全な仮想マシン(VM)を実行します。このアプローチはRAMとCPUを大量に消費します。試行錯誤の末、私はk3dに出会いました。これにより体験は完全に変わりました。5〜10分待つの代わりに、わずか30秒足らずで作業準備の整ったクラスターを手に入れることができるようになったのです。
比較:なぜk3dが優れているのか?
違いを明確にするために、k3dを現在の主要な競合ツールと比較してみましょう。
- Minikube: ローカルK8s界の定番で、多くのドライバーをサポートしています。しかし、動作が重く、ホストマシンとVM間のネットワーク構成で細かなエラーが発生しがちです。
- Kind (Kubernetes in Docker): コンテナ内でK8sを実行するという点ではk3dと似ています。しかし、Kindは標準的なK8sディストリビューションを使用しているため、依然としてそれなりに重いです。
- k3d (k3s in Docker): これはRancherが開発した軽量版K8sであるk3sのラッパーです。不要なコンポーネントを排除し、単一のバイナリファイルに凝縮されています。
以下は、Dell XPS 13 (i7, 16GB RAM) での実測パフォーマンスに基づく比較表です:
| 比較項目 | Minikube (Docker driver) | Kind | k3d |
|---|---|---|---|
| 起動時間 | ~2分 | ~1分 | < 25秒 |
| メモリ使用量(アイドル時) | ~1.5GB – 2GB | ~800MB – 1GB | ~400MB – 500MB |
| マルチノード | 複雑 | 良好 | 非常に柔軟 |
k3dの真の強みとは?
k3dを使用すると、Dockerコンテナ内でk3sをスムーズに実行できます。k3sはもともと、リソースが極めて限られているIoTデバイスやエッジコンピューティング向けに最適化されています。これを開発環境に持ち込むと、クラスターの作成や削除をストレスなく繰り返せるほど高速に動作します。
マルチノードのシミュレーション能力は、私が最も気に入っている点です。コマンド一行で、1つのマスターと3つのワーカーを簡単に構築できます。すべてが独立したDockerコンテナ内に収まります。学習が終わった後の環境のクリーンアップも、わずか数秒で完了します。
事前準備
ラボの構築を始める前に、マシンに以下の2つをインストールしておく必要があります:
- Docker: k3dを動作させるためのコアプラットフォーム。
- kubectl: コマンドラインからKubernetesを操作するためのツール。
k3dのインストールは非常に簡単です。MacOS (Homebrew) を使用している場合は、以下を入力します:
brew install k3d
Windowsユーザーの場合は、Chocolateyが最適な選択肢です。Linuxユーザーの場合は、スクリプトを一行実行するだけです:
wget -qO- https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | TAG=v5.6.0 bash
実践:ゼロからクラスター構築まで
1. 最初のクラスターを作成する
以下のコマンドを入力して、基本的なクラスターを作成します:
k3d cluster create my-lab
k3dは自動的に ~/.kube/config ファイルを設定します。kubectl を使用してすぐに接続できます。ノードの状態を確認するには以下のコマンドを使います:
kubectl get nodes
システムには、マスターとワーカーの両方の役割を果たす単一のノードが表示されます。
2. マルチノード構成(1マスター、2ワーカー)の構築
アプリケーションの耐障害性や分散性をテストするには、マルチノード構成を使用するのが理想的です。以下のコマンドを試してみてください:
k3d cluster create multi-node-cluster --servers 1 --agents 2
この時、Dockerは3つのノードに対応する3つのコンテナを起動します。おなじみの docker ps コマンドでリストを確認できます。
3. ホストマシンへのポート開放(Expose Port)
ブラウザからアプリケーションにアクセスするステップは、多くの人がつまずきやすいポイントです。K8sがDocker内で動作しているため、実マシンからクラスターのLoadBalancerへポートをマッピングする必要があります。
私は通常、Traefik(k3sのデフォルトIngress)を介してマッピングする方法を使います:
k3d cluster create web-lab -p "8080:80@loadbalancer" --agents 2
注:localhost:8080 へのすべてのトラフィックは、クラスターのポート80に直接転送されます。
4. Nginxアプリのデプロイテスト
Nginxサーバーを実行してシステムを確認してみましょう。以下の内容を nginx-deploy.yaml というファイルに保存します:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-test
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
作成したファイルをクラスターにデプロイします:
kubectl apply -f nginx-deploy.yaml
ここで、ブラウザで localhost:8080 にアクセスしてください。Nginxのウェルカムページが表示されれば、ラボの構築は成功です!
k3dワークフローを最適化するコツ
ローカルイメージの使用: Docker Hubにイメージをプッシュする時間をかける代わりに、ホストマシンからクラスターに直接イメージを転送できます。これは非常に価値のある機能です:
k3d image import my-app-image:latest -c my-lab
使用しない時は一時停止: ノートPCのバッテリーを節約したいけれど、設定したリソースを削除したくない場合は、stopコマンドを使用します。これはDockerコンテナを停止するのと同じように動作します:
k3d cluster stop my-lab
k3d cluster start my-lab
この操作により、Minikubeをバックグラウンドで動かし続けるよりも、マシンをはるかに軽快に保つことができます。
結論
k3dは単なる学習用ツールではありません。日々のアプリケーション開発プロセスをよりプロフェッショナルにするための強力な助っ人です。k3dに切り替えてから、Kubernetesでの作業中にマシンがフリーズしたり、メモリ不足になったりすることを心配する必要がなくなりました。
高速で軽量、かつ管理しやすいK8sラボ環境を探しているなら、k3dこそが現時点での完璧な答えです。
