Skip to main content

rpi5 cluster

rpi5 cluster에 microk8s 패키지를 설치해서 클러스터를 구성하는 방법을 알아보자.

  • 현재 rpi5 기기는 4대가 준비되어 있고, 구성은 master node 3대, worker node 1대로 구성하기로 함
  • 원래 5대였으나 1대는 집안에서 완벽하게 365일 전원이 들어오는 서버로 활용하려고 따로 빼놓음. 만약 이경우엔 master 3대, worker 2대로 구성했을 듯

https://ubuntu.com/tutorials/how-to-kubernetes-cluster-on-raspberry-pi ubuntu를 만든 캐노니컬에서 microk8s도 만들고 있기 때문에 아주 권장되는 조합이고 공식 매뉴얼에서도 라즈베리 몇대를 묶어 ubuntu + microk8s 를 설치하는 가이드를 찾을 수 있다.

우선 여러개의 터미널을 동시에 입력시킬 수 있는 앱 (여기서는 윈도에서 termius를 사용합니다)으로 4개의 터미널을 띄움

스크린샷 2026-01-03 225721.png스크린샷 2026-01-03 225721.png

이런 터미널 앱들은 기본적으로 모든 터미널에 같은 키보드 입력을 할 수 있는 기능이 있으므로 기본적인 업데이트나 k8s 설치를 동시에 진행하는 것이 편리합니다.

참고로 microk8s 를 설치할 것이기 때문에 docker 를 설치할 필요는 없어서 기본적인 업데이트 후 바로 snap으로 microk8s를 설치합니다.

apt update && apt upgrade

ubuntu와 rpi5의 조합에서는 microk8s를 설치하기 전에 몇가지 작업이 더 필요하다. /boot/firmware/cmdline.txt 에 cgroups를 활성화시켜 줘야 하고, 24.04 이전 버전의 경우 추가 패키지도 설치해야 한다. 자세한 내용은 여기 참조

sudo nano /boot/firmware/cmdline.txt

마지막 줄에 다음 내용 추가

cgroup_enable=memory cgroup_memory=1

이제 microk8s 설치

sudo snap install microk8s --classic # 자동 설치
sudo usermod -a -G microk8s $USER # sudo를 사용하지 않고 microk8s 를 조작할 수 있음
sudo chown -f -R $USER ~/.kube
su - $USER

microk8s status --wait-ready # 정상 서비스 상태가 될때까지 기다림

이제 편리한 alias 설정을 위해 bashrc 파일을 편집하자.

{
    echo alias kubectl="'microk8s kubectl'"
    echo alias kcd="'microk8s kubectl describe'"
} >> ~/.bashrc && \
source ~/.bashrc

위의 alias가 잘 동작하는지 확인 및 필요한 addon 활성화

kubectl get nodes
kubectl get pods
kubectl get services

microk8s enable ha-cluster # master node가 3대 이상일 경우 high availability cluster를 사용할 수 있으므로 addon 활성화

microk8s enable dashboard
microk8s enable dns
microk8s enable registry

이제부터는 클러스터 구성을 위해 전체 입력 가능한 기능을 끄고 개별적으로 입력하면 됩니다.

$ microk8s add-node
From the node you wish to join to this cluster, run the following:
microk8s join 192.168.1.42:25000/25da722579420c2e724751d3c4be5595/dbf58b806c46

Use the '--worker' flag to join a node as a worker not running the control plane, eg:
microk8s join 192.168.1.42:25000/25da722579420c2e724751d3c4be5595/dbf58b806c46 --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.1.42:25000/25da722579420c2e724751d3c4be5595/dbf58b806c46
microk8s join fd6c:2c0c:b217:3d0b:2ecf:67ff:fe93:8166:25000/25da722579420c2e724751d3c4be5595/dbf58b806c46

microk8s add-node 를 입력하면 각 노드를 클러스터로 묶기 위한 코드와 키를 확인할 수 있습니다. 이 키는 한번만 사용할 수 있기 때문에 노드를 추가할 때마다 실행해서 새로운 키를 받아야 합니다. 또한 포트는 25000을 사용하기 때문에 내부 네트웍이 아닌 외부에서 vm끼리 묶을 경우 25000번 포트를 방화벽에서 허용할 필요도 있습니다.

2번 및 3번 rpi는 master node로 추가할 것이기 때문에 --worker 옵션을 넣지 않고 join하면 됩니다.

$ microk8s join 192.168.1.42:25000/25da722579420c2e724751d3c4be5595/dbf58b806c46
WARNING: Hostpath storage is enabled and is not suitable for multi node clusters.

Contacting cluster at 192.168.1.42
Waiting for this node to finish joining the cluster. .. .. .. ..  
Successfully joined the cluster.

4번 rpi는 worker 노드로 join할 것이기 때문에 --worker 옵션을 추가합니다.

이 과정을 3번 반복하면 총 4대가 클러스터링이 됩니다. 이후 microk8s status 명령으로 상태를 확인하면 자동으로 ha-cluster 기능이 활성화된 것을 확인할 수 있습니다.

$ microk8s status
microk8s is running
high-availability: yes
  datastore master nodes: 192.168.1.42:19001 192.168.1.43:19001 192.168.1.44:19001
  datastore standby nodes: none
addons:
  enabled:
    dashboard            # (core) The Kubernetes dashboard
    dns                  # (core) CoreDNS
...