k3s i Raspberry Pi 4, czyli taki mały własny Kubernetes

Kilka razy w odpowiedziach z ankiet i pytaniach subskrybentów Poznaj Kubernetes przewijał się temat k3s, jak i instalacji Kubernetes na Raspberry Pi. Post ten jest połączeniem tych dwóch zagadnień, ponieważ idealnie się łączą.

Czym jest k3s?

Jest to lekka wersja Kubernetes, korzystając z SQLite jako bazy danych zamiast etcd. Jest ona również okrojona z niepotrzebnych integracji z chmurami, czy też różnego rodzaju sterowników. Dodatkowo w przeciwieństwie do pełnego Kubernetes, k3s przychodzi w postaci jednego pliku wykonywalnego i w komplecie ze wszystkimi potrzebnymi dodatkami takimi jak containerd (zamiast docker), flannel do sieci, skonfigurowany CoreDNS oraz traefik jako ingress controller.

Architketura k3s

Jeśli jest ciekaw perspektywy architektonicznej na używanie Kubernetes to możesz przesłuchać podcast, który nagrałam razem z Szymonem Wardą na ten temat.

Do czego można użyć k3s?

Tak zwany Internet of Things, Edge computing, ale również być używanym w procesach CI. Ze względu na lekkość, może też służyć do nauki i hobbystycznych projektów. Ja sam wykorzystuje go właśnie w tym ostatnim celu, używając go na Raspberry Pi.

Jeśli chodzi o Raspberry Pi, to używam wersji 4B, ale można też 3B. Nadaje się ona idealnie, ponieważ można kupić ją w wariancie z 2GB pamięci, albo nawet i 4GB. Tę ostatnią wersję polecam, bo im więcej RAMu, tym lepiej.

Instalacja Kubernetes(k3s) na Raspberry Pi

Pierwszym krokiem jest instalacja systemu na naszej malince. Poradników jest dużo w tym oficjalny, którego najlepiej użyć. System, jaki jest potrzebny, to najnowsza wersja Raspbian Lite. Wersja Lite wystarczy dlatego, że jest to serwer i nie potrzebujemy mieć odpalonego GUI.

Jeśli tak jak ja, nie chcesz bawić się w podłączanie klawiatury i ekranu, żeby od razu uruchomić działający serwer ssh, to sprzedam Ci prosty trick. Wystarczy utworzyć na karcie SD pusty plik o nazwie ssh. Dzięki temu przy pierwszy starcie serwer ssh włączy się sam. Jeśli korzystasz z wifi do dostępu do sieci, to tu znajdziesz odpowiedź jak dodać plik z konfiguracją sieci na karcie SD.

Po uruchomieniu z nowym systemem Malina w sieci rozgłosi się z nazwą raspberrypi.local, więc do takiego hosta trzeba nawiązać sesje ssh.

Kiedy już jesteśmy na serwerze (brzmi dumnie dla takiego małego urządzenia) należy włączyć potrzebne rzeczy w jądrze. W tym celu należy dodać do pliku /boot/cmdline.txt do końca linii (nie w nowej!!!) następujący wpis:

cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory

Potem instalacja aktualizacji i restart.

Instalacja aktualizacji Raspbian

Teraz już czas na instalację k3s. To tylko jedna komenda!

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--no-deploy servicelb" sh -s -

Po niej można sprawdzić, czy k3s działa. Uwaga! Pierwszy start zajmuje dłuższą chwilę!

sudo systemctl status k3s

Jeśli wszystko uruchomiło się poprawnie, to za pomocą kubectl można sprawdzić, czy Kubernetes odpowiada.

Status węzłów w kubectl

Ostatnia rzecz do wykonania jest instalacja MetalLB. Jest to projekt dla Kubernetes, który pozwala w różny sposób uruchomić własny wbudowany Load Balancer w klaster. Tak, żeby zachowywał się tak samo, jak w chmurze, ale lokalnie! Przez takie samo zachowanie rozumiemy wystawianie usług pod dedykowanymi adresami IP oraz pełną integracją Kubernetes (działający serwis typu LoadBalancer lokalnie).

Na start trzeba zainstalować MetalLB. Wykonujemy to poprzez umieszczenie pliku z manifestem Kubernetes w odpowiednim miejscu na dysku. k3s dogląda tej lokalizacji i wdraża takie manifesty. Instalujemy zgodnie z dokumentacja MetalLB.

Teraz należy dodać konfigurację naszej sieci. Dokładnie to puli adresów IP, z jakich ma korzystać nasz Kubernetes na RPi. MetalLB konfigurujemy za pomocą ConfigMap w K8s. Poniżej przykład mojej, u Ciebie może być inna adresacja sieci:

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: pod-ralm
      protocol: layer2
      addresses:
      - 192.168.1.80-192.168.1.89

Tak przygotowaną konfigurację zapisujemy w pliku config.yaml i wrzucamy ją do Kubernetes.

sudo kubectl apply -f config.yaml

Pozostaje teraz wdrożyć testową aplikację. Może być to na przykład nginx.

sudo kubectl create deployment nginx --image=nginx

Oraz opublikować tę aplikację na świat.

sudo kubectl expose deployment nginx --type=LoadBalancer --name=nginx --port=80

Za kilka chwil będzie można się połączyć do usługi na wystawionym adresie IP.

Działająca wystawiona usługa poza k3s

To by było na tyle jeżeli chodzi o instalacje Kubernetes.

Jeżeli podoba Ci się post jak powyżej, to co piątek staramy się wysyłać wcześniej niepublikowane wpisy na temat Kubernetes i konteneryzacji aplikacji. Zapisz się poniżej do Newslettera!