Zdarma dostupný systém s otvoreným zdrojovým kódom Kubernetes (K8s) slúži na organizovanie kontajnerov, čo umožňuje automatizáciu nasadenia, škálovania a správy aplikácií bežiacich v kontajneroch. Často sa používa v spolupráci s kontajnerizačným prostredím Docker, containerd či CRI-O. Nasadzuje sa ako služba typu platforma-ako-služba (PaaS) alebo infraštruktúra-ako-služba (IaaS).
História
Kubernetes začali vyvíjať inžinieri spoločnosti Google v roku 2014. Vývoj a dizajn bol do veľkej miery ovplyvnený systémom na správu klastrov, ktorý vtedy používal Google pod názvom Borg (odkaz na seriál Star Trek). Kubernetes bol v tom čase vyvíjaný pod názvom “Project 7”, čo predstavuje odkaz na seriál Star Trek – konkrétne na postavu ex-Borga “Seven of Nine”. Dnešný názov Kubernetes získal podľa gréckeho označenia kormidelníka – preto kormidlo v logu, ktoré svojimi siedmimi rúčkami rovnako odkazuje na postavu “Seven of Nine”.
Aby Kubernetes mohol byť používaný ako nezávislá štandardizovaná platforma na orchestráciu kontajnerov, Google sa v roku 2015 rozhodol, že spoločne s neziskovou organizáciou Linux Foundation založí projekt Cloud Native Computing Foundation (CNCF). Táto organizácia má za úlohu starať sa o vývoj a šírenie kontarizačnej technológie a prípravu technologického prostredia na jej pokročilé nasadzovanie. Medzi zakladateľské firmy CNCF patria také zvučné mená ako Intel, Cisco, IBM, Red Hat či Twitter.
V roku 2016 CNCF vydala správcu balíkov Helm, vďaka ktorému sa správa a nasadenie aplikácií do klasteru Kubernetes výrazne zjednodušila. Popularita Kubernetes následne vystrelila na deviate miesto v rámci projektov na GitHube a dokonca na druhé miesto (hneď za Linux!) v počte prispievateľov. CNCF okrem správcu balíkov Helm vyvíja aj ostatné nástroje, ktoré sú používané pri práci s Kubernetes – napr. Containerd, CoreDNS alebo etcd.
Ako Kubernetes funguje
Architektúru systému Kubernetes si treba predstaviť ako klaster, ktorý sa skladá z dvoch veľkých častí: Správca (Kubernetes Master) a uzly (Kubernetes Worker Nodes). Správca kontroluje a plánuje fungovanie uzlov. Principiálne ide o podobný nástroj ako je Docker Swarm, ale Kubernetes navyše ponúka sofistikovanejšiu automatizáciu (orchestráciu) v prípade pádu kontajnerov, v prípade pádu fyzických serverov alebo v prípade prílišneho zaťaženia sieťovej komunikácie (load balancing).
Kontajner je softvérový balík, ktorý obsahuje všetko potrebné na spustenie aplikácie: kód samotnej aplikácie, systémové knižnice a nastavenia. Ak je kontajner spustený, nie je ho už možné meniť. Ak teda máme aplikáciu, ktorá beží v kontajneri a potrebujeme v nej urobiť zmeny, najskôr musíme spustený kontajner vypnúť a následne spustiť obraz kontajnera, ktorý obsahuje zmeny. Viac o kontajneroch aj v úvodnej časti seriálu o systéme Docker.
Orchestrácia v systéme Kubernetes označuje riadenie kontajnerov. Ide o pokročilú automatizáciu, vďaka ktorej je možné v prípade pádu kontajnera kontajner reštartovať, v prípade pádu fyzického servera spustiť ďalšie kontajnery na inom serveri a v prípade veľkého zaťaženia siete presunúť komunikáciu na menej vyťaženú infraštruktúru (load balancing). Vďaka orchestrácii kontajnerov teda dokážeme automatizovať riešenia pre najčastejšie kritické scenáre.
Kubernetes Master (správca)
Správca obsahuje server (kube-apiserver) s rozhraním pre programovanie aplikácií (Application Programming Interface, API), pomocou ktorého komunikuje s uzlami. Správca tiež zahŕňa manažovanie (kube-controller-manager), plánovanie (kube-scheduler) a databázu (etcd). Pri komunikácii s uzlami im dávame vedieť, aké objekty (Kubernetes Objects) majú vytvoriť, zmeniť alebo odstrániť.
Najjednoduchší a zároveň najdôležitejší objekt je tzv. Pod (skupinka), pretože obsahuje kontajnery, ktoré má Kubernetes orchestrovať. Všetky ostatné objekty iba slúžia objektu Pod. Ide o objekty ako volume, service, deployment, ingress, secret, configMap a mnoho ďalších. Postupne sa v priebehu tohto seriálu na niektoré objekty pozrieme podrobnejšie.
Kubernetes Worker Nodes (uzly)
Uzly (nodes) sú tí pracovníci (workers), ktorí vykonajú všetko presne tak, ako im zadá správca (master). Na uzloch teda beží kontajnerizovaná aplikácia podľa pokynov od správcu. Aby systém správca-uzly pracoval čo najlepšie, odporúča sa správcu prevádzkovať na samostatnom serveri a každý uzol rovnako na samostatnom serveri. Uzly pre svoje fungovanie potrebujú iba tri služby:
Kubelet je po službe kube-apiserver najdôležitejšia, pretože práve kubelet na každom uzle prijíma pokyny od služby kube-apiserver a priamo tak orchestruje kontajneri na každom Pode. Kubelet kontroluje iba kontajnery, ktoré sám spustil. Môže o nich získať informácie a zastaviť/spustiť ich. Práve kubelet priamo komunikuje s kontajnerizačným prostredím (napr. Docker, containerd alebo CRI-O) cez rozhranie pre komunikáciu s kontajnermi (Container Runtime Interface, CRI).
Kube-proxy je služba, ktorá tvorí komunikačný kanál medzi uzlami, podmi a kontajnermi. Od správcu cez kube-apiserver prijíma aktuálne informácie o konkrétnych službách na uzloch a udržiava tak sieť uzlov aktuálnu. To všetko sa deje pomocou nástroja iptables, cez ktorý kube-proxy nastavuje pravidlá a smeruje tak komunikáciu na správny koncový bod podľa potreby (load balancing).
Kontajnerizačné prostredie je tiež služba, ktorá musí bežať na každom uzle. Vďaka tejto službe môže služba kubelet na požiadanie služby kube-apiserver spustiť alebo zastaviť kontajner. Aktuálne dokáže Kubernetes pracovať s ktorýmkoľvek kontajnerizačným prostredím, ktoré spĺňa štandardy organizácie Open Container Initiative (OCI). Kompatibilné s OCI sú napr. kontajnerizačné prostredia Docker, rkt, runc alebo runsc.
Inštalácia malého Kubernetes
Projekt minikube vznikol ako zdarma dostupný nástroj s otvoreným zdrojovým kódom, ktorý si kladie za cieľ čo najviac uľahčiť vývoj pre Kubernetes. Ide o lokálnu inštaláciu klastra, ktorú je možné nainštalovať na Linuxe, MacOS či Windowse. Minimálne požiadavky sú 2-jadrá CPU, 2 GB voľnej RAM, 20 GB voľného priestoru na disku a povolená hardvérová virtualizácia. K tomu sú ešte potrebné pripojenie do internetu a niektoré z kontajnerizačných prostredí ako Docker, Hyperkit, Hyper-V, KVM, Parallels, Podman, VirtualBox či VMWare.
V tomto seriály síce budeme Kubernetes predstavovať na sieťovej inštalácii (1x master + 2x worker), ale na vyskúšanie Kubernetes na jednom počítači postačí aj minikube. Nemusíte tak použiť viaceré počítače, či VPS, no aj napriek tomu stále môžete pracovať s Kubernetes a jeho nástrojmi ako napr. kubectl.
Ukážeme si inštaláciu minikube na Linuxe Ubuntu 20.04 LTS (Focal Fossa). Ako prvé nainštalujeme všetky potrebné balíky, vďaka ktorým bude možné nainštalovať ostatné nástroje:
sudo apt install curl wget apt-transport-https virtualbox virtualbox-ext-pack -y
V druhom kroku nainštalujeme kontajnerizačné prostredie Docker:
sudo apt install docker.io -y
Po dokončení inštalácie Docker spustíme (prvý riadok) a povolíme automatické spúšťanie pri štarte systému (druhý riadok):
systemctl start docker
systemctl enable docker
Stiahneme aktuálnu verziu minikube (prvý riadok), skopírujeme ju do systémovej cesty (druhý riadok) a nastavíme oprávnenia (tretí riadok):
wget https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo cp minikube-linux-amd64 /usr/local/bin/minikube
sudo chmod 755 /usr/local/bin/minikube
Na správu aplikácií v Kubernetes ešte potrebujeme nainštalovať niektoré nástroje z externého Kubernetes repozitára. Pridáme teda GPG kľúč repozitára (prvý riadok), samotný repozitár (druhý riadok), aktualizujeme zoznam aktualizovaných balíčkov (tretí riadok) a nakoniec nainštalujeme nástroje kubectl a kubeadm (štvrtý riadok):
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update -y
sudo apt install kubectl kubeadm -y
Keďže sú teraz všetky požadované balíky nainštalované, môžeme spustiť minikube (prvý riadok) a skontrolovať stav klastra cez minikube (druhý riadok):
minikube start
minikube status
Následne už môžeme začať pracovať so samotným Kubernetes. Necháme si vypísať informácie o celom klastri (prvý riadok) a nastavenia kubectl (druhý riadok). Informácie o uzloch (tretí riadok) si rovnakom môžeme zobraziť. Môžeme ísť ešte hlbšie a nechať si vypísať zoznam kontajnerov (štvrtý riadok).
kubectl cluster-info
kubectl config view
kubectl get nodes
kubectl get pods --all-namespaces
Kompletnú správu Kubernetes môžeme realizovať pohodlne aj z grafického prostredia cez Kubernetes Dashboard (Web UI), ktoré povolíme takto:
minikube dashboard --url
Vypíše sa URL adresa, na ktorej Web UI zobrazíme vo webovom prehliadači. Odteraz už teda pracujeme v grafickom prostredí webového prehliadača.
Zhrnutie
V prvom diele seriálu o Kubernetes sme si stručne popísali históriu projektu. Predstavili sme si architektúru a základné nástroje Kubernetes. Nakoniec sme Kubernetes nainštalovali lokálne pomocou nástroja minikube, aby sme mohli Kubernetes používať aj na bežne dostupnom počítači.