Klaster Kubernetes na Raspberry PI

Instalacja oparta jest o co najmniej dwa Raspberry PI 4, min. 4G RAM z zainstalowanym obrazem Ubuntu 20.04

Większość ustawień musi być wykonywane na każdym urządzeniu, które stworzą klaster.

Każde Raspberry powinno posiadać statyczny adres lub przydzielony na stałe DHCP.

Ustawienie nazwy na kontrolerze

$ sudo nano /etc/hostname
k8s-controller1

$ sudo nano /etc/hosts 
192.168.XX.XX k8s-controller1.jakas-domena.com.pl k8s-controller1 # nazwa domeny nie jest wymagana

$ sudo reboot

Zmiana nazwy na pozostałych PI które będą pracowały jako węzły (nody)

$ sudo nano /etc/hostname
k8s-node-01

$ sudo nano /etc/hosts 
192.168.XX.XX k8s-node-01.jakas-domena.com.pl k8s-node-01 # nazwa domeny nie jest wymagana

$ sudo reboot

Dodajemy nowe opcje bootowania na końcu linii w pliku

$ sudo nano  /boot/firmware/cmdline.txt
cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1 swapaccount=1

Aktualizacja pakietów

$ sudo apt update && sudo apt dist-upgrade -y
$ sudo reboot

Dla wygody możemy dodać swojego użytkownika na którym będziemy pracować

$ sudo adduser mojaNazwaUzytkownika
# Dodajemy go do grupy sudo
$ sudo usermod -aG sudo mojaNazwaUzytkownika

Instalacja Dockera i dodanie własnego utworzonego użytkownika do grupy docker

$ curl -sSL get.docker.com | sh
$ sudo usermod -aG docker mojaNazwaUzytkownika

Dodając do pliku opcje konfigurujemy demona Docker.

$ sudo nano /etc/docker/daemon.json

{
   "exec-opts": ["native.cgroupdriver=systemd"],
   "log-driver": "json-file",
   "log-opts": {
     "max-size": "100m"
   },
   "storage-driver": "overlay2"
 }

Włączamy routing odkomentowując linijkę #net.ipv4.ip_forward=1 w pliku /etc/sysctl.conf

$ sudo nano /etc/sysctl.conf
$ sudo reboot

Sprawdzamy czy Docker działa prawidłowo

$  sudo systemctl status docker
...
 Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2021-10-23 17:24:11 UTC; 59s ago
TriggeredBy: ● docker.socket
...

$ docker run hello-world
...
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
...
Hello from Docker!
This message shows that your installation appears to be working correctly.
...

Dodajemy repozytoria Kubernetes i dodajemy klucz GPG

 $ sudo nano /etc/apt/sources.list.d/kubernetes.list

deb http://apt.kubernetes.io/ kubernetes-xenial main

$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
OK

Instalacja Kubernetes

$ sudo apt update
 && sudo apt install kubeadm kubectl kubelet -y

Podczas instalacji czasem zdarzają się błędy. Gdy tak się zdarza powtarzamy ostatnie polecenie.

Teraz możemy zainicjalizować klaster wykonując poniższe na kontrolerze

$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16

Po uruchomieniu, na końcu otrzymasz dane wyjściowe, które będą zawierać polecenie kubeadm join wraz z tokenem. Zapisz je gdzieś. Będzie potrzebne przy dołączaniu węzłów. Jeżeli nasz token gdzieś się zagubi możemy go odzyskać wukonując na kontrolerze polecenie

kubeadm token create --print-join-command

Nadal tylko na kontrolerze uruchamiamy polecenia

$ mkdir -p ~.kube 
$ sudo cp /etc/kubernetes/admin.conf ~/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

Instalujemy sterowniki sieci na kontrolerze

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

po instalacji sterowników czekamy, czy wszystkie pody zostały uruchomione

$ kubectl get pods --all-namespaces

Wszystkie powinny mieć status Running. W przeciwnym wypadku czekamy chwile i powtarzamy powyższy test.

Możemy dołączać węzły robocze. Na każdym PI, który będzie pełnił taką funkcję uruchamiamy polecenie kubeadm join, które zapisaliśmy w czasie inicjalizacji klastra.

$ sudo kubeadm join 192.168.XX.XX:6443 --token xxxxxxx --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Sprawdzamy na kontrolerze czy nasze węzły robocze się dołączyły

$ kubectl get nodes
NAME              STATUS   ROLES                  AGE    VERSION
k8s-controller1   Ready    control-plane,master   65d    v1.22.1
k8s-node-01       Ready    <none>                 65d    v1.22.1
k8s-node-02       Ready    <none>                 2m1s   v1.22.2

Posted in Linux.