【GitOps番外編】Cluster APIを試す

### 背景
[Tanzu](https://docs.vmware.com/en/VMware-Tanzu/index.html)を業務で少し触っているのですが、`Tanzu`は`Cluster API`を利用しているので、`Tanzu`と`Cluster API`への理解を深めるため、本記事で軽く検証することにした。

### 環境

- AWS EC2
  - Docker 20.10.13
  - Ubuntu 20.04.3
  - kind v0.12.0
  - clusterctl 1.1.3

### 手順

[Cluster APIのドキュメント](https://cluster-api.sigs.k8s.io/user/quick-start.html)を参考に早速試してみる。

#### Kubectlをインストール

```bash
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
kubectl version --client
```

#### Kindをインストール

```bash
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.12.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/
```

#### Kindの設定ファイルを作成する

```bash
cat > kind-cluster-with-extramounts.yaml <<EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraMounts:
    - hostPath: /var/run/docker.sock
      containerPath: /var/run/docker.sock
EOF
```

#### 上記で作成したKindの設定ファイルをもとに、Kindクラスタを作成する

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

#### clusterctlをインストール

```bash
curl -L https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.1.3/clusterctl-linux-amd64 -o clusterctl
chmod +x ./clusterctl
sudo mv ./clusterctl /usr/local/bin/clusterctl
clusterctl version
```

#### 管理クラスタを初期化する

今回は`Docker`を利用するので、下記のコマンドを実行する

```bash
clusterctl init --infrastructure docker
```


#### ワークロードクラスタを作成用の`yaml`ファイルを作成する


```bash
clusterctl generate cluster capi-quickstart --flavor development \
  --kubernetes-version v1.23.3 \
  --control-plane-machine-count=3 \
  --worker-machine-count=3 \
> capi-quickstart.yaml
```

#### 作成したyamlファイルをもとにワークロードクラスタを作成する

```bash
kubectl apply -f capi-quickstart.yaml
```

#### 作成されたワークロードクラスタを確認する

`capi-quickstart`という名前のクラスタが作成されている

```bash
kind get clusters
capi-quickstart
kind
```

下記のコマンドでも確認可能。
```bash
kubectl get cluster
NAME              PHASE         AGE   VERSION
capi-quickstart   Provisioned   10m
```

#### ワークロードクラスタのkubeconfigを取得する

```bash
clusterctl get kubeconfig capi-quickstart > capi-quickstart.kubeconfig
```

取得したkubeconfigでpodの状態を確認する

```bash
 kubectl get po -A --kubeconfig capi-quickstart.kubeconfig
```

##### <details><summary>出力</summary><div>

```bash
NAMESPACE     NAME                                                          READY   STATUS    RESTARTS   AGE
kube-system   coredns-64897985d-f2xc5                                       0/1     Pending   0          2m53s
kube-system   coredns-64897985d-mr6pj                                       0/1     Pending   0          2m53s
kube-system   etcd-capi-quickstart-control-plane-tz29v                      1/1     Running   0          102s
kube-system   etcd-capi-quickstart-control-plane-v7zrq                      1/1     Running   0          2m59s
kube-system   kube-apiserver-capi-quickstart-control-plane-tz29v            1/1     Running   0          92s
kube-system   kube-apiserver-capi-quickstart-control-plane-v7zrq            1/1     Running   0          2m59s
kube-system   kube-controller-manager-capi-quickstart-control-plane-tz29v   1/1     Running   0          32s
kube-system   kube-controller-manager-capi-quickstart-control-plane-v7zrq   1/1     Running   0          2m59s
kube-system   kube-proxy-8pllk                                              1/1     Running   0          2m14s
kube-system   kube-proxy-9wzl8                                              1/1     Running   0          2m2s
kube-system   kube-proxy-dj5w7                                              1/1     Running   0          2m2s
kube-system   kube-proxy-kn5dt                                              1/1     Running   0          112s
kube-system   kube-proxy-mzbhk                                              1/1     Running   0          2m53s
kube-system   kube-scheduler-capi-quickstart-control-plane-tz29v            1/1     Running   0          102s
kube-system   kube-scheduler-capi-quickstart-control-plane-v7zrq            1/1     Running   0          3m
```
</div></details>

### CLEAN UP

ワークロードクラスタの削除

```bash
kubectl delete cluster capi-quickstart
```

管理クラスタの削除

```bash
kind delete cluster
```


### 最後に
本記事では`Cluster api`を試して、管理クラスタからワークロードクラスタを払い出すまでを実施してみた。次は、`Cluster api`と`GitOps`を組み合わせて、Cluster の管理をGitで行ってみたい。