Kubernetes orkestravimas: pradedančiųjų vadovas

Kubernetes šiandien yra viena iš tų technologijų, apie kurią visi kalba, bet ne visi iki galo supranta, kas tai iš tikrųjų yra. Jei jums atrodo, kad tai kažkas baisiai sudėtingo ir skirta tik dideliems korporacijų IT skyriams – turiu gerų žinių. Taip, Kubernetes nėra paprasčiausias įrankis pasaulyje, bet jo pagrindinė idėja yra gana logiška ir suprantama. Šiame straipsnyje pabandysiu išpasakoti, kas yra Kubernetes orkestravimas taip, kad suprastų ir tie, kurie tik pradeda kelionę į konteinerių pasaulį.

Kas iš tikrųjų yra Kubernetes ir kodėl jis atsirado

Prieš kalbėdami apie Kubernetes, turime suprasti problemą, kurią jis sprendžia. Įsivaizduokite, kad turite programą, kuri veikia konteineryje (pavyzdžiui, Docker konteineryje). Vienas konteineris – visai paprasta. Bet kas nutinka, kai jūsų programa tampa populiari ir jums reikia paleisti ne vieną, o dešimt, šimtą ar net tūkstantį konteinerių? Kaip juos valdyti? Kaip užtikrinti, kad jie visi veiktų sklandžiai? Kas nutiks, jei vienas iš jų „nukrits”?

Štai čia ir ateina Kubernetes. Tai orkestravimo platforma, kuri automatizuoja konteinerizuotų aplikacijų diegimą, mastelio keitimą ir valdymą. Google sukūrė Kubernetes remdamiesi savo vidine sistema Borg, kurią naudojo daugiau nei dešimtmetį. 2014 metais jie padarė Kubernetes atvirojo kodo projektu, ir nuo tada jis tapo faktiškai industrijos standartu.

Paprasta analogija: jei Docker yra kaip atskiri konteineriai prekėms, tai Kubernetes yra kaip visa logistikos sistema, kuri valdo tų konteinerių judėjimą, saugojimą ir pristatymą. Jis žino, kur kas yra, kas veikia gerai, o kas ne, ir automatiškai priima sprendimus, kaip viską optimizuoti.

Pagrindinės Kubernetes sąvokos, kurias privalote žinoti

Kubernetes turi savo žodyną, ir pradžioje tai gali atrodyti kaip mokytis naują kalbą. Bet kai suprasite pagrindines sąvokas, viskas sustos į savo vietas.

Pod – tai mažiausias Kubernetes vienetas. Galvokite apie jį kaip apie vieną ar kelis konteinerius, kurie veikia kartu ir dalijasi tais pačiais resursais. Dažniausiai vienas Pod = vienas konteineris, bet gali būti ir daugiau.

Node – tai fizinė ar virtuali mašina, kurioje veikia jūsų Pod’ai. Kubernetes klasteris susideda iš kelių Node’ų. Yra du tipai: Master Node (valdymo centras) ir Worker Node’ai (kur iš tikrųjų vyksta darbas).

Cluster – tai visų jūsų Node’ų rinkinys, valdomas Kubernetes. Tai lyg komanda, kur kiekvienas žaidėjas žino savo vaidmenį.

Service – tai abstraktus būdas eksponuoti aplikaciją, veikiančią viename ar keliuose Pod’uose. Kadangi Pod’ai gali „mirti” ir būti atkuriami su naujais IP adresais, Service užtikrina stabilų būdą pasiekti jūsų aplikaciją.

Deployment – tai aprašymas, kaip jūsų aplikacija turėtų būti paleista. Čia nurodote, kiek Pod’ų norite, kokį konteinerio image naudoti ir kaip atnaujinti aplikaciją be prastovų.

Kaip iš tikrųjų veikia orkestravimas praktikoje

Gerai, teorija teorija, bet kaip tai veikia realiame gyvenime? Tarkime, jūs turite web aplikaciją, kurią norite paleisti Kubernetes klasteryje.

Pirmiausia, jūs sukuriate Deployment failą (YAML formatu), kuriame aprašote, ką norite. Pavyzdžiui, norite trijų jūsų aplikacijos kopijų (trijų Pod’ų). Kubernetes paima šį aprašymą ir pradeda darbą – jis pasiskirsto tuos tris Pod’us po skirtingus Node’us, kad būtų geresnė redundancija.

Dabar įsivaizduokite, kad vienas iš tų Pod’ų „nukrisdavo” dėl kokios nors klaidos. Kubernetes tai pastebi per kelias sekundes ir automatiškai paleidžia naują Pod’ą vietoj sugadinto. Jums nereikia nieko daryti – sistema pati save gydo.

Arba kitas scenarijus: jūsų aplikacija staiga tampa labai populiari, ir trys Pod’ai nebespėja apdoroti visų užklausų. Jūs galite paprasčiausiai pasakyti Kubernetes: „Noriu penkių Pod’ų vietoj trijų”, ir per minutę sistema automatiškai padidinės jūsų aplikacijos mastą. Dar geriau – galite sukonfigūruoti automatinį mastelio keitimą (autoscaling), ir Kubernetes pats pridės ar sumažins Pod’ų skaičių priklausomai nuo apkrovos.

Įrankiai ir aplinka pradedantiesiems

Viena iš didžiausių kliūčių pradedantiesiems yra tai, kad Kubernetes klasterio sukūrimas gali atrodyti bauginantis. Bet yra keletas puikių įrankių, kurie padaro šį procesą daug paprastesnį.

Minikube – tai tikriausiai geriausias būdas pradėti. Jis leidžia paleisti vieno Node’o Kubernetes klasterį jūsų vietiniame kompiuteryje. Idealus mokymosi ir eksperimentavimo variantas. Instaliuojate Minikube, paleidžiate komandą „minikube start”, ir po kelių minučių turite veikiantį klasterį.

Kind (Kubernetes in Docker) – dar vienas populiarus įrankis, kuris leidžia paleisti Kubernetes klasterį Docker konteineriuose. Jis šiek tiek greitesnis nei Minikube ir puikiai tinka CI/CD pipeline’ams.

K3s – tai supaprastinta Kubernetes versija, kuri naudoja mažiau resursų. Puikiai tinka Raspberry Pi ar edge computing scenarijams.

kubectl – tai pagrindinė komandinės eilutės įrankis darbui su Kubernetes. Per jį vykdysite visas operacijas: Pod’ų kūrimą, būsenos tikrinimą, logų peržiūrą ir t.t. Šį įrankį tikrai verta išmokti gerai, nes juo naudositės nuolat.

Praktinis patarimas: pradėkite su Minikube. Instaliuokite jį, paleiskite paprastą aplikaciją (pavyzdžiui, nginx), pažiūrėkite, kaip ji veikia, pabandykite ją „nulaužti” ir stebėkite, kaip Kubernetes ją atkuria. Tokia praktika duos daug daugiau supratimo nei bet kokia teorija.

YAML failai – jūsų naujas geriausias draugas (ar priešas)

Kubernetes konfigūracija rašoma YAML failuose, ir tai viena iš tų dalykų, kurios gali išvesti iš kantrybės. YAML yra jautrus tarpams (indentacijai), ir vienas neteisingai įdėtas tarpas gali sugadinti visą konfigūraciją.

Bet kai įprasite, YAML failai tampa labai logiški. Štai paprastas Deployment pavyzdys:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mano-aplikacija
spec:
  replicas: 3
  selector:
    matchLabels:
      app: mano-aplikacija
  template:
    metadata:
      labels:
        app: mano-aplikacija
    spec:
      containers:
      - name: web
        image: nginx:latest
        ports:
        - containerPort: 80

Šis failas sako Kubernetes: „Sukurk deployment’ą pavadinimu ‘mano-aplikacija’, paleisk tris nginx konteinerius, ir kiekvienas klausosi 80 porto”. Gana paprasta, tiesa?

Patarimas: naudokite teksto redaktorių, kuris palaiko YAML sintaksės patikrinimą. VS Code su Kubernetes plėtiniu yra puikus pasirinkimas. Taip pat yra įrankiai kaip kubeval ar kube-score, kurie gali patikrinti jūsų YAML failus prieš juos taikant klasteryje.

Dažniausios klaidos ir kaip jų išvengti

Dirbant su Kubernetes, yra keletas klasikinių klaidų, į kurias įkrenta beveik visi pradedantieji.

Resursų limitų nenustatymas – jei nenurodysite CPU ir atminties limitų savo Pod’ams, vienas „išprotėjęs” konteineris gali suėsti visus Node’o resursus. Visada nustatykite „requests” ir „limits” savo konteineriams.

Liveness ir Readiness probe’ų ignoravimas – šie mechanizmai leidžia Kubernetes suprasti, ar jūsų aplikacija tikrai veikia, ar tik „apsimeta”. Be jų, Kubernetes gali siųsti srautą į dar nepasiruošusį Pod’ą arba neatpažinti, kad aplikacija užstrigo.

Visko dėjimas į vieną namespace – namespace’ai padeda organizuoti resursus. Naudokite juos skirtingoms aplinkoms (dev, staging, production) ar skirtingoms komandoms atskirti.

Secrets saugojimas YAML failuose – niekada neįtraukite slaptažodžių ar API raktų tiesiogiai į YAML failus, kuriuos commit’inate į Git. Naudokite Kubernetes Secrets arba dar geriau – išorinius įrankius kaip Sealed Secrets ar Vault.

Logų ir monitoringo neįdiegimas – Kubernetes klasteryje gali vykti šimtai procesų vienu metu. Be tinkamo logging ir monitoring sprendimo (pvz., ELK stack, Prometheus + Grafana) jūs būsite aklas. Įdiekite šiuos įrankius nuo pat pradžių.

Kada Kubernetes yra per daug, o kada – kaip tik

Būkime sąžiningi: ne kiekvienam projektui reikia Kubernetes. Jei turite paprastą WordPress svetainę ar mažą aplikaciją, kurią naudoja dešimt žmonių, Kubernetes bus kaip šaudyti iš patrankos į žvirblius.

Kubernetes prasideda daryti prasmę, kai:

  • Turite mikroservisų architektūrą su daugybe skirtingų komponentų
  • Jums reikia automatinio mastelio keitimo priklausomai nuo apkrovos
  • Norite zero-downtime deployment’ų
  • Turite kelias aplinkas (dev, staging, production), kurias norite valdyti vienodai
  • Jūsų komanda auga ir reikia geresnės organizacijos bei izoliacijos
  • Planuojate multi-cloud ar hybrid cloud strategiją

Jei jūsų situacija atitinka bent kelis iš šių punktų, Kubernetes investicija atsipirks. Bet jei turite vieną ar dvi paprastas aplikacijas, galbūt pakaks Docker Compose ar kokio nors PaaS sprendimo kaip Heroku.

Svarbu suprasti, kad Kubernetes atsineša ir papildomos sudėtingumo. Jums reikės mokytis naujų koncepcijų, prižiūrėti patį klasterį (jei nenaudojate managed sprendimo), ir turėti žmonių, kurie supranta, kaip visa tai veikia. Tai nėra „set and forget” sprendimas.

Kelias į priekį: nuo pradedančiojo iki profesionalo

Taigi, jūs supratote pagrindus ir norite toliau tobulėti. Koks turėtų būti jūsų mokymosi kelias?

Pradėkite nuo paprastų dalykų: įdiekite Minikube, paleiskite kelis paprastus deployment’us, pažaiskite su Service tipais (ClusterIP, NodePort, LoadBalancer). Supratę šiuos pagrindus, pereikite prie sudėtingesnių temų.

Išmokite dirbti su ConfigMaps ir Secrets – tai būdai valdyti konfigūraciją ir slaptuosius duomenis. Tada pereikite prie StatefulSets – tai skirta aplikacijoms, kurioms reikia išlaikyti būseną (kaip duomenų bazės).

Įsigilinkite į networking: kaip veikia Kubernetes tinklas, kas yra Ingress, kaip veikia Network Policies. Tai viena iš sudėtingiausių Kubernetes sričių, bet labai svarbi.

Išmokite apie storage: Persistent Volumes, Persistent Volume Claims, Storage Classes. Kaip užtikrinti, kad jūsų duomenys išliktų net jei Pod’as „numirtų”.

Pažinkite ekosistemą: Helm (paketų valdytojas Kubernetes), Kustomize (konfigūracijos valdymas), Operators (sudėtingų aplikacijų valdymas), Service Mesh (Istio, Linkerd).

Praktikuokitės su realiais projektais. Pabandykite perkelti kokią nors savo aplikaciją į Kubernetes. Susidursite su realiais iššūkiais, ir būtent tada labiausiai išmoksite.

Skaitykite oficialią dokumentaciją – ji tikrai gera. Sekite Kubernetes blog’ą, žiūrėkite KubeCon konferencijų įrašus. Bendruomenė yra aktyvi ir dalijasi daug vertingos informacijos.

Ir svarbiausia – nebijokite klysti. Kubernetes yra sudėtinga sistema, ir net patyrę specialistai kartais susiduria su keistais klaidų pranešimais. Kiekviena klaida yra mokymosi galimybė. Laimei, su Minikube ar Kind galite laisvai eksperimentuoti – jei ką nors sugadinsite, tiesiog ištrinkite klasterį ir sukurkite naują.

Kubernetes orkestravimas iš pradžių gali atrodyti kaip kopimas į kalną, bet kai pasieksite viršūnę ir pamatysite, ką galite pasiekti su šia technologija, suprasite, kad kelionė buvo verta. Tai įrankis, kuris tikrai keičia tai, kaip kuriame ir diegiame aplikacijas. Pradėkite mažai, mokykitės nuosekliai, ir netrukus Kubernetes taps natūralia jūsų darbo dalimi. Sėkmės jūsų orkestravimo kelionėje!

Daugiau

Fluentd logų kolektorius