Како да примените апликације у Кубернетес-у

Kubernetes se ističe kao jedna od najkorišćenijih platformi za automatizaciju procesa postavljanja, skaliranja i upravljanja kontejnerizovanim aplikacijama unutar klastera hostova ili čvorova.

Ovaj tekst će detaljnije objasniti jedan od ključnih objekata u Kubernetesu: implementaciju (Deployment). Cilj je da se razume kako funkcioniše, kao i kako se kreira, ažurira i briše.

Šta je Deployment?

Deployment je tip objekta koji se koristi za pokretanje Podova. Kubernetes preporučuje korišćenje implementacija za aplikacije koje nemaju stanje (stateless). Bez Deploymenta, bilo bi neophodno ručno kreirati, ažurirati i brisati više Podova, što bi predstavljalo veliki izazov, posebno za veći broj Podova.

Deployment definiše jedan objekat u YAML formatu, koji ne samo da kreira Podove, već i obezbeđuje da su ažurni i da rade. Takođe, omogućava jednostavno automatsko skaliranje aplikacija. Dakle, Deployment se koristi za skaliranje, primenu i vraćanje na prethodne verzije aplikacija u Podovima.

Deployment informiše Kubernetes o broju replika Podova koje želimo da pokrenemo, a Kubernetes se stara o ostalom. Povezani kontroler kreira ReplicaSet na osnovu konfiguracije Deploymenta. Kontroler povezan sa ReplicaSetom generiše niz Podova iz konfiguracije ReplicaSeta.

Prednosti upotrebe Deploymenta, umesto direktnog kreiranja ReplicaSeta, su:

  • Istorija objekta: svaka izmena objekta (putem komandi „apply“ ili „edit“) kreiraće rezervnu kopiju prethodne verzije.
  • Upravljanje uvođenjem i vraćanjem: moguće je vratiti se na prethodnu konfiguraciju, zahvaljujući prethodno navedenoj istoriji.

Kreiranje Deploymenta

Postoje dva načina za kreiranje Kubernetes Deploymenta:

Imperativna metoda

Kubernetes API pruža direktan, imperativni pristup koji ne zahteva konfiguracione datoteke ili manifeste u YAML formatu. U ovom pristupu, korisnik jednostavno navodi šta želi da postigne, a Kubernetes preuzima odgovornost za definisanje koraka potrebnih za ostvarenje željenog rezultata.

Za korišćenje imperativne metode, koristite sledeću komandu:

kubectl create deployment nginx-deployment --image nginx --port=80

Deklarativna metoda

U ovoj metodi, sve se mora deklarisati, a Kubernetes samo čita te definicije i kreira tačno ono što je navedeno ili deklarisano.

Za deklarativno kreiranje Deploymenta, potrebno je napraviti YAML fajl.

YAML fajl za Deployment pod imenom new_deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  #Definiše broj kopija Podova
  replicas: 3
  #Bira Podove kojima Deployment upravlja
  selector:
    #Povezuje se sa definisanim labelama
    matchLabels:
      deploy: example
  template:
    metadata:
      #Definiše labele na Podu
      labels:
        deploy: example
    spec:
      containers:
        - name: nginx
          image: nginx:1.20.2 

U ovom YAML fajlu, nakon što definišete verziju Kubernetes API-ja, tip objekta koji kreirate i ime Deploymenta, postoji sekcija sa specifikacijama. U ovoj sekciji, prvo se definiše ključ „replicas“, koji označava broj instanci Poda koje Deployment treba da održava aktivnim.

Koristite selektor labela da biste identifikovali Podove u Deploymentu. Možete koristiti labelu za Deployment, koja govori da su svi Podovi koji odgovaraju ovim labelama grupisani u okviru Deploymenta.

Nakon toga, imate objekat šablona gde se nalazi model Poda unutar specifikacije Deploymenta. Kada Deployment kreira Podove, on ih kreira koristeći ovaj šablon. Specifikacija standardnog Poda se nalazi pod ključem „template“.

Ovim Deploymentom, Nginx slike sa datim tagom će biti primenjene u Podovima. Takođe, treba obratiti pažnju na to da je Pod jedinica za skalabilnost u Kubernetesu, pa je potrebno razmisliti o obrascu koji se želi koristiti ako se u isti Pod postavlja nekoliko kontejnera.

Zatim, primenite YAML fajl new_deployment.yaml koristeći sledeću komandu:

kubectl apply -f new_deployment.yaml

Nakon nekoliko sekundi, možete proveriti status Deploymenta koristeći sledeću komandu:

kubectl get all

Preuzimanje i ažuriranje Deploymenta

Treba napomenuti da su kreirani Podovi, Deployment i ReplicaSet. Dakle, Deployment uvek kreira i upravlja ReplicaSetom. Sada se može koristiti sledeća komanda za opisivanje Deploymenta:

kubectl describe deployment nginx-deployment 

Sada imate kompletan opis Deploymenta. Ističe strategiju koja se koristi za kreiranje/reizgradnju Podova kada je ažuriranje definisano kao RollingUpdate.

RollingUpdate strategija omogućava urednu migraciju sa jedne verzije aplikacije na noviju verziju. To je podrazumevana strategija koja se koristi u Kubernetesu.

Pored toga, postoje i sledeće strategije:

  • Recreate: Ukida trenutno pokrenute instance Poda i ‘ponovo ih kreira’ sa novom verzijom;
  • Plavo/zeleno: Ova strategija kreira dva odvojena, ali identična okruženja. U plavom okruženju aplikacija radi kao što je bila, dok u zelenom okruženju aplikacija radi kako će biti u budućnosti;
  • Canary: Strategija primene gde je podskup korisnika uključen u postepeno izdavanje aplikacije ili usluge.

Ako se odlučite za „rolling update“, možete konfigurisati njegovo ponašanje u odnosu na broj željenih replika.

  • maxSurge omogućava da naznačite (u procentima ili apsolutnim brojevima) koliko Podova može da kreira pored broja replika koje su trenutno konfigurisane.
  • maxUnavailable omogućava da naznačite (u procentima ili apsolutnim brojevima) koliko Podova može biti „nedostupno“ tokom ažuriranja, u odnosu na broj konfigurisanih replika.

U zavisnosti od aplikacije i automatskog skalera, ove konfiguracije će vam omogućiti da osigurate kvalitet usluge (QoS) ili ubrzate primenu.

Zatim je potrebno skalirati Podove na 10 i promeniti tag Nginx slike na najnoviji.

kubectl scale deployment nginx-deployment --replicas=10

Može se primetiti da je 5 kontejnera u procesu kreiranja, a od 10 Podova, 5 ih je dostupno.

Nakon nekoliko sekundi, koristite sledeću komandu:

kubectl get all

Ovde se vidi da su svi Podovi kreirani i da su kontejneri pokrenuti.

Brisanje Deploymenta

Za brisanje Kubernetes Deploymenta, mogu se koristiti sledeće komande:

kubectl delete deploy nginx-deployment 
kubectl delete deploy new_deployment.yaml

Helm: Pojednostavljivanje Deploymenta

Kada je potrebno primeniti složenu aplikaciju koja koristi desetine ili čak stotine Kubernetes resursa, kubectl alat postaje nepraktičan, zbog čega je razvijen Helm. Helm je menadžer paketa za Kubernetes, zasnovan na kubectl-u, koji pojednostavljuje proces primene aplikacija.

U Helm rečniku, aplikacija se naziva „release“. Povezana je sa „chartom“, odnosno kolekcijom konfiguracionih fajlova u YAML formatu koji sadrže globalne promenljive i šablone koji opisuju Kubernetes resurse.

Zaključak

Deployment je ključan Kubernetes objekat. S obzirom da velika moć podrazumeva veliku odgovornost, potrebno je biti oprezan pri njegovoj konfiguraciji, kako bi se izbeglo neželjeno ponašanje. Za detaljnije informacije o konfiguraciji Deploymenta, možete pogledati Kubernetes dokumentaciju.

Takođe, preporučuje se istraživanje nekih od najboljih Kubernetes tutorijala za učenje od nule i usavršavanje znanja.