Magazín KPI
Časopis Katedry počítačov a informatiky FEI TUKE
kpi

Úvod do Kubernetes

Kubernetes je nová technológia, ktorá umožňuje jednoduchú správu kontajnerových aplikácií. Podporuje rozdelenie záťaže medzi viacerými službami súčasne. Táto technológia vznikla na základe dnešného trendu používania väčšieho počtu menších služieb (microservices), ktoré tvoria jeden celok. Vďaka tomu, že sa jedná o menšie služby, je teda možné službu lepšie škálovať na základe vyťaženia. Tieto služby zvyčajne bežia v samostatných Docker kontajneroch, ktoré umožňujú oddeliť ich od od zvyšku systému. Na automatizovanú správu týchto kontajnerov sa dá použiť práve Kubernetes, ktorého inštaláciu a základné používanie si ukážeme v tomto článku.

Úvod

Dnešné moderné infraštruktúry v sektore informačných technológií sú často rozdeľované na menšie služby nazývané microservices. Zoberme si napríklad jednoduchú službu na nahrávanie fotiek na server. Túto službu by sme rozdelili do niekoľkých menších služieb, napríklad službu na prihlasovanie, službu na nahrávanie fotiek a následne na ich sťahovanie keď si to použivateľ vyžiada.

Keď dôjde ku veľkému vyťaženiu jednej tejto služby, jednoducho vytvoríme ďalšiu inštanciu tejto služby a záťaž rozdelíme rovnomerne medzi inštancie danej služby.

Čo je to Kubernetes?

Kubernetes slúži na správu týchto menších služieb. Umožňuje jednoduchú škálovateľnosť, automatické rozdelenie záťaže medzi jednotlivými službami, komplexnú konfiguráciu jednotlivých služieb a stará sa o stabilitu daných služieb. Ak niektorá zo služieb prestane byť funkčná, Kubernetes sa postará o to, aby spustil novú instanciu služby a zabezpečil tak bezproblémový chod služby ako celku.

Pre koho je Kubernetes vhodný?

Táto technológia má svoje plusy ale aj mínusy. Je potrebné si uvedomiť, že používaním viacerých menších služieb je nutné zabezpečiť, aby si medzi sebou neprekážali a nerušili sa navzájom. Preto musia byť jednotlivé služby navrhnuté tak, aby bolo možné mať spustených viacero inštancií súčasne bez vzájomného rušenia. Ďalej je potrebné si uvedomiť, že s narastajúcim počtom služieb dochádza ku zvýšeniu komplexity celkovej infraštruktúry. Keď počet rôznych služieb prekročí určité množstvo, môže to spraviť vývoj služieb problematickým. Pri menších projektoch nemá veľmi zmysel používať Kubernetes, pravé kvôli komplexite, ktorú prináša pre celkový projekt. Avšak pri väčších projektoch, kde vieme, že budeme mať vysokú záťaž na infraštruktúru a budeme potrebovať vysokú škálovatelnosť, tak pre takého prípady je Kubernets vhodný.

Architektúra Kubernetes

Klaster Kubernetes. Zdroj: medium.com/@tomerf
Klaster Kubernetes. Zdroj: medium.com/@tomerf

Klaster (ang. cluster) je celok uzlov vykonávajúcich prácu (ang. worker) a hlavného uzla (ang. master), ktoré spolu tvoria tento klaster.

Uzol (ang. node) je fyzický počítač, ktorý patrí do klastra a na ktorom sú spustené jednotlivé služby. Nazývame ho tiež pracovný uzol (ang. worker).

Master je hlavný uzol, ktorý kontroluje činnosť pracovných uzlov. Stará sa o spúšťanie nových služieb na jednotlivých pracovných uzloch a ich celkovú správu.

Pod je zoskupenie jedného alebo viacerých kontajnerov so zdieľaným úložným priestorom a sieťou.

Evolúcia spôsobov nasadenia aplikácií. Zdroj: kubernetes.io
Evolúcia spôsobov nasadenia aplikácií. Zdroj: kubernetes.io

Kontajner (ang. container) je virtualizované prostredie, v ktorom je spustená daná služba. Najčastejšie je na kontajnerizáciu používaný Docker.

Nasadenie (ang. deployment) je špecifikácia služby, ktorá je následne spustená v pod-e. Špecifikácie sú tvorené v štandardnom formáte YAML.

Návod na inštaláciu a použitie

Na ukážku fungovanie Kubernetes použijeme MicroK8s na Ubuntu 18.04 Desktop. MicroK8s je verzia Kubernetes, ktorý slúži na vytvorenie klastra s jedným uzlom.

Inštalácia MicroK8s

  1. Inštalujeme snapd

     sudo apt install snapd
    
  2. Inštalujeme microk8s

     sudo snap install microk8s --classic
    
  3. Pridáme aktuálne prihláseného používateľa do skupiny microk8s

     sudo usermod -a -G microk8s <meno_pouzivatela>
    
  4. Reštartujeme operačný systém

     sudo reboot
    
  5. Overíme správnosť inštalácie

     microk8s.kubectl cluster-info
    

Vytvorenie Dashboardu

Dashboard je služba Kubernetes, ktorá umožňuje správu klastra prostredníctvom webového rozhrania.

  1. Ako prvé povolíme dashboard príkazom

     microk8s.enable dashboard
    
  2. Aby sme sa vedeli dostať na dashboard, je potrebné nastaviť proxy

     microk8s.kubectl proxy --accept-hosts=.* --address=0.0.0.0 &
    

    Znak & na konci znamená, že proxy bude bežať na pozadí.

  3. Prostredníctvom príkazu si zistíme, aká je lokálna adresa zariadenia

     ifconfig
    
  4. Webové rozhranie dashboardu otvoríme v prehliadači na danom zariadení a zadáme nasledovnú URL

     http://<lokálna_ip_adresa>:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
    

    Dostaneme sa na nasledovnú stránku

  5. Získame token na prihlásenie

     token=$(microk8s.kubectl -n kube-system get secret | grep default-token | cut -d " " -f1)
     microk8s.kubectl -n kube-system describe secret $token
    
  6. Vo webovom rozhraní zvolíme možnosť token a zadáme token, ktorý sme získali

  7. Následne sme presmerovaní na úvodnú stránku dashobardu

Vytváranie vydaní a spravovanie služieb

  1. V dashboarde vytvoríme nové vydanie tak, že klikneme hore v pravo na znak plus.
  2. Vyplníme údaje o našom nasadení pre službu nginx, ktoré vyzerá nasledovne:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

V danej konfigurácii sme definovali, že nasadenie bude používať obraz nginx a služba bude používať port 80. Ďalej si môžeme všímnúť, že sme definovali počet replík na 2. To znamená, že budu vytvorené 2 pody s obrazom nginx. Selector nám definuje, ako pri nasadení vyberieme pody, na ktoré bude nasadenie aplikované. V template máme definovaný label, ktorý je označenie podov, ktorý bude podom určený pri nasadení. Po potvrdení konfigurácie, Kubernetes vytvorí dva nové pody podľa špecifikácie.

Predstavme si, že tieto dva pody by dosiahli maximálne vyťaženie, čo s tým môžeme robiť?

Jednoducho pridáme ďalšiu repliku. Môžeme to urobiť buď v dashboarde, alebo pomocou príkazu:

microk8s.kubectl scale -n default deployment nginx-deployment --replicas=3

Keď sa teraz pozrieme na zoznam bežiacich podov, zistíme, že máme momentálne k dispozícii 3 pody. Tu si môžeme uvedomiť, ake jednoduchá je škálovateľnosť s Kubernetes.

Dodatočné služby

V MicroK8s su dodatočné služby inštalované ako addony, dashboard je jeden z addonov, ktorý je k dispozícii. Taktiež máme k dispozícii addony ako storage a dns.

Úložisko

Na zapnutie úložiska povolíme addon storage nasledovným príkazom

microk8s.enable storage

Týmto nám vznikne úložisková trieda s názvom micok8s-hostpath, ktorú použijeme na vytvorenie perzistentného úložiska s maximálnou veľkosťou 20 GiB, s názvom task-pv-volume a na hostiteľskom zariadení bude smerovať na /mnt/persistent. Klikneme na plusko hore v dashboarde, podobne ako pri vytváraní nasadenia a zadáme nasledobnú konfiguráciu.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: micok8s-hostpath
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/persistent"

Konfiguráciu potvrdíme a následne opäť klikneme na plusko hore v dashboarde a vytvoríme nárok na perzistentné úložisko s maximálnou veľkosťou 2 GiB a názvom task-pv-claim:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: task-pv-claim
spec:
  storageClassName: micok8s-hostpath
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi

Teraz už môžeme využiť perzistentné úložisko pre jednotlivé pody v kubernetes klastri.

Aby sme priradili jednotlivý službám toto úložisko, pridáme nasledovnú konfiguráciu do konfigurácie nasadenia:

spec:
  volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
        claimName: task-pv-claim
  containers:
      image: nginx
      ...
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: task-pv-storage

DNS

Pri Kubernetes sa môže často stať, že potrebujeme mať úplnú kontrolu nad DNS záznamami.

To môžeme docieliť zapnutím DNS služby pre Kubernetes.

microk8s.enable dns

Následne je možné upravovať DNS záznamy a DNS servery príkazom, kde sa nám otvorí súbor v textových editore vim:

microk8s.kubectl -n kube-system edit configmap/coredns

Pôvodné nastavenia majú nakonfigurované DNS servery na 8.8.8.8 a 8.8.4.4.

Tento addon je tiež vyžadovaný pri väčšine iných addonov, vďaka kompletnej kontrole nad DNS, vieme v rámci Kubernetes vytvárať vlastné lokálne domény, ktoré potom môžeme využiť pri jednotlivých podoch a uľahčiť si tak prácu v rámci Kubernetes klastra.

Záver

Hlavný cieľom daného článku bolo zoznámiť čitateľa s relatívne novou technológiou Kubernetes. Kubernetes je ale veľmi rozsiahla technológia a jeden článok určite nemôže obsahovať všetky konfigurácie a služby, ktoré s ním súvisia. Dokumentácia Kuberentes je bohatá a skutočne obsahuje všetko, čo je možné s Kubernetes dokázať. Táto dokumentácia sa nachádza na https://kubernetes.io/docs/home/. V praxi sa je možné stretnúť aj s manežovaným klastrom, ktorý už má predkonfigurovaný Kubernetes klaster a my už len pridávame nasadenia ako napríklad Amazon Elastic Kubernetes Service (Amazon EKS) alebo DigitalOcean Kubernetes.

Linkovať