😄

おうちKubernetes Clusterを構築してみた

2021/01/02に公開

おうち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さんからいただいた下記の情報を元に設定を行いました。ありがたや・・・!

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
GitHubで編集を提案

Discussion