k8sの勉強用や、色んなOSSの管理ツールなどを動かしておくサーバー用として、ローカルにKubernetesのクラスタを組んでみました
構成
Control Plane用に冗長化したRaspberry Piを3台と、Workerノード用にintelアーキテクチャのミニPCを3台使用することにします。
192.168.200.0/27 (192.168.200.1 ~ 192.168.200.30) のネットワークを用意して、各マシンをDHCPで固定IPにして運用します
- control-0: 192.168.200.10
- control-1: 192.168.200.11
- control-2: 192.168.200.12
- worker-0: 192.168.200.20
- worker-1: 192.168.200.21
- worker-2: 192.168.200.22
Control Plane用
Raspberry Pi4 ModelB 4GBを3台使います
Worker Node用
https://trigkey.com/products/speed-s11-16g-500g-11320h
- CPU: intel Core i5 11320H (4core/8thread)
- RAM: DDR4 16GB
- SSD: NVMe 500GB
実際にPodが動くマシンになるので、それなりの処理速度のものにしました。先月買った際はAmazonで一台4万円強で買えたのですが、今は品切れの模様。
最初はIntel Nucを検討したのですが、ベアボーンなのでメモリなども全部揃える必要があり、似たような構成にすると1台あたり8万くらいになってしまうので断念し、全部入りのミニPCを探すことにして、最終的にこれに落ち着きました。
ラッキング
建物ごと施錠しちゃうので、配線しやすく安いメタルラックにしちゃいました。
OSのインストール
ラズパイ
Ubuntuのインストール
https://www.raspberrypi.com/software/
Raspberry Pi Imagerを使って3台ともUbuntu Server 22.0.4.2 LTSをインストールします
このアプリケーションが非常に優秀で、インストール時にホスト名やSSHの公開鍵なんかも全部設定できちゃいます。
インストール終わって何もしていない状態で ssh okash1n@control-0
だけでアクセスできたのはちょっと感動でした。
ミニPC
こちらからダウンロードして、ISOをUSBに入れてセットアップしました。
特に変わったことはしていません。
クラスタのセットアップ
ここから先は全6台のマシンに対して基本的には同じ設定を行っていきます。一部ラズパイとミニPCで違う部分があるので、そこだけは注意書きつけています。
OSの基本的な設定など
$ sudo apt update && sudo apt upgrade
$ sudo vim /etc/resolved.conf
*
*
LLMN=yes # 名前解決できるようにしておく
*
*
$ sudo apt install linux-modules-extra-raspi -y # ラズパイのみ
MicroK8sのセットアップ
MicroK8sはk3sのように簡単にKubernetesクラスタを作成するためのツールです。今回はマルチノード構成にするので、k3sではなくMicroK8sを採用しました。基本的には以下の手順に従って進めるだけです。(3台のマシンそれぞれに同じ作業を行います)
snapパッケージが提供されているので以下のコマンドでインストールします。全マシンのバージョンを揃えるために、明示的にバージョンを指定してインストールしています。
また、MicroK8sではkubectl
のコマンドがmicrok8s.kubectl
になっているので、めんどくさいのでエイリアスにしておきます
$ sudo vim /boot/firmware/cmdline.txt # ラズパイのみ
cgroup_enable=memory cgroup_memory=1 を一番うしろに追記
$ cat /boot/firmware/cmdline.txt
console=serial0,115200 dwc_otg.lpm_enable=0 console=tty1 root=LABEL=writable rootfstype=ext4 rootwait fixrtc quiet splash cgroup_enable=memory cgroup_memory=1
$ sudo snap install microk8s --classic --channel=1.27/stable
$ sudo snap alias microk8s.kubectl kubectl
$ sudo usermod -a -G microk8s $USER
$ sudo chown -f -R $USER ~/.kube
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
control-0 Ready <none> 10s v1.27.2
$ microk8s.status --wait-ready
microk8s is running
high-availability: no
datastore master nodes: 127.0.0.1:19001
datastore standby nodes: none
addons:
enabled:
ha-cluster # (core) Configure high availability on the current node
helm # (core) Helm - the package manager for Kubernetes
helm3 # (core) Helm 3 - the package manager for Kubernetes
disabled:
cert-manager # (core) Cloud native certificate management
community # (core) The community addons repository
dashboard # (core) The Kubernetes dashboard
dns # (core) CoreDNS
host-access # (core) Allow Pods connecting to Host services smoothly
hostpath-storage # (core) Storage class; allocates storage from host directory
ingress # (core) Ingress controller for external access
kube-ovn # (core) An advanced network fabric for Kubernetes
mayastor # (core) OpenEBS MayaStor
metallb # (core) Loadbalancer for your Kubernetes cluster
metrics-server # (core) K8s Metrics Server for API access to service metrics
minio # (core) MinIO object storage
observability # (core) A lightweight observability stack for logs, traces and metrics
prometheus # (core) Prometheus operator for monitoring and logging
rbac # (core) Role-Based Access Control for authorisation
registry # (core) Private image registry exposed on localhost:32000
storage # (core) Alias to hostpath-storage add-on, deprecated
ユーザー追加したあとSSHの一度接続切ってつなぎ直しておきます。
ノードを追加していく
ここまでの設定で、6台のマシンがそれぞれ独立してkubernetesを動かしている状態なので、クラスタを構成していきます。
まずはコントロールプレーンのうち1台(今回はcontrol-0)でノード追加のためのトークンの発行を行っていきます
microk8s add-node
From the node you wish to join to this cluster, run the following:
microk8s join 192.168.200.10:25000/77f70edc0e599b3d49c771605a2e0a4f/10ac13ae30d5
Use the '--worker' flag to join a node as a worker not running the control plane, eg:
microk8s join 192.168.200.10:25000/77f70edc0e599b3d49c771605a2e0a4f/10ac13ae30d5 --worker
If the node you are adding is not reachable through the default interface you can use one of the following:
microk8s join 192.168.200.10:25000/77f70edc0e599b3d49c771605a2e0a4f/10ac13ae30d5
このコマンドは実行する度に新しいトークンを発行し、ノード追加のためのコマンドを生成してくれます。実行結果の中で --workder
オプションがついているものがWorker Node用で、ついていないものがコントロールプレーン用となるので、「control-0でトークン発行⇒追加するマシンでコマンド実行」を繰り返します。
control-1, control-2
$ microk8s join 192.168.200.10:25000/77f70edc0e599b3d49c771605a2e0a4f/10ac13ae30d5
worker-0, worker-1, worker-2
microk8s join 192.168.200.10:25000/77f70edc0e599b3d49c771605a2e0a4f/10ac13ae30d5 --worker
ノードが追加できたことを確認
controlのどれかで確認していきます
$ microk8s status
microk8s is running
high-availability: yes
datastore master nodes: 192.168.200.10:19001 192.168.200.11:19001 192.168.200.12:19001
datastore standby nodes: none
addons:
enabled:
ha-cluster # (core) Configure high availability on the current node
helm # (core) Helm - the package manager for Kubernetes
helm3 # (core) Helm 3 - the package manager for Kubernetes
disabled:
cert-manager # (core) Cloud native certificate management
community # (core) The community addons repository
dashboard # (core) The Kubernetes dashboard
dns # (core) CoreDNS
host-access # (core) Allow Pods connecting to Host services smoothly
hostpath-storage # (core) Storage class; allocates storage from host directory
ingress # (core) Ingress controller for external access
kube-ovn # (core) An advanced network fabric for Kubernetes
mayastor # (core) OpenEBS MayaStor
metallb # (core) Loadbalancer for your Kubernetes cluster
metrics-server # (core) K8s Metrics Server for API access to service metrics
minio # (core) MinIO object storage
observability # (core) A lightweight observability stack for logs, traces and metrics
prometheus # (core) Prometheus operator for monitoring and logging
rbac # (core) Role-Based Access Control for authorisation
registry # (core) Private image registry exposed on localhost:32000
storage # (core) Alias to hostpath-storage add-on, deprecated
$ kubectl get node
NAME STATUS ROLES AGE VERSION
worker-1 Ready <none> 1h v1.27.2
control-2 Ready <none> 1h v1.27.2
control-1 Ready <none> 1h v1.27.2
worker-2 Ready <none> 1h v1.27.2
worker-0 Ready <none> 1h v1.27.2
control-0 Ready <none> 1h v1.27.2
これで、冗長化されたControl Planeと3台のWorker Nodeを持つk8sクラスタが完成しました。まだローカルでしか動いていないので、今後は外部からもアクセスできるようにしたりしたいと思います。
MicroK8sは初めて使いましたが、直前に kubernetes-the-hard-way をやっていたこともあり、めちゃくちゃ楽だなーと思いました。