Kubernetes in Docker こと kind の環境構築
Kubernetesの基本については完全に理解したので、実際に触っていろいろやってみたくなりました
そこで実際に環境構築するうえで取れる手段は以下の3つくらいかなぁと
- Google Kubernetes Engine や Amazon EKSなんかのパブリッククラウドで使う
- Raspberry Pi なんかの安価なPC複数台で実際に作ってみる
- 学習用のツールを使う
1は多少とはいえ料金発生しちゃいますし、2は初期投資額がでかい
もちろんそのくらい払えやってのはあるんですがある程度使えるようになるまでは安く済ませたい
ということで、3の学習用ツールに目を付けました
ツールもいろいろあるんですが、後述の通り機能面に若干の不満が
そこで最近知った kind を使って環境構築してみましたので以下まとめ
kind とは
Kubernetes IN Dockerの略称
k8sをローカルで構築しテストするためのツールの一つ
Windows,Mac,Linuxに対応
k8s公式もこれを使ってテストしてるらしい
他のツールとの相違点
kind以外にもminikubeなんかがある
kind最大の特徴はマルチノードクラスタが作成可能な点
k8sでは、複数のノードが参加して一つのクラスタを構成するのが一般的
しかし、他のツールではシングルノードクラスタしか構成できず、限られた機能しか使うことができなかった
kindはマルチノードクラスタが作成可能なため、全てではないがより多くの機能を使用可能
kindの仕組み
kindでは、各ノードとして動作するdockerコンテナをデプロイしてクラスタを構成する
デフォルトで提供されているコンテナは、Ubuntu18.04を元に必要ないサービスを削除してサイズを小さくしたイメージ「node-image」を使用
自身で用意したイメージを使用して構成することもできる
Quick Start
今回はVMwareの仮想マシン上にマルチノードクラスタを作成し、nginxをデプロイするとこまでやってみます
仮想マシンはUbuntu18.04.3で、メモリ8GB、CPU4コアで動かしてます
メモリは公式によると最低8GB必要で、コア数についての記述は見つかりませんでしたがマルチノードクラスタなら4コアはあげといたほうが無難かと
kindのインストール準備
kindインストールの前に、docker、kubectl、Go言語を使用可能にする必要がありますのでまずはそっちから
とりあえずcurl
とgcc
が必要になるので入れておきましょう
$ sudo apt install -y curl gcc
1. dockerのインストール
dockerはapt install
で
$ sudo apt install -y docker.io $ docker -v Docker version 18.09.7, build 2d0083d $ sudo usermod -aG docker suzkor
最後に、dockerグループにユーザーを追加します
これでdockerは準備完了
グループ変更したので、一回再起動しておきます
2. kubectlのインストール
公式のドキュメントを参考にいれて行きます
$ sudo apt-get update && sudo apt-get install -y apt-transport-https $ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - $ echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list $ sudo apt-get update $ sudo apt-get install -y kubectl $ kubectl version Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.3", GitCommit:"2d3c76f9091b6bec110a5e63777c332469e0cba2", GitTreeState:"clean", BuildDate:"2019-08-19T11:13:54Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"} The connection to the server localhost:8080 was refused - did you specify the right host or port?
サーバーと通信できてないというエラーは出てますが、まあそんなものはないので当然
これでkubectlの準備もできました
3. Go言語のインストール
$ curl -O https://dl.google.com/go/go1.12.9.linux-amd64.tar.gz $ sudo tar -C /usr/local -xzf go1.12.9.linux-amd64.tar.gz $ export PATH=$PATH:/usr/local/go/bin $ export PATH=$PATH:$(go env GOPATH)/bin
最後の2行は起動時毎回必要なので .profile
にでも記載しておきましょう
これでGoの準備もできたので、kindを入れていきます
kindのインストール
以下のコマンドですんなり入ります
$ GO111MODULE="on" go get sigs.k8s.io/kind@v0.5.0 $ kind version v0.5.0
これでインストール完了です
クラスタ作成
kind create cluster Creating cluster "kind" ... ✓ Ensuring node image (kindest/node:v1.15.3) 🖼 ✓ Preparing nodes 📦 ✓ Creating kubeadm config 📜 ✓ Starting control-plane 🕹️ ✓ Installing CNI 🔌 ✓ Installing StorageClass 💾 Cluster creation complete. You can now use the cluster with: export KUBECONFIG="$(kind get kubeconfig-path --name="kind")" kubectl cluster-info $ export KUBECONFIG="$(kind get kubeconfig-path --name="kind")" $ kubectl get nodes NAME STATUS ROLES AGE VERSION kind-control-plane Ready master 96s v1.15.3
作成後、言われた通りのコマンド実行するとkubectl
が通るようになります
見てみると、シングルノードで動いてるのがわかります
というわけでテストはおk 作ったクラスタを削除しましょう
$ kind delete cluster
次は実際にマスター1、ワーカー2のクラスタ作ってみましょう
まずはYAMLでクラスタの設定ファイル作ります
kind: Cluster apiVersion: kind.sigs.k8s.io/v1alpha3 nodes: - role: control-plane - role: worker - role: worker extraPortMappings: - containerPort: 30000 hostPort: 80
これでマスターノード(control-plane)とワーカーノード(worker)2つが作られます
extraPortMappingsを設定しておくと、ホストとノードコンテナのポートフォワーディングが設定できます
動作としてはdocker run
の-p
オプションとおんなじだと思う
コンテナポートが30000なのは後で説明します
$ kind create cluster --config kind-example.yaml Creating cluster "kind" ... ✓ Ensuring node image (kindest/node:v1.15.3) 🖼 ✓ Preparing nodes 📦📦📦 ✓ Creating kubeadm config 📜 ✓ Starting control-plane 🕹️ ✓ Installing CNI 🔌 ✓ Installing StorageClass 💾 ✓ Joining worker nodes 🚜 Cluster creation complete. You can now use the cluster with: export KUBECONFIG="$(kind get kubeconfig-path --name="kind")" kubectl cluster-info $ kubectl get nodes NAME STATUS ROLES AGE VERSION kind-control-plane Ready master 2m30s v1.15.3 kind-worker Ready <none> 113s v1.15.3 kind-worker2 Ready <none> 113s v1.15.3
お手軽にマルチノードクラスタができましたね、素晴らしきかな
お次はnginxをデプロイしてみましょう
YAMLでマニフェストを作成します
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deplpoy spec: selector: matchLabels: app: nginx replicas: 1 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-svc spec: type: NodePort ports: - port: 80 nodePort: 30000 #NodePortのため30000~32767 selector: app: nginx
テスト用なので、とりあえずレプリカ数は1で
ServiceはNodePortでやるので、デフォルトだと30000~32767のポートしか使えません
おとなしく30000にしときましょう 先ほどホストとマッピングしたポートに合わせてください
出来上がったらあとはk8sに丸投げして少し待ったらcurlでホストから確認してみましょう
$ kubectl apply -f nginx-conf.yaml deployment.apps/nginx-deplpoy created service/nginx-svc created $ curl localhost <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
nginxうごいてる! すごい! らくちん!
しばらくはこれ使ってk8s勉強したいとおもいます