ローカル環境でCluster APIを試してみよう！CAPDによるお手軽検証環境の構築

Kubernetes環境の管理・運用を自動化するCluster APIに興味はあるものの、「クラウド環境が必要そう...」と躊躇されている方も多いのではないでしょうか？

実は、Docker環境があれば、クラウドプロバイダーなしでもCluster APIを試すことができます。今回は、CAPD（Cluster API Provider Docker）を使って、ローカル環境でCluster APIを検証できる環境を構築する方法をご紹介します。

## 前提条件

以下のツールが必要です：
- Docker
- kubectl
- kind
- clusterctl

## 環境構築の流れ

大まかな流れは以下の通りです：

1. kindを使用して管理クラスタを作成
2. Cluster API（CAPD）の初期化
3. ワークロードクラスタの作成
4. CNIのセットアップ

それでは、順番に見ていきましょう。

## 1. 管理クラスタの作成

まず、CAPDが動作する土台となる管理クラスタをkindで作成します。

ホストのDockerソケットにアクセスできるように、以下の設定ファイルを作成します：

```yaml
# 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クラスタを作成します：

```bash
kind create cluster --config kind-cluster-with-extramounts.yaml
```

以下のような出力が表示されれば成功です：

```bash
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をインストールします：

```bash
export CLUSTER_TOPOLOGY=true && clusterctl init --infrastructure docker
```

これにより、必要なコンポーネントがインストールされます。成功すると以下のような出力が表示されます：

```bash
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(マスカット)にします🍇：

```bash
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
```

クラスタの状態を確認してみましょう：

```bash
kubectl get cluster
```

```bash
NAME     CLUSTERCLASS   PHASE         AGE     VERSION
muscat   quick-start    Provisioned   5m47s   v1.31.0
```

## 4. CNIのセットアップ

最後に、ネットワーク機能を有効にするためにCalicoをインストールします：

```bash
# まずkubeconfigを取得
kind get kubeconfig --name muscat > kubeconfig.muscat.yaml
# `clusterctl get kubeconfig muscat`は動きません。kubeconfigに書かれたポートとDockerコンテナーのポートが異なるためです。

# Calicoをインストール
kubectl --kubeconfig=./kubeconfig.muscat.yaml apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml
```

しばらく待つと、全てのノードが`Ready`状態になります：

```bash
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の様々な機能を試してみたい方は、この環境を使って実験を開始できます。