おうちKubernetes Clusterを構築してみた
おうちKubernetes Cluster構築してみた
概要
今まではminikubeと戯れてたのですが、お家で好きに触れるKubernetes Clusterが欲しいな、と思ってたので年末年始を利用して構築してみました!
目次
- 本編
- Kubernetesとは??
- Kubernetesを構成するコンポーネント
- おうちkubernetes clusterの材料
- ざっくり構成
- ざっくりレシピ
- ちゃんとしたレシピ
- Proxmox(ハイパーバイザー)を物理マシンにインストールする
- VMを作成し、ubuntuをインストールする
- containerdをインストールする
- kubeadm、kubelet、kubectlをインストールする
- kubeadmでkubernetes clusterを構築する
- calicoをデプロイする
- 動作確認
- まとめ
- よかったこと
- 今後さらにやってみたいこと
- その他
本編
Kubernetesとは??
コンテナーをよしなにオーケストレーションしてくれるツールです!詳しくはKubernetesとは何かをご参照ください!
Kubernetesを構成するコンポーネント
公式様のイメージがわかりやすかったので拝借しました。こんな感じになっています。
画像引用元:https://kubernetes.io/ja/docs/concepts/overview/components/
おうちkubernetes clusterの材料
ざっくりと、こんな材料で作ってます。
-
物理マシン2台
intel NUC (BXNUC10I5FNH) 二台。一台あたり、メモリ32GB、SSD500GBくらいです。 -
ターミナル操作用のノートPC1台
-
LANケーブル適量
-
スイッチングハブ1台
ざっくり構成
-
Hyper Visor
- proxmox 6.3
-
OS
- ubuntu 20.04 LTS
-
Middleware
-
kubernetes 1.20.1
-
containerd 1.4.3
CRI(高レベルランタイム)としてcontainerdを使用しました。kubernetes 1.20以降は
コンテナランタイムでdockerを使用することは非推奨
とのことなので、containerdを使用しました。containerdはDockerでコンテナランタイムとして使用されています。containerdでも普通にdocker imageは使えます。containerdについて詳しくは、公式サイトを参照お願いします。CRI-Oもどこかで試してみたいな・・・。 -
calico
CNIとしてcalicoを採用しました。
コンテナネットワーキング(CNI)最前線を参考にさせていただきました。flannelもあるらしいので、どこかで試したい気がする。
-
ざっくりレシピ
とてもざっくりしていますが、こんな感じです。
- Proxmox(ハイパーバイザー)を物理マシンにインストールする
- VMを作成し、ubuntuをインストールする
- containerdをインストールする
- kubeadm、kubelet、kubectlをインストールする
- kubeadmでkubernetes clusterを構築する
- calicoをデプロイする
ちゃんとしたレシピ
書いててわかったのですが、ほぼ公式ドキュメントにしたがっていい感じにできました。ドキュメントが読めるようになるまで成長しているのがちょっと嬉しいです。
Proxmox(ハイパーバイザー)を物理マシンにインストールする
リソース余ったらいい感じに別のものを載せたい&よくやらかすのでスナップショットが取れると嬉しい、という想いからハイパーバイザーを入れてます。
WEB GUI+debianベースで操作がしやすくてOSSである、Proxmox Virtual Environmentを入れました。スナップショットももちろん良いんだけど、NAS買ってバックアップもしたいなぁ・・・。インストール方法はProxmoxVEのセットアップと利用 - Qiitaを参考にさせていただきました!
なお、proxmoxはつよつよな@shinkolabさんから教わりました!ありがとうございます!!
VMを作成し、ubuntuをインストールする
VMの作成方法はこちらを参考にしました。
先ほどと同じく@shinkolabさんからいただいた下記の情報を元に設定を行いました。ありがたや・・・!
- Proxmox VE 6.1の初期設定
- How to: Remove “You do not have a valid subscription for this server….” from Proxmox Virtual Environment/Proxmox VE (PVE 6.1-2,6.1-7,6.2-4,6.2-11,6.2-12 6.2-15 6.3-2)
containerdをインストールする
CRIのインストールを参考にインストールしました。今回はCRI(コンテナランタイム)としてcontainerdを採用しました。containerd以外のコンテナランタイムとしては、docker(※)、CRI-Oがあります。
※kubernetes 1.20以降はコンテナランタイムとしてのdockerが非推奨となりました。詳細はこちらをご参照ください。
kubeadm、kubelet、kubectlをインストールする
kubeadm、kubelet、kubectlのインストールを参考にしました。バージョンは1.20.1を使用しています。
kubeadmでkubernetes clusterを構築する
今回は1Master、1Workerの組み合わせだったので、kubeadmを使用したシングルコントロールプレーンクラスターの作成を参考にしました。HAで組むのであればkubeadmを使用した高可用性クラスターの作成を参考にしてください。
calicoをデプロイする
CNIとして、公式ドキュメントにしたがい、caliloをkubernetes clusterにデプロイしました。
動作確認
-
準備
ターミナル操作用のノートPCでkubectlを操作したいので、まずはmaster nodeにある
/etc/kubernetes/admin.conf
をターミナル操作用のノートPCに$HOME/.kube/config
としてscpで配置します。 -
dockerがインストールされていないことの確認
$ docker version Command 'docker' not found, but can be installed with: sudo snap install docker # version 19.03.11, or sudo apt install docker.io # version 19.03.8-0ubuntu1.20.04.1 See 'snap info docker' for additional versions. $
-
kubernetes nodeの確認
containerdをコンテナランタイムにして、kubernetes nodeが
Ready
状態になっているのでうまくできているようです。$ kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME k8s-master Ready control-plane,master 8h v1.20.1 [IPADDRESS1] <none> Ubuntu 20.04.1 LTS 5.4.0-58-generic containerd://1.4.3 k8s-worker Ready <none> 8h v1.20.1 [IPADDRESS2] <none> Ubuntu 20.04.1 LTS 5.4.0-58-generic containerd://1.4.3 saw@k8s-worker:~$
-
dockerがインストールされてなくてもdocker imageを使ってpodが問題なく作成されることを確認
下記はnginxのpodを作成していますが、
--image=nginx
オプションでは、podで使用するコンテナイメージとして、dockerhubにあるnginx:latestのdockerイメージを使用しています。(podの中に、コンテナーがある感じです。)$ kubectl run nginx --image=nginx --restart=Never pod/nginx created $ kubectl get pods NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 10m $
まとめ
kubernetes v1.20.1をcontainerdをつかって構築できました!kubernetesでは、dockerがインストールされてなくてもdockerイメージは使えました。
よかったこと
構築してはじめて勉強になる部分が多かったです。ドキュメント読むだけだと頭にはいっていかなくて・・・。
-
kubeadmで構築する際に、CRIとCNIとは何か、何を使用するのかを意識できました。
kubernetes公式ドキュメントももちろんのこと、イラストでわかるDockerとKubernetesもとても参考にさせていただきました! -
kubeadm initとkubeadm joinの違いがわかりました。
-
おうちkuberntes clusterをてにいれられて純粋に嬉しいです。
ハイパーバイザーを導入してみてよかったこともありました。
- バックアップもスナップショットも取れるので、安心してやらかせますw
- オーバーコミットの概念を知りました。
1サーバー1VMとするとき、ハイパーバイザーでもサーバーのリソースは食うはずなので、VMへのリソースの割り当ては最大どこまでできるのか純粋にわからなかったのですよね。お恥ずかしながら。オーバーコミットの概念は、オーバーコミットとはがとても参考になりました!
今後さらにやってみたいこと
-
vlanをきりたい
おうちのホームネットワークとラボ用ネットワークを分けたかったのですが、設計考えているだけでも時間かかりそうだったので、いったんホームネットワークと同じネットワークにしました。ゆくゆくは分けたいです。
-
VPNはりたい
自宅ラボへのVPNをはることで、お外からおうちのkubernetes clusterがいつでも愛でられます・・・!最高です・・・!
-
Ansible化したい
一応定期的に破壊できるようにしましたが、お勉強もかねてAnsible化したいですね。
-
Worker nodeがもう一台欲しい
クラスター感がないので、せめてもう1 worker node欲しいです。nucをお財布と相談で、もう一台追加しましょうかね・・・。
-
永続領域を作成したい
proxmoxの昨日でcephがボタンぽちーで作成できるっぽいので、やってみたいですね。まずcephのお勉強からですね。NASでも永続領域ができるのでしょうか。NASも欲しいですね!!
-
CI/CD欲しい
個人的な興味ですが、やってみたいですね!
-
ログ管理収集基盤を構築したい
個人的な興味でELK Stackをやってみたいです・・・!
-
監視基盤を構築したい
個人的な興味で、zabbixを入れてみたいです・・・!
-
kubeadmにだいぶ任せたので、kubeadm initで行う内容をもう少し理解したい
kubernetesの公式ドキュメントみつつ、kubernetes the hard wayがよいんでしょうかね。
その他
実はkubesprayで最初構築したのですが、kubernetes v1.20に対応してなかったのでkubeadmで構築しなおしました。
構築したkubernetes clusterを削除するコマンドをメモっておきます。この辺をmaster、workerでやるといい感じでした。失敗したときのおともにどうぞ。
kubectl drain <node name> --delete-local-data --force --ignore-daemonsets
kubectl delete node <node name>
kubeadm reset(対象ノード全部)
sudo rm -rf /etc/kubernetes
rm ~/.kube/config
Discussion