Kubernetes na Raspberry Pi – Deo I

U ovom blogu ćemo videti kako možemo napraviti sopstveni klaster zasnovan na Raspberry Pi 3b računarima i Kubernetes-u. Prvi deo bloga će biti posvećen konfiguraciji mreže i Raspberry Pi-jeva dok ćemo u drugom delu instalirati sve popularniji Kubernetes klaster menadžer.

Uvod

Kubernetes ukratko

Kubernetes je platforma otvorenog koda dizajnirana za automatizaciju operacija sa kontejnerima. On uklanja potrebu za ručnim procesima oko raspoređivanja i skaliranja aplikacija u kontejnerima. Drugim rečima, moguće je grupisati nekoliko računara u klaster koji radi sa kontejnerima i Kubernetes će nam pomoći da lako i efikasno upravljamo njima. Klasteri mogu biti konfigurisani iz javnih, privatnih ili hibridnih cloud-ova. Neki osnovni pojmovi koji se upotrebljavaju kada govorimo o Kubernetesu:

  • Master – mašina koja upravlja nodovima. Od nje proizilaze svi zadaci ka nodovima.
  • Nod – mašina ili mašine koje obavljaju dodeljene zadatke. Njima upravlja master.
  • Pod – grupa od jednog ili više kontejnera deploy-ovanih na jendom nodu. Svi kontejneri u podu dele IP adresu, IPC, hostname i druge resurse. Oni prave apstrakciju mreže i skladišta od njihovih kontejnera. To nam je od značaja kako bi lakše manipulisali kontejnerima.
  • Replikacioni kontroler – upravlja o tome koliko identičnih kopija podova je pokrenuto na klasteru.
  • Servis – omogućava da poslovi dolaze do pravih podova bez obzira gde se oni nalaze u klasteru.
  • Kubelet – servis koji funkcioniše na nodovima i omogućava da kontejneri na njima budu pokrenuti i funkcionalni.
  • Kubectl – alat komandne linije za upravljanje Kubernetesom.
Kubernetes infrastruktura
Kubernetes infrastruktura

Kubernetes se instalira na mašinama u sloju iznad operativnog sistema. On interaguje sa podovima koji su pokrenuti na nodovima. Kubernetes master preuzima komande od administratora i raspodeljuje poslove po nodovima. Da bi ovo funkcionisalo Kubernetes poseduje servise koji automatski detektuju i odlučuju za koji nod je najbolje prilagođen posao. Tada alocira resurse i dodeljuje posao podu, zahtevajući od njega da ga odradi. Sa pogleda infrastrukture malo toga se razlikuje od načina kako se do sada baratalo sa kontejnerima. Kontrola nad kontejnerima je sada na višim nivoima i omogućuje nam da ne brinemo o sitnijim stvarima kao što su dodela kontejnera nodovima i slično. Potrebno je odraditi određeni deo posla, uglavnom vezan za konfigurisanje Kubernetes mastera, definisanje nodova i podova.

Šta je sa Docker-om?

Docker tehnologija i dalje radi ono za šta je namenjena. Kada Kubernetes dodeli pod nodu, kubelet tog noda daje instrukciju Docker-u da pokrene navedeni kontejner. Kubelet onda nastavlja da kupi informacije o kontejnerima od strane Docker-a i prosleđuje ih masteru. Docker stavlja kontejnere na određeni nod, pokreće ih i stopira normalno. Razlika u tome je što sada automatizovani sistem vrši zahteve za Docker za razliku od ranije što je činio administrator ručno. Za više informacija o Docker-u i Kubernetes-u pročitati blog Docker i Kubernetes.

Neophodno za projekat

Za implementaiju Kubernetesa postoji više opcija. Moguće je pokrenuti ga kao servis na Google, Azure ili nekom trećem cloud sistemu, na virtualnim mašinama PC računara, ili napraviti sopstveni klaster. Mi ćemo, za potrebe ovog projekta, odabrati najzanimljiviju, treću konfiguraciju. Definitivno najpovoljniji način upuštanja u ovakav pohod pružaju nam mikrokontroleri. Koji bolje da odaberemo od očito sveomogućeg Raspberry Pi 3b modela. Njegova ARM arhitektrura procesora nam pruža nisku potrošnju od oko 5w, ali i pojedina ograničenja oko dostupnog softvera za njegovu arhitekturu. Uz to poseduje 4 jezgra i 2gb rama što je sasvim dovoljno za ovakvu konfiguraciju. Prednost celog sistema je i da je portabilniji od klasičnih klastera, moguće ga je demonstrirati na različitim konvencijama. Takođe odlična je platforma za “igranje” i isprobavanje stvari, tako da je za akademske svrhe to pravi izbor. Što se tiče softvera postoje razna druga rešenja pored Kubernetes-a. Tu su Docker Swarm, Mesos, OpenStack, Hadoop YARN, Nomad… Nama je neophodno da sistem bude:

  • Lagan – kako bi mogao raditi na RPI računarima,
  • ARM kompatibilan – jer je RPI zasnovan na ARM arhitekturi,
  • Opšte primene – Hadoop i Apache Spark su odlični sistemi za analizu podataka,
  • Spreman za široku primenu – ok, iako je Kubernetes kao sistem dovoljno razvijen da se koristi, naš sistem zasnovan na RPI računarima i ARM arhitekturi ipak možda neće zahtevati ovu stavku.

Kubernetes nam pruža sve gore navedeno i validan je konkurent Docker Swarm-u.

Hardver

Hardverska konfiguracija projekta može da varira ali nam je potrebno da imamo:

Količina Deo Cena
3 Raspberry Pi 3b ~65000RSD
3 Micro SD (8-16GB) ~1500RSD
3 USB napajanja ~1500RSD
1 WLAN ruter ~3000RSD
Opciono
3 Kućište za RPI 3b ~1000RSD
4 LAN kabal ~300RSD
1 Multistack kućište za RPI ~2000RSD
1 100MB Switch ~1500RSD

Naravno, potrebno je imati pristup računaru sa Linux operativnim sistemom i internet konekciju. Tastatura, miš i monitor za Raspberry Pi uređaje nam neće biti neophodni.

Softver

Od softvera će nam, bar za početak, trebati da pribavimo:

Naziv Link
HypriotOS https://github.com/hypriot/image-builder-rpi/releases
Flash https://github.com/hypriot/flash
Ansible https://github.com/hypriot/flash

Priprema projekta

Pre nego što počnemo sa samim projektom potrebno je da konfigurišemo sav prikupljeni hardver i softver. U zavisnosti od količine hardvera kojom raspolažemo i ciljeva koje želimo postići, postoji više opcija za hardversku konfiguraciju:

  • Da li želimo žičanu ili bežičnu konekciju Raspberry ploča,
  • Da li želimo da ih povežemo na svič ili želimo koristiti ugrađeni ruterov svič,
  • Da li želimo žičanu ili bežičnu konekciju rutera na internet i laptopa na ruter,
  • itd.

Korišćenje bežične mreže može imati svoje prednosti. Naime integrisan čip na Raspberry Pi-ju koji služi za bežično povezivanje nije povezan sa USB magistralama tako da ne zauzima protok ulazno izlaznih uređaja. Takođe manje kablova znači da će sistem lepše izgledati. Kako nama nije bitno da vodimo računa o navedenim stavkama, a bitnije nam je da veza bude stabilna, odabraćemo konfiguraciju prikazanu na slici a objašnjenu u daljem tekstu.

Konfigurisanje mreže

Prvo je potrebno prikačiti ruter na internet vezu sa LAN kablom i to vezu sa internetom uključiti u WAN ulaz na ruteru kako bi preko njega bili povezani na internet. Zatim povezati naša tri Raspberry Pi računara na LAN izlaze iz rutera kako bi imali konekciju na internet i bili povezani u svoju lokalnu mrežu. Sve ovo je moglo biti odrađeno i bežičnim vezama u zavisnosti od mogućnosti našeg rutera. Radi stabilnije veze i jednostavnosti odabraćemo žičano povezivanje. Dalje je potrebno konfigurisati naš novi ruter da ima statičku IP adresu. Ovo ćemo učiniti tako što ćemo pristupiti podešavanjima našeg postojećeg rutera (u mom slučaju SBB ruter) unošenjem njegove podrazumevane lokalne IP adrese u pretraživač (192.168.0.1 za SBB ukoliko nismo promenili podešavanje). Zatim pronaći opciju DHCP Server (Dynamic Host Configuration Protocol) i omogućiti je.

Nakon toga treba pronaći MAC adresu novog rutera (media access control – jedinstvenu hardversku adresu za svaki uređaj na internetu) u konektovanim uređajima i njoj dodeliti IP adresu iz dostupnih adresa, recimo 192.168.0.10. Dostupne adrese su uglavnom 100 adresa počevši od ruterove lokalne adrese.

Sačuvati i restartovati ruter da bi se podešavanja primenila. Ovim smo postigli da naš novi ruter uvek ima pristup internetu preko iste IP adrese. Slično ćemo kasnije uraditi i na novom ruteru za Raspberry Pi računare.

Konfigurisanje Raspberry Pi računara

Sada je potrebno instalirati operativne sisteme za Raspberry Pi računare. Odabrali smo HyrpiotOS distribuciju linuxa jer nam nisu potrebne opcije koje nude ostale distribucije, tako da će naš operativni sistem zauzimati minimalno mesta i raditi efikasnije. HypriotOS u sebi ima već preinstaliran Docker tako da je to dodatan razlog zašto smo odabrali njega. Instalaciju možemo izvršiti dosta jednostavno, korišćenjem Flash alata razvijen od strane Hypriot organizacije. Prvo je potrebno skinuti i instalirati Flash alat komandama:

  curl -O https://raw.githubusercontent.com/hypriot/flash/master/$(uname -s)/flash
  chmod +x flash
  sudo mv flash /usr/local/bin/flash
  sudo apt-get install -y pv curl python-pip unzip hdparm
  sudo pip install awscli

Neke od ovih zavisnosti možda već imamo na našem računaru i to je ok. Samu instalaciju OS-a možemo izvršiti jednom komandom koja će skinuti operativni sistem sa interneta i ubaciti je na našu microSD karticu. Prvo trebamo ubaciti karticu u računar a zatim pokrenuti komandu i pratiti njena uputstva:

  flash --hostname n0 https://github.com/hypriot/image-builder-rpi/releases/download/v1.5.0/hypriotos-rpi-v1.5.0.img.zip

Isto je potrebno uraditi i sa ostale dve kartice sa izmenom –hostname n1 i –hostname n2 respektivno. Nakon toga možemo ubaciti kartice u Raspberry Pi-jeve i uključiti ih u struju. Oni će se automatski pokrenuti i biti povezani na naš ruter jer smo ih prethodno priključili. Sada možemo namestiti statičke adrese i za njih. Pristupom ruteru (u mom slučaju Asus-ov model) unošenjem njegove lokalne adrese u pretraživač (192.168.1.0 ukoliko nije prethodno promenjeno) dobijamo njegova podešavanja. Slično kao malo pre tražimo konektovane klijente. Za nas su to 3 Raspberry Pi-ja i računar koji koristimo. Slično kao malo pre omogućujemo DHCP Server opciju. Sada ćemo da promenimo lokalnu adresu rutera na 172.16.0.1 i to nam postaje nova adresa za njegov pristup.

Ovaj korak nije bio neophodan ali nam smanjuje konfuziju sa sličnim IP adresama originalnog rutera. Dalje je potrebno da namestimo početak i kraj DHCP dostupnih adresa počevši od 172.16.0.100 do 172.16.0.199 a onda za svaku od MAC adresa uređaja dodeliti statičku IP adresu. Potrebno je sačuvati i restartovati ruter i sve konfigurisane uređaje kako bi se primenila podešavanja. Trenutna konfiguracija bi trebalo da izgleda ovako:

Uređaj IP adresa
Glavni računar (WIFI adapter) 172.16.0.111 (na Asus ruteru)
Glavni računar (LAN adapter) 172.16.0.110 (na Asus ruteru)
Raspberry Pi n0 172.16.0.100 (na Asus ruteru)
Raspberry Pi n1 172.16.0.101 (na Asus ruteru)
Raspberry Pi n2 172.16.0.102 (na Asus ruteru)
Asus ruter 192.168.0.10 (na generičkom SBB ruteru)

Konfigurisanje računara i testiranje

Kako bi smanjili mogućnost greške kucanja pogrešne IP adrese na računaru, možemo asocirati hostname Raspberry Pi-jeva i njihove IP adrese. To ćemo učiniti na računaru tako što ćemo u fajlu /etc/hosts dodati:

  172.16.0.100      n0
  172.16.0.101      n1
  172.16.0.102      n2

Sada bi trebalo da sa našeg računara možemo pristupiti celokupnom sistemu. Da bi to testirali konektujemo se računarom na Asus ruter, žičano ili bežično, i proverimo da li možemo da pristupimo njegovim podešavanjima i podešavanjima generičkog rutera bez direktnog povezivanja na njega. Takođe proverimo da li su svi Raspberry Pi dobili statičke adrese i da li ih Asus ruter vidi. Onda možemo da pristupimo svakom od njih preko SSH konekcije. Otvaramo tri terminala i kucamo komande respektivno:

  ssh pirate@n0
  ssh pirate@n1
  ssh pirate@n2

gde je SSH program za daljinsko upravljanje komandnom linijom, pirate je podrazumevani korisnik za HypriotOS, a n0, n1 i n2 su alias-i za IP adrese dodeljene Raspberry Pi-jevima. Prvo ćemo biti upitani da li želimo da sačuvamo tokene, što želimo i unosimo yes. Dalje ćemo biti upitani da unesemo lozinku za pristup svakom od uređaja. Podrazumevana lozinka za HypriotOS pirate korisnika je hypriot. Sada bi trebalo da imamo otvorene konekcije ka svim Raspberry Pi uređajima. Dalje je potrebno testirati da li Raspberry Pi-jevi imaju međusobnu konekciju i konekciju na internet. Na svakom od njih možemo da pokrećemo redom komande:

  sudo ping www.google.com
  sudo ping n0
  sudo ping n1
  sudo ping n2
  sudo ping 172.16.0.110

U zavisnosti od toga da li smo povezani preko žice ili bežično prilagoditi poslednju IP adresu za računar. Svaku od komandi pustimo da se izvršava desetak sekundi i proveravamo da li dobijamo validan odgovor. Kada smo sve proverili i ukoliko sve funkcioniše možemo update-ovati HypriotOS sisteme na Raspberry Pi-jevima. Ovo činimo unošenjem redom komandi na svaki od uređaja:

  sudo apt-get update
  sudo apt-get upgrade -y

Nakon toga možemo instalirati omiljeni tekstualni editor, u mom slučaju to je VIM ali odabir drugog neće uticati na dalji tok projekta i njegovu funkcionalnost. Instalaciju radimo unošenjem komande na svakom od Raspberry Pi-jeva:

  sudo apt-get install vim -y

Kako smo se već konektovali na svaki od uređaja znamo da svi poseduju instaliran SSH. Ono što je nama potrebno da odradimo što će nam trebati u nekom od sledećih koraka je da generišemo autentifikacione ključeve. To ćemo učiniti na glavnom računaru i svim Raspberry Pi računarima unošenjem komande:

  ssh-keygen -t rsa -b 4096

Nakon toga potrebno je nekoliko puta pritisnuti enter tj. prihvatiti podrazumevana podešavanja.

Nastavak

U ovom delu smo se pozabavili pripremanjem okruženja za samu instalaciju Kubernetesa. Napravili smo mini klaster sa tri Raspberry Pi računara od kojih je jedan master i dva dodatna noda i umrežili ih u odvojenu lokalnu mrežu. Sve to smo i testirali preko glavnog računara koji smo povezali na tu mrežu. U sledećem delu bloga ćemo pripremiti sve nodove za instalaciju Kubernetesa. Nakon toga ćemo instalirati Kubernetes koji će uzeti prethodno obeležen master nod kao glavni a ostale kao sporedne i instalirati sve odgovarajuće programe. Nakon toga ćemo instalirati mali servis kako bi testirali funkcionalnost Kubernetesa i nakon toga ubaciti Web korisnički interfejs u obliku Dashboard-a za Kubernetes. On će nam omogućiti lakšu administraciju sistema.