Kubernetesの挙動を確認したくなるたびに毎回kubeadmでクラスタを立ち上げるのがめんどくさかったので気軽に構築できるツールがないか探していたところ,kindという構築ツールを見つけたので試して行こうと思います.
#環境
Mac OS :Catalina version 10.15.2
#Kubernetesとは
Kubernetesについて軽く説明すると,オープンソースのコンテナオーケストレーションエンジンです.そしてコンテナはプログラム実行環境の仮想化方法の1つです.
Kubernetesを用いる事で複数台のコンピュータ上のコンテナを管理できます.
Kubernetesクラスタの基本的な構成は以下になります.
KubernetesクラスタはMaster NodeとWorkerノードの2つのグループに別れます.Master Nodeでユーザからのコンテナ配置命令の受付,スケジューリングなどを行い,Worker Nodeで実際にコンテナを実行します.
コンテナのスケジューリングはPodという単位で行います.
Pod間通信を行いたい場合やクラスタ外からPodと通信したい場合はServiceを通して通信します.
#kindとは
kind(kubernetes in docker)は,1台のコンピュータ上でのKubernetes構築ツールです.Kubernetes自身をテストすることを目的に作成されています.
Dockerコンテナを1つのノードとしてみなし,そのノードコンテナ上でDockerコンテナを実行することで,1台のコンピュータ上でマルチノードクラスタを構築できます.
#インストール
kindを動かすには,dockerが必要です.
$brew install docker
でインストールできます.
Kubernetesクラスタにコンテナを配置するため,Kuberenetesコマンドラインインタフェースであるkubectlをインストールします.
$brew install kubectl
最後にkind自身をインストールします.
$brew install kind
#kindでクラスタ作成
kindでクラスタを作成して見ます.Master Nodeの構成とWorker Nodeの構成をyamlファイルで記述し,--configオプションで渡します.渡さなかった場合はMaster Node1台のクラスタが作成されます.
$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! 😊
使用ファイルは以下の通りです.今回は1台のMaster Nodeと1台の Worker Nodeの構成で作成します.
- role: control-plane
がMaster Nodeの設定で, - role: worker
がWorker Nodeの設定です.
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でクラスタ外からコンテナへ通信できるようにします.
#コンテナのデプロイ
nginxをデプロイして見ます.
$kubectl apply -f nginx.yaml
pod/nginx created
service/nginx-svc created
使用ファイルは以下の通りです.
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の削除
$kubectl delete -f nginx.yaml
pod "nginx" deleted
service "nginx-svc" deleted
クラスタの削除
$kind delete cluster
Deleting cluster "kind" ...
#kubeadmとの比較
Kubernetesクラスタ構築ツールとして有名なものにkubeadmがあります.kindとは違い複数のコンピュータ上でKubernetesクラスタを構築でき,本番環境にも使用できます.しかし,kindは1台分の作業でクラスタ構築できるのに対し,kubeadmは立ち上げるノード分の作業が発生するのでめんどくさいです.ですのでKubernetesの挙動を確かめたい時はkindの方が良いと思います.
#minikubeとの比較
kindと同じ1台のコンピュータ上でのKubernetes構築ツールとして有名なものにminikubeがあります.クラスタ構築に必要な作業量はkindとほぼ変わりませんが1台の仮想マシンがMaster NodeとWorker Nodeの両方の役割を担っています.さらにノード数を増やす事ができず,挙動を試せる幅が狭くなります.例えばKubernetesの機能を使って複数台あるWorker Nodeの内のある特定のWorker Nodeにコンテナをデプロイするということを試せません.なのでKubernetesの挙動を確かめたい時はkindの方が良いと思います.
#まとめ
kindを使用することで気軽にKubernetesの挙動を確認できます.なのでこれからKubernetesの挙動を確認したいときはkindを使っていこうと思います.
#参考
kind
kubeadm
minikube
Kubernetes ドキュメント
Kubernetes実践ガイド クラウドネイティブアプリケーションを支える技術 (impress top gear)