May 9, 2025

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

Šta je Ingress u Kubernetesu?

 Ingress je objekat koji omogućava spoljašnji HTTP/HTTPS pristup aplikacijama koje rade unutar klastera – preko URL-a i domena.

Ukratko: Ingress = pametan HTTP/HTTPS "ulaz" u tvoj klaster.


🧱 Kako radi?

  • Radi iznad Service-a.

  • Koristi se da route-uje (prosleđuje) HTTP(S) zahteve ka odgovarajućim servisima na osnovu:

    • URL putanje (npr. /app1, /admin)

    • Naziva domena (npr. app.mojsa.it, admin.mojsa.it)

  • Radi preko Ingress kontrolera – softvera koji obrađuje pravila iz Ingress objekta (npr. nginx ingress controller, traefik, HAProxy...)


🧠 Zašto je važan?

  • Bez Ingress-a moraš da koristiš NodePort ili LoadBalancer za svaki servis posebno.

  • Sa Ingress-om možeš da imaš jednu tačku ulaza (npr. jedan domen) i da rutiraš sve unutar klastera elegantno.


📄 Primer YAML fajla:


apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: primer-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: app.mojdomen.com http: paths: - path: / pathType: Prefix backend: service: name: moj-servis port: number: 80

Ovo znači:

  • Svi zahtevi na http://app.mojdomen.com/ biće prosleđeni moj-servis na portu 80.