Site cover image

Site icon imageおかしんワークス

ビジネステクノロジーエンジニア @okash1n のブログです

ローカルでKubernetesクラスタを作ってみた

k8sの勉強用や、色んなOSSの管理ツールなどを動かしておくサーバー用として、ローカルにKubernetesのクラスタを組んでみました

構成

Image in a image block

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用

Image in a image block

Raspberry Pi4 ModelB 4GBを3台使います

Worker Node用

https://trigkey.com/products/speed-s11-16g-500g-11320h

Image in a image block
  • CPU: intel Core i5 11320H (4core/8thread)
  • RAM: DDR4 16GB
  • SSD: NVMe 500GB

実際にPodが動くマシンになるので、それなりの処理速度のものにしました。先月買った際はAmazonで一台4万円強で買えたのですが、今は品切れの模様。

最初はIntel Nucを検討したのですが、ベアボーンなのでメモリなども全部揃える必要があり、似たような構成にすると1台あたり8万くらいになってしまうので断念し、全部入りのミニPCを探すことにして、最終的にこれに落ち着きました。

ラッキング

建物ごと施錠しちゃうので、配線しやすく安いメタルラックにしちゃいました。

Image in a image block
Image in a image block

OSのインストール

ラズパイ

Ubuntuのインストール
Image in a image block

https://www.raspberrypi.com/software/

Raspberry Pi Imagerを使って3台ともUbuntu Server 22.0.4.2 LTSをインストールします

このアプリケーションが非常に優秀で、インストール時にホスト名やSSHの公開鍵なんかも全部設定できちゃいます。

Image in a image block

インストール終わって何もしていない状態で 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 をやっていたこともあり、めちゃくちゃ楽だなーと思いました。