Kubernetesクラスタ構築ツールのkindを使って見る

Kubernetesの挙動を確認したくなるたびに毎回kubeadmでクラスタを立ち上げるのがめんどくさかったので気軽に構築できるツールがないか探していたところ，kindという構築ツールを見つけたので試して行こうと思います．

#環境
Mac OS :Catalina version 10.15.2

#Kubernetesとは

[Kubernetes](https://kubernetes.io/docs/home/)について軽く説明すると，オープンソースのコンテナオーケストレーションエンジンです．そしてコンテナはプログラム実行環境の仮想化方法の１つです．
Kubernetesを用いる事で複数台のコンピュータ上のコンテナを管理できます．
Kubernetesクラスタの基本的な構成は以下になります．

![Kubernetesの構成４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319003/b23853a3-d49b-63dd-38b2-5364269281b4.png)


KubernetesクラスタはMaster NodeとWorkerノードの２つのグループに別れます．Master Nodeでユーザからのコンテナ配置命令の受付，スケジューリングなどを行い，Worker Nodeで実際にコンテナを実行します．
コンテナのスケジューリングはPodという単位で行います．
Pod間通信を行いたい場合やクラスタ外からPodと通信したい場合はServiceを通して通信します．

#kindとは

[kind](https://kind.sigs.k8s.io/docs/design/initial/)(kubernetes in docker)は，１台のコンピュータ上でのKubernetes構築ツールです．Kubernetes自身をテストすることを目的に作成されています．
Dockerコンテナを１つのノードとしてみなし，そのノードコンテナ上でDockerコンテナを実行することで，１台のコンピュータ上でマルチノードクラスタを構築できます．
![kindの構成３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319003/c475c2f5-d569-095c-0f04-4d370645b20e.png)

#インストール

kindを動かすには，dockerが必要です．

```
$brew install docker
```

でインストールできます．
Kubernetesクラスタにコンテナを配置するため，Kuberenetesコマンドラインインタフェースであるkubectlをインストールします．

```
$brew install kubectl 
```

最後にkind自身をインストールします．

```
$brew install kind
```

#kindでクラスタ作成 

kindでクラスタを作成して見ます．Master Nodeの構成とWorker Nodeの構成をyamlファイルで記述し，--configオプションで渡します．渡さなかった場合はMaster Node１台のクラスタが作成されます．

```
$kind create cluster --config a-controller-a-worker-mapping.yaml
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.16.3) 🖼
 ✓ 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

Thanks for using kind! 😊
```

使用ファイルは以下の通りです．今回は１台のMaster Nodeと１台の Worker Nodeの構成で作成します．
- role: control-plane
がMaster Nodeの設定で，
- role: worker
がWorker Nodeの設定です．

```a-controller-a-worker-mapping.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
  extraPortMappings:
  - containerPort: 30000
    hostPort: 30000
    listenAddress: "0.0.0.0" #オプション　defaultは "0.0.0.0"
    protocol: tcp # オプション　defaultはtcp
```

extraPortMappingsでクラスタ外からコンテナへ通信できるようにします．
![extraPortMappings3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319003/ffb3dd90-a288-694c-0537-b744112ee5c0.png)

#コンテナのデプロイ

nginxをデプロイして見ます．

```
$kubectl apply -f nginx.yaml 
pod/nginx created
service/nginx-svc created
```

使用ファイルは以下の通りです．

```nginx.yaml
apiVersion : v1
kind : Pod
metadata :
 name : nginx
 labels :
   app : nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.7.9
    ports:
    - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
  - protocol: TCP
    targetPort: 80
    port: 80
    nodePort: 30000
```

Podに対応するServiceを作成する事で，クラスタ外からの通信が可能になります．

![nginx_svc4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319003/9db39ec6-6956-6691-7883-ff3785b3be4a.png)


ブラウザからアクセスして見ます
![nginx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319003/2bf28cf8-879f-7609-a9cf-cd7d505b6a62.png)

無事デプロイできました．



#後片付け
nginxの削除

```
$kubectl delete -f nginx.yaml 
pod "nginx" deleted
service "nginx-svc" deleted
```

クラスタの削除

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

#kubeadmとの比較

Kubernetesクラスタ構築ツールとして有名なものに[kubeadm](https://github.com/kubernetes/kubeadm)があります．kindとは違い複数のコンピュータ上でKubernetesクラスタを構築でき，本番環境にも使用できます．しかし，kindは１台分の作業でクラスタ構築できるのに対し，kubeadmは立ち上げるノード分の作業が発生するのでめんどくさいです．ですのでKubernetesの挙動を確かめたい時はkindの方が良いと思います．

#minikubeとの比較

kindと同じ１台のコンピュータ上でのKubernetes構築ツールとして有名なものに[minikube](https://github.com/kubernetes/minikube)があります.クラスタ構築に必要な作業量はkindとほぼ変わりませんが１台の仮想マシンがMaster NodeとWorker Nodeの両方の役割を担っています．さらにノード数を増やす事ができず，挙動を試せる幅が狭くなります．例えばKubernetesの機能を使って複数台あるWorker Nodeの内のある特定のWorker Nodeにコンテナをデプロイするということを試せません．なのでKubernetesの挙動を確かめたい時はkindの方が良いと思います．


#まとめ

kindを使用することで気軽にKubernetesの挙動を確認できます．なのでこれからKubernetesの挙動を確認したいときはkindを使っていこうと思います．

#参考
[kind](https://kind.sigs.k8s.io/docs/design/initial/)
[kubeadm](https://github.com/kubernetes/kubeadm)
[minikube](https://github.com/kubernetes/minikube)
[Kubernetes ドキュメント](https://kubernetes.io/docs/home/)
[Kubernetes実践ガイド クラウドネイティブアプリケーションを支える技術 (impress top gear)](https://www.amazon.co.jp/s?k=kubernetes実践ガイド&__mk_ja_JP=カタカナ&crid=TXUW9UDNYVAP&sprefix=Kubernetesじ%2Caps%2C249&ref=nb_sb_ss_i_1_11
)