May 9, 2025

Š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.

Šta je Secret u Kubernetesu?

 Secret je Kubernetes objekat za čuvanje poverljivih podataka, kao što su:

  • lozinke

  • API tokeni

  • SSH ključevi

  • TLS sertifikati

Ukratko: Secret = bezbedan način za čuvanje osetljivih informacija u klasteru.


🧠 Zašto se koristi?

  • Da ne hardcoduješ poverljive podatke u YAML fajlove, slike (image-e), ili promenljive okruženja.

  • Kubernetes može da upravlja tim podacima sigurnije nego sa običnim ConfigMap-ovima:

    • Sekreti se čuvaju u base64 kodiranju

    • Mogu se šifrovati na disku (ako je tako podešeno)

    • Imaju stroža pravila pristupa (RBAC)


📄 Primer Secret fajla:


apiVersion: v1 kind: Secret metadata: name: moj-secret type: Opaque data: username: dXNlcm5hbWU= # base64("username") password: cGFzc3dvcmQ= # base64("password")

Možeš napraviti Secret i komandno:


kubectl create secret generic moj-secret \ --from-literal=username=username \ --from-literal=password=password

🧩 Kako se koristi u Podu?

1. ✅ Kao environment promenljive:


spec: containers: - name: moj-kontejner env: - name: DB_USER valueFrom: secretKeyRef: name: moj-secret key: username

2. 📁 Kao fajlovi u volume-u:


spec: volumes: - name: secret-vol secret: secretName: moj-secret containers: - name: moj-kontejner volumeMounts: - name: secret-vol mountPath: /etc/secret

Fajlovi /etc/secret/username i /etc/secret/password biće dostupni u kontejneru.


⚠️ Napomena:

  • Iako su "secure", Secret-i su base64 kodirani, a ne enkriptovani po defaultu.

    • Šifrovanje na disku moraš eksplicitno da uključiš.

  • Pristup Secret-ima treba kontrolisati putem RBAC pravila.

Šta je ConfigMap u Kubernetesu?

 ConfigMap je objekat koji služi za čuvanje konfiguracionih podataka (u obliku parova ključ-vrednost), odvojeno od same aplikacije.

Ukratko: ConfigMap = spoljašnja konfiguracija za tvoju aplikaciju.


🧠 Zašto se koristi?

  • Omogućava da aplikacija ostane ista, a konfiguracija se menja bez rekreiranja slike (image-a).

  • Idealno za stvari kao što su:

    • Konfiguracioni fajlovi

    • API ključevi (ne osjetljivi – za sensitive podatke koristi Secret)

    • Promenljive okruženja (env vars)

    • Argumenti komandne linije


📄 Primer ConfigMap fajla:


apiVersion: v1 kind: ConfigMap metadata: name: moja-konfiguracija data: APP_MODE: "production" LOG_LEVEL: "info"

🧩 Kako se koristi?

Možeš je "ubaciti" u Pod na nekoliko načina:

1. ✅ Kao environment promenljive:


spec: containers: - name: moj-kontejner image: myapp envFrom: - configMapRef: name: moja-konfiguracija

U kontejneru ćeš imati promenljive APP_MODE=production, LOG_LEVEL=info.

2. 📁 Kao fajlovi u volume-u:


spec: volumes: - name: config-vol configMap: name: moja-konfiguracija containers: - name: moj-kontejner volumeMounts: - name: config-vol mountPath: /etc/config

Ključevi iz ConfigMap biće fajlovi u /etc/config/.


⚠️ Napomena:

  • ConfigMap nije za sensitive podatke (lozinke, tokeni) → za to koristi Secret.

  • Ako promeniš ConfigMap, moraš restartovati Pod da bi video nove vrednosti (osim ako koristiš reload mehanizam u aplikaciji).


🗺️ Analogija:

Zamisli da ti je aplikacija kao motor, a ConfigMap kao tabla sa dugmićima (parametrima) koje menjaš bez rastavljanja motora.