[Kubernetes] Kind (Kubernetes in Docker) を試してみた

# Kind とは？

- `Docker` 上で `Kubernetes` を動かすもの
- `Kubernetes` の各ノードはコンテナとして動く
- 構築が非常に楽（ほぼワンライナー）
- コンテナが動くだけなので環境を汚さない
- 使い捨てしやすいので学習に適している
- etc...

# 今回の環境

- Ubuntu Server 20.04 on VMware ESXi

# いざ挑戦

## Kind の入手

シングルバイナリで公開されているのでダウンロードして配置します。

```sh
$ curl -L -o kind https://github.com/kubernetes-sigs/kind/releases/download/v0.8.1/kind-$(uname)-amd64
$ sudo chmod +x kind
$ sudo mv kind /usr/bin/kind
$ kind version
kind v0.8.1 go1.14.2 linux/amd64
```

## Kubectl の入手

これもシングルバイナリで公開されているのでダウンロードして配置します。

```sh
$ curl -L https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
$ sudo chmod +x kubectl
$ sudo mv kubectl /usr/bin/kubectl
$ kubectl version --short --client
Client Version: v1.18.6
```

## Kind で構築

`Kind` 用の設定ファイルを作成します。
今回は `コントロールプレーン *1` と `ワーカーノード *3` で構築します。

```yaml:kind.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker
```

作成した設定ファイルを `Kind` に食わせて構築させます。

```sh
$ kind create cluster --config kind.yaml
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.18.2) 🖼 
 ✓ Preparing nodes 📦 📦 📦 📦  
 ✓ Writing configuration 📜 
 ✓ Starting control-plane 🕹️ 
 ✓ Installing CNI 🔌 
 ✓ Installing StorageClass 💾 
 ✓ Joining worker nodes 🚜 
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Not sure what to do next? 😅  Check out https://kind.sigs.k8s.io/docs/user/quick-start/
```

少々待つと完了します。
`kubectl` を `Kind` で作った `Kubernetes` に向けるために設定します。

```sh
$ kubectl cluster-info --context kind-kind
Kubernetes master is running at https://127.0.0.1:34841
KubeDNS is running at https://127.0.0.1:34841/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
```

## 動作確認

実際に構築されたものを確認してみましょう。

```sh
$ kubectl get no -o wide
NAME                 STATUS   ROLES    AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE       KERNEL-VERSION     CONTAINER-RUNTIME
kind-control-plane   Ready    master   27m   v1.18.2   172.18.0.5    <none>        Ubuntu 19.10   5.4.0-42-generic   containerd://1.3.3-14-g449e9269
kind-worker          Ready    <none>   26m   v1.18.2   172.18.0.2    <none>        Ubuntu 19.10   5.4.0-42-generic   containerd://1.3.3-14-g449e9269
kind-worker2         Ready    <none>   26m   v1.18.2   172.18.0.3    <none>        Ubuntu 19.10   5.4.0-42-generic   containerd://1.3.3-14-g449e9269
kind-worker3         Ready    <none>   26m   v1.18.2   172.18.0.4    <none>        Ubuntu 19.10   5.4.0-42-generic   containerd://1.3.3-14-g449e9269
```

しっかり4台動いていることが確認できました。
`docker ps` で実際に動いているコンテナを確認できます。

```sh
$ docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                       NAMES
8b3d0f094fa3        kindest/node:v1.18.2   "/usr/local/bin/entr…"   30 minutes ago      Up 29 minutes                                   kind-worker
2dac19ed7ef8        kindest/node:v1.18.2   "/usr/local/bin/entr…"   30 minutes ago      Up 29 minutes       127.0.0.1:34841->6443/tcp   kind-control-plane
695c6175fdd5        kindest/node:v1.18.2   "/usr/local/bin/entr…"   30 minutes ago      Up 29 minutes                                   kind-worker3
8564350b333f        kindest/node:v1.18.2   "/usr/local/bin/entr…"   30 minutes ago      Up 29 minutes                                   kind-worker2
```

各ノードがコンテナとして動いていることが確認できます。
コントロールプレーンだけ `Kubernetes API` のためにポートが開いています。

## 後片付け

構築が簡単なので壊すのも簡単です。

```sh
$ kind delete cluster
Deleting cluster "kind" ...
```

以上です。