Često čujemo da Kubernetes (K8S) predstavlja “Cloud” Operativni Sistem (OS). Analogiju naravno ne treba shvatiti bukvalno jer Kubernetes nikako ne zamenjuje klasičan operativni sistem kao što je GNU/Linux. Više se može reći da Kubernetes predstavlja za data centar isto ono što i Linux za jedan (data centar) računar — omogućava upravljanje hardverskim resursima i omogućava izvršavanje aplikacija — ali sada skup računara posmatramo kao logičku resursnu celinu koju nazivamo klaster. Dakle, Kubernetes možemo posmatrati kao (klaster) “operativni sistem”, ali na višem nivou apstrakcije. Svakako, analogija je zanimljiva i vredna detaljnijeg razmatranja.
Svaki OS obezbeđuje tri osnovne funkcije:
- Multipleksiranje (mogućnost izvršavanja više korisnika/procesa u “isto vreme” na deljenim hardverskim resursima),
- Izolacija (procesi moraju biti međusobno izolovani radi neugrožavanja rada sistema drugih procesa i samog sistema),
- Apstrakcija hardvera (sami procesi ne pristupaju hardverskim resursima direktno nego preko posredovanja jezgra (kernel) i uz pomoć hardverskih “drajvera”).
Sve tri navedene funkcije obavlja i sam K8S. Ovde se nećemo baviti objašnjavanjem osnovne strukture i funkcije svake K8S komponente, ima na netu i više nego dovoljno tekstova na tu temu. Ali ćemo se osvrnuti na glavne paralele kao objašnjenje analogije:
- Osnovna jedinica izvršavanja programa: Proces/Thread (OS) <—> Pod/Container (K8S).
- Apstrakcija pristupa (IO) hardveru kroz precizno definisan API što omogućava prenosivost aplikacija i komplatibilnost rada na različitim hardverskim provajderima: K8S omogućava integraciju raznorodnog hardvera preko pomoću stabilnog CNI (Container Network Interface) i CSI (Storage) interfejsa, gde svaki proizvođač hardvera obezbeđuje i svoje CNI/CSI plugin-ove koji su u suštini hardverski drajveri.
- Proširivost funkcionalnosti sistema kroz učitavanje eksternih modula i (“odskora”) eBPF programa koji se izvršavaju u kernelu a nisu deo same binarne/izvršne verzije kernela: K8S omogućava učitavanje pomenutih CNI/CSI plagin-ova, kao i definisanje sopstvenih objekata (CRD – Custom Resource Definition) koji proširuju funkcionalnosti bazičnog K8S-a.
- Obezbeđivanje komunikacije između procesa (IPC): svi podovi unutar jednog K8S klastera su deo “flat” mreže (nema NAT-ovanja) i mogu nesmetano međusobno komunicirati. Dodatno, kontrola komunikacije (ranije iptables i sl. mehanizmi) se u K8S-u obezbeđuje preko ugrađenih Service mehanizama. Zanimljivost: iptables se zapravo koristi (uglavnom, još uvek barem) za implementaciju Service mehanizma.
- Jedna od osnovnih funkcija operativnog sistema je i raspoređivanje procesa (engl. scheduling), tj. određivanje gde i kada treba da se izvršava određeni proces: K8S ima jednostavan osnovni raspoređivač koji je sasvim adekvatan za tipične mikroservisne aplikacije. Raspoređivač postoji unutar K8S “scheduling framework-a” koji je fleksibilan i modularan — omogućava promenu ponašanja osnovnog algoritma, kao i implementaciju potpuno nezavisnih namenskih algoritama raspoređivanja.
- Ima tu još dosta “školskih” paralela (korisnici, kontrola pristupa, …), koje su manje zanimljive. Koga zanima, može pogledati zanimljiv video koji je i delimično korišćen kao izvor i u ovom tekstu.
Neke druge analogije, kao što su one vezane za interni rad sistema je teže povući. Na primer, kako razumeti sa sistemske pozive i prekide (interapte) u Kubernetes svetu? U K8S arhitekturi, API predstavlja centralnu tačku koja kontroliše komunikaciju sa ostatkom sistema (npr. samo API može upisivati u etcd bazu). Eksterno gledano, korisnici prilikom pokretanja svojih aplikacija zahtevaju resurse preko API-a, što predstavlja “user space <—> kernel space” interakciju. Takođe, interno “ispod haube” sve druge komponente sistema komuniciraju posredstvom to istog API-a koji u ovom slučaju ne samo da je arbitar nego ima ulogu i upravljača događajima (engl. event manager) jer obaveštava druge komponente o završetku nekog događaja asinhrono, što možemo smatrati pandanom funkcionalnosti prekida.
U poređenju sa klasičnim operativnim sistemima u kontekstu osnovne svrhe OS-a što je upravljanje aplikativnim procesima, Kubernetes je neke stvari i poboljšao. Omogućava lakše skaliranje aplikacija, upravlja dostupnošću pojedinih procesa/podova, lakše puštanje nove verzije aplikacije kroz fazni “blue/green” proces, bolje upravljanje saobraćajem pomoću ingres i service mesh mehanizama itd.
Kubernetes-ov potencijal i hajp industrije treba razumeti i posmatrati kroz prizmu obećane zemlje zvane Hibridni Oblak. Trenutno se Kubernetes nameće kao najbolji kandidat kao temelj hibridne infrastrukture budućnosti. To iz nekoliko razloga:
- Koristi nativno kontejnere koji su po definiciji portabilniji.
- Nije vezan za određenu hardversku arhitekturu (istina, nije ni klasični OS odavno), ali čak ni za određeni operativni sistem ili hipervizor. K8S koristi određeno kontejnersko okruženje (i to predstavlja uslov za funkcionisanje određenog kontejnera), ali ona su već danas uglavnom međusobno kompatibilna zahvaljujući standardnizaciji formata kontejnerskog image-a kroz OCI inicijativu (Open Container Initiative). A i sam K8S podržava izvršavanje različitih kontejnerskih okruženja pomoću CRI interfejsa (Container Runtime Interface).
- Na kraju (ili bolje na početku), funkcioniše na višem nivou apstrakcije od klasičnih operativnih sistema.
Treba naglasiti da Kubernetes nije “nastao preko noći” – koreni su mu nastali u Google-u, a genezu vodi od Borga (interni Google alat za orkestraciju – “Google’s Kubernetes”) preko Omege (eksperimentalni dizajn/projekat). Ova priča zaslužuje zaseban tekst, a do tada ako te zanima ova veoma zanimljiva evolucija, želiš da naučiš više o lekcijama o dizajnu ovih sistema, ili prosto želiš odgovor na pitanja zašto Google ne koristi Kubernetes, možeš pročitati ovaj sjajan članak.
Za kraj i na kraju, vreme će pokazati da li je ova analogija opravdana. S obizrom da je Unix/Linux zlatni standard i živi već 50 godina, mogli bismo tih pola veka postaviti kao rok za test vremena. Ili je možda, s obzirom da su promene danas sve brže u svim domenima, realističnije npr. pola od toga što je 25 godina. Kubernetes je leta Gospodnjeg 2015. godine AD izašao iz Google inkubatora i započeo svoj samostalni život. Trenutno ima punih 7 godina, ali to su Internet godine, mnogo brže, nešto kao pseće godine… pitam se da li je onda K8S punoletan? Bilo kako bilo, po našoj analogiji/računici do 2040. godine ćemo znati da li je trenutni hajp oko Kubernetes-a opravdan ili je on samo prolazna moda pa će ga prekriti zaborav kao i mnoge druge tehnologije. Do tada, u narednih 18 godina, nama ostaje da uživamo u predstavi tehnološkog života i evolucije. “Kokice molim, ovaj mislim kafu, kratki sa hladim”.
Ako želiš da budeš u toku sa mitovima, trendovima i (bajatim) novostima iz čarobnog sveta računarstva, prijavi se dole na Bilten!