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