Kubernetes環境の管理・運用を自動化するCluster APIに興味はあるものの、「クラウド環境が必要そう...」と躊躇されている方も多いのではないでしょうか?
実は、Docker環境があれば、クラウドプロバイダーなしでもCluster APIを試すことができます。今回は、CAPD(Cluster API Provider Docker)を使って、ローカル環境でCluster APIを検証できる環境を構築する方法をご紹介します。
前提条件
以下のツールが必要です:
- Docker
- kubectl
- kind
- clusterctl
環境構築の流れ
大まかな流れは以下の通りです:
- kindを使用して管理クラスタを作成
- Cluster API(CAPD)の初期化
- ワークロードクラスタの作成
- CNIのセットアップ
それでは、順番に見ていきましょう。
1. 管理クラスタの作成
まず、CAPDが動作する土台となる管理クラスタをkindで作成します。
ホストのDockerソケットにアクセスできるように、以下の設定ファイルを作成します:
# kind-cluster-with-extramounts.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
ipFamily: dual
nodes:
- role: control-plane
extraMounts:
- hostPath: /var/run/docker.sock
containerPath: /var/run/docker.sock
この設定ファイルを使って、kindクラスタを作成します:
kind create cluster --config kind-cluster-with-extramounts.yaml
以下のような出力が表示されれば成功です:
Creating cluster "kind" ...
✓ Ensuring node image (kindest/node:v1.31.0) 🖼
✓ Preparing nodes 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
Set kubectl context to "kind-kind"
2. Cluster APIの初期化
作成した管理クラスタにCluster APIをインストールします:
export CLUSTER_TOPOLOGY=true && clusterctl init --infrastructure docker
これにより、必要なコンポーネントがインストールされます。成功すると以下のような出力が表示されます:
Fetching providers
Installing cert-manager version="v1.16.0"
Waiting for cert-manager to be available...
Installing provider="cluster-api" version="v1.8.5" targetNamespace="capi-system"
Installing provider="bootstrap-kubeadm" version="v1.8.5" targetNamespace="capi-kubeadm-bootstrap-system"
Installing provider="control-plane-kubeadm" version="v1.8.5" targetNamespace="capi-kubeadm-control-plane-system"
Installing provider="infrastructure-docker" version="v1.8.5" targetNamespace="capd-system"
Your management cluster has been initialized successfully!
3. ワークロードクラスタの作成
次に、実際に動作確認用のKubernetesクラスタ(ワークロードクラスタ)を作成します。クラスター名はここではmuscat(マスカット)にします🍇:
clusterctl generate cluster muscat \
--flavor development \
--kubernetes-version v1.31.0 \
--control-plane-machine-count=3 \
--worker-machine-count=3 \
> muscat.yaml
kubectl apply -f muscat.yaml
クラスタの状態を確認してみましょう:
kubectl get cluster
NAME CLUSTERCLASS PHASE AGE VERSION
muscat quick-start Provisioned 5m47s v1.31.0
4. CNIのセットアップ
最後に、ネットワーク機能を有効にするためにCalicoをインストールします:
# まずkubeconfigを取得
clusterctl get kubeconfig muscat > kubeconfig.muscat.yaml
# Calicoをインストール
kubectl --kubeconfig=./kubeconfig.muscat.yaml apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml
しばらく待つと、全てのノードがReady
状態になります:
kubectl --kubeconfig=./kubeconfig.muscat.yaml get nodes
NAME STATUS ROLES AGE VERSION
muscat-md-0-9mhvz-4xxcd-42nh8 Ready <none> 4m20s v1.31.0
muscat-md-0-9mhvz-4xxcd-8hghp Ready <none> 4m25s v1.31.0
muscat-md-0-9mhvz-4xxcd-mxg7k Ready <none> 4m20s v1.31.0
muscat-r65sn-592c8 Ready control-plane 3m35s v1.31.0
muscat-r65sn-xrzfl Ready control-plane 4m41s v1.31.0
muscat-worker-08sx08 Ready <none> 4m17s v1.31.0
muscat-worker-u6l39f Ready <none> 4m17s v1.31.0
muscat-worker-ydhg40 Ready <none> 4m17s v1.31.0
まとめ
これで、ローカル環境にCluster APIの検証環境が整いました!
- 管理クラスタ(kind)上でCluster APIが動作
- ワークロードクラスタとして3つのコントロールプレーンノードと3つのワーカーノードを持つKubernetesクラスタが動作
- クラウドプロバイダーは不要で、Docker環境があれば検証可能
Cluster APIの様々な機能を試してみたい方は、この環境を使って実験を開始できます。