Kind 構築/操作メモ

<img src="https://raw.githubusercontent.com/kubernetes-sigs/kind/master/logo/logo.svg" width=50%>
https://github.com/kubernetes-sigs/kind/blob/master/logo/logo.png

# はじめに

[Cluster API](https://github.com/kubernetes-sigs/cluster-api)を試してみようと思ったら、まずは何かしらのk8sクラスタを用意する必要があった。
Kindを使うのが手っ取り早そうなのと、今まで使ったことなかったので、この機会に試してみました。

# インストール

## 前提条件

* 以下がインストールされていること
    * Docker
    * kubectl<br \>（Kindのインストールには不要だが、k8sクラスタ作成後、k8sを操作をするために必要）

## 環境

* ベアメタル
* Ubuntu 20.04.1
* Docker 20.10.2
* kubectl v1.19.1

## インストールのログ

```
$ curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.9.0/kind-linux-amd64
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    97  100    97    0     0    302      0 --:--:-- --:--:-- --:--:--   303
100   642  100   642    0     0   1042      0 --:--:-- --:--:-- --:--:--  626k
100 7247k  100 7247k    0     0   490k      0  0:00:14  0:00:14 --:--:--  998k
$ chmod +x ./kind
$ sudo mv kind /usr/local/bin
$ kind version
kind v0.9.0 go1.15.2 linux/amd64
```

# 各操作

## クラスタ作成

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

kubectl cluster-info --context kind-kind

Thanks for using kind! 😊
```

kubeconfigも作成された。
中身を確認すると、apiserverのURLが`https://127.0.0.1:39055`となっていた。

`docke ps`でkindのコンテナができていることも確認できました。

```
$ docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED         STATUS         PORTS                       NAMES
55cc6a93dacb   kindest/node:v1.19.1   "/usr/local/bin/entr…"   7 minutes ago   Up 7 minutes   127.0.0.1:39055->6443/tcp   kind-control-plane
```

ホストの`39055`番がコンテナの`6443`番にポートフォワードされている。
これによって、apiserverのエンドポイント`https://127.0.0.1:39055`へのリクエストが、Kindコンテナの`6443`番にフォワードされてapiserverに届くことがわかる。

## クラスタ一覧

```
$ kind get clusters
kind
```

## 作成したクラスタの確認

```
$ kubectl cluster-info
Kubernetes control plane is running at https://127.0.0.1:39055
KubeDNS is running at https://127.0.0.1:39055/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
$ kubectl get nodes
NAME                 STATUS   ROLES    AGE   VERSION
kind-control-plane   Ready    master   25h   v1.19.1
$ kubectl get all -A
NAMESPACE            NAME                                             READY   STATUS    RESTARTS   AGE
kube-system          pod/coredns-f9fd979d6-29hpt                      1/1     Running   0          25h
kube-system          pod/coredns-f9fd979d6-fcrsh                      1/1     Running   0          25h
kube-system          pod/etcd-kind-control-plane                      1/1     Running   0          25h
kube-system          pod/kindnet-sxmz9                                1/1     Running   0          25h
kube-system          pod/kube-apiserver-kind-control-plane            1/1     Running   0          25h
kube-system          pod/kube-controller-manager-kind-control-plane   1/1     Running   0          25h
kube-system          pod/kube-proxy-v5lvt                             1/1     Running   0          25h
kube-system          pod/kube-scheduler-kind-control-plane            1/1     Running   0          25h
local-path-storage   pod/local-path-provisioner-78776bfc44-m5zkj      1/1     Running   0          25h

NAMESPACE     NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
default       service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP                  25h
kube-system   service/kube-dns     ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   25h

NAMESPACE     NAME                        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
kube-system   daemonset.apps/kindnet      1         1         1       1            1           <none>                   25h
kube-system   daemonset.apps/kube-proxy   1         1         1       1            1           kubernetes.io/os=linux   25h

NAMESPACE            NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
kube-system          deployment.apps/coredns                  2/2     2            2           25h
local-path-storage   deployment.apps/local-path-provisioner   1/1     1            1           25h

NAMESPACE            NAME                                                DESIRED   CURRENT   READY   AGE
kube-system          replicaset.apps/coredns-f9fd979d6                   2         2         2       25h
local-path-storage   replicaset.apps/local-path-provisioner-78776bfc44   1         1         1       25h
```

## アプリケーションのデプロイ

```
$ kubectl apply -f https://k8s.io/examples/service/access/hello-application.yaml
deployment.apps/hello-world created
$ kubectl expose deployment hello-world --type=NodePort --name=example-service
service/example-service exposed
$ kubectl port-forward --address localhost svc/example-service 8080:8080
Forwarding from 127.0.0.1:8080 -> 8080
Handling connection for 8080> 8080
```

別のターミナルから確認すると、アプリにアクセスできることが確認できました。

```
$ curl http://localhost:8080
Hello Kubernetes!
```

## クラスタの削除

```
$ kind delete cluster --name kind
Deleting cluster "kind" ...
```

# 所感

非常に簡単にk8sクラスタを構築することができました。
アプリのテストとかで何でもいいからk8sを手軽に使いたいというときに便利そうです。
今回はシングルノード構成しか試しませんでしたが、[マルチノードのクラスタ](https://kind.sigs.k8s.io/docs/user/quick-start/#multinode-clusters)をつくることもできるようです。

# 参考

* https://github.com/kubernetes-sigs/kind
* https://kind.sigs.k8s.io/docs/user/quick-start/
* https://techblog.gmo-ap.jp/2019/09/19/kind-kubernetes-in-docker/