May 9, 2025

Šta je Node u Kubernetesu?

 Node je fizički ili virtuelni računar na kojem se pokreću Podovi u Kubernetes klasteru. Node-ovi predstavljaju radnu jedinicu klastera i svaki Node u klasteru pokreće Kubernetes komponente koje omogućavaju pokretanje i upravljanje aplikacijama.

Ukratko: Node = računar koji pokreće Podove u klasteru.


🔧 Šta Node radi?

Svaki Node ima nekoliko ključnih komponenti:

  1. Kubelet – Agent koji pokreće na svakom Node-u i brine se da su Podovi pokrenuti prema specifikacijama.

  2. Kube Proxy – Odgovoran za mrežno rutiranje unutar klastera.

  3. Container Runtime – Softver koji omogućava pokretanje kontejnera (npr. Docker, containerd).


🧠 Ključne karakteristike Node-a:

  • Svaki Node može da pokreće više Podova.

  • Node-ovi mogu biti "master" ili "worker":

    • Master Node (ili Control Plane) upravlja celokupnim klasterom, raspoređuje resurse, prati stanje.

    • Worker Node (obično više) pokreće Podove koji čine aplikacije.


📋 Prikaz Node-a:

Možeš da proveriš sve Node-ove u klasteru koristeći komandu:


kubectl get nodes

Izlaz može izgledati ovako:


NAME STATUS ROLES AGE VERSION node1 Ready master 5d v1.24.0 node2 Ready <none> 5d v1.24.0 node3 Ready <none> 5d v1.24.0
  • STATUS pokazuje stanje Node-a (da li je spreman, preopterećen, itd.)

  • ROLES prikazuje ulogu Node-a: master ili worker


🗺️ Analogija:

Zamisli da je Kubernetes klaster kao fabrika, a Node je kao mašina u toj fabrici koja obavlja deo posla. Dok fabriku (klaster) vodi menadžer (master), mašina (Node) radi konkretan posao — pokreće proizvodnju (Podove).


🧩 Kako Node komunicira sa Kubernetesom?

  • Kubelet na Node-u šalje informacije o stanju Podova nazad Master Node-u.

  • Kube Proxy omogućava da Podovi komuniciraju međusobno i sa spoljnim svetom.

  • Container Runtime (kao Docker) pokreće kontejnere koji su unutar Podova.

Šta je Deployment? Šta je StatefulSet?

 Deployment je Kubernetes objekat koji upravlja stateless aplikacijama, tj. aplikacijama koje ne zavise od svog identiteta i ne čuvaju stanje lokalno.

Ukratko: Deployment = automatsko skaliranje i obnavljanje "običnih", zamjenjivih Podova.

🔧 Šta radi Deployment:

  • Pokreće željeni broj identičnih Podova

  • Osigurava da uvek ima tačno toliko aktivnih replika

  • Automatski pravi rolling update (postepeno ažuriranje verzije)

  • Vraća prethodnu verziju ako nešto krene po zlu


📄 Primer YAML fajla:


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

Ovo pravi 3 identična Nginx Poda koji mogu da se zamene bilo kad.


🧱 Šta je StatefulSet?

StatefulSet je tip kontrolera za stateful aplikacije — one koje:

  • Trebaju stalni identitet (ime, IP adresu)

  • Imaju stalne podatke koji ne smeju da se izgube

  • Zahtevaju redosled pokretanja i gašenja

Ukratko: StatefulSet = koristiš kad ti treba stabilan, predvidiv red i podaci.


🧠 Ključne razlike naspram Deployments:

DeploymentStatefulSet
Imena PodovaNasumičnaFiksna (ime-0, ime-1...)
IP adreseMogu da se promeneOstaju stabilne
VolumeDeljeniSvaki Pod ima svoj volume
SkaliranjeBilo kojim redosledomU strogoj sekvenci
Primeri upotrebeWeb serveri, APIBaze, Kafka, Redis

📄 Primer YAML za StatefulSet:


apiVersion: apps/v1 kind: StatefulSet metadata: name: redis spec: serviceName: "redis" replicas: 3 selector: matchLabels: app: redis template: metadata: labels: app: redis spec: containers: - name: redis image: redis volumeMounts: - name: redis-data mountPath: /data volumeClaimTemplates: - metadata: name: redis-data spec: accessModes: ["ReadWriteOnce"] resources: requests: storage: 1Gi

Svaki Pod (redis-0, redis-1, redis-2) ima svoj lični disk (PVC) koji se ne briše automatski.


🗺️ Analogija:

  • Deployment = vojska identičnih robota, lako zamenjivih.

  • StatefulSet = red zaposlenih sa imenima, radnim stolom i ličnim fiokama.

Šta su Volume u Kubernetesu?

 Volume u Kubernetesu je mehanizam za čuvanje podataka koje kontejneri mogu da koriste, nezavisno od životnog veka kontejnera.

Ukratko: Volume omogućava deljenje i/ili očuvanje podataka između kontejnera ili između restarta.


❗Zašto je to važno?

  • Kada kontejner umre, sve što je bilo u njegovom fajl sistemu nestaje.

  • Volume omogućava:

    • trajno skladištenje podataka

    • deljenje fajlova između kontejnera u istom Podu

    • učitavanje konfiguracija i tajni (ConfigMap, Secret)

    • spajanje sa eksternim skladištima (npr. NFS, AWS EBS, GlusterFS, itd.)


🧩 Kako se koristi?

Volume se definiše na nivou Pod-a i povezuje sa kontejnerima pomoću volumeMounts.

📄 Primer:


apiVersion: v1 kind: Pod metadata: name: pod-sa-volumom spec: containers: - name: app image: nginx volumeMounts: - name: moj-vol mountPath: /usr/share/nginx/html volumes: - name: moj-vol emptyDir: {}

U ovom primeru:

  • Volume moj-vol je tipa emptyDir (prazan folder koji traje koliko i Pod)

  • Montiran je u /usr/share/nginx/html u kontejneru


📚 Tipovi volumena (neki od najčešćih):

TipOpis
emptyDirPrivremeni folder koji traje koliko i Pod
hostPathFajl ili folder sa host mašine
configMapVolume baziran na ConfigMap
secretVolume baziran na Secret
persistentVolumeClaim (PVC)Povezuje se sa trajnim skladištem (disk, NFS, cloud)
nfs, awsElasticBlockStore, gcePersistentDisk, csiEksterno skladište

🧠 Persistent Volume (PV) i PVC

Za dugotrajno skladištenje koristi se sistem:

  • PV (PersistentVolume) – apstrakcija fizičkog skladišta

  • PVC (PersistentVolumeClaim) – zahtev aplikacije za prostor

Pod ne koristi direktno PV, već pravi PVC koji se onda mapira na PV.


🗺️ Analogija:

Zamisli kontejner kao kamp-prikolica. Sve što je unutra nestaje kad je pomeriš. Volume je kao eksterni kontejner (šupa) ili hard disk koji možeš da priključiš i koristiš nezavisno od same prikolice.