<?xml version="1.0" encoding="utf-8"?>
<Gradivo ID="183830" NadgradivoID="0" NRID="28787434" OceID="0" DomainUrl="https://repozitorij.uni-lj.si/" IzpisPolniUrl="https://repozitorij.uni-lj.si/IzpisGradiva.php?lang=slv&amp;id=183830" StOgledov="319" StPrenosov="220" StOcen="0" VsotaOcen="0" DatumIzvoza="2026-11-14 20:18:59" OcenaSkupna="0" StPodgradiv="0" StudijskiProgramEvsID="1000316" JeIndeksirano="0" JeVecAvtorjev="0" DovoliZahtevkeZaDostop="0">
  <PID Url="http://hdl.handle.net/20.500.12556/RUL-183830">20.500.12556/RUL-183830</PID>
  <Naslov>Automated and secure application deployment using GitOps and Kubernetes</Naslov>
  <Podnaslov></Podnaslov>
  <TujJezik_Naslov>Avtomatizirano in varno nameščanje aplikacij z uporabo GitOps in Kubernetesa</TujJezik_Naslov>
  <TujJezik_Podnaslov></TujJezik_Podnaslov>
  <Opis>Deploying containerized applications to Kubernetes typically requires a lot of
manual work. Teams write scripts, run commands by hand, and are uncertain
whether the cluster matches their configuration. Security checks are often treated
as a separate step or skipped entirely, which means vulnerabilities in code, dependencies, or Kubernetes manifests can reach production unnoticed.
This thesis presents a fully automated deployment pipeline that combines
GitOps with integrated security scanning. The desired state of the system is
stored in git, and Argo CD, running inside the cluster, continuously keeps the
cluster in sync with it. The application, a blog CMS built with React, Node.js,
and PostgreSQL, is packaged as a Helm chart. A CI/CD pipeline in GitHub
Actions runs three security checks before every deployment: SonarQube for static
code analysis, Snyk for dependency vulnerability scanning, and KubeLinter for
Kubernetes configuration validation. Only after all checks pass does the pipeline
build the Docker images, push them to the registry, and update the Helm chart.
Argo CD then detects the change and rolls it out automatically. The cluster also
uses Keycloak and Rancher for centralized authentication and role-based access
control.
The result is a system where every deployment is triggered by a git commit,
every version is traceable, and nothing reaches the cluster without passing security
checks first.</Opis>
  <TujJezik_Opis>Sodobne aplikacije se vse pogosteje pakirajo v vsebnike (angl. containers)
in nameščajo na gruče Kubernetes.
Kubernetes omogoča avtomatizirano
nameščanje, skaliranje in upravljanje vsebniških aplikacij, vendar sam proces dostave kode od razvijalca do gruče pogosto še vedno vključuje veliko ročnega dela.
Ekipe pišejo skripte za nameščanje, ročno izvajajo ukaze in pogosto nimajo preprostega načina, da bi preverile, ali stanje v gruči dejansko ustreza temu, kar je
zapisano v konfiguracijskih datotekah. Poleg tega se varnostni pregledi pogosto
obravnavajo ločeno od procesa nameščanja ali pa se jih povsem preskoči. To
pomeni, da lahko ranljivosti v izvorni kodi, zastarele odvisnosti ali napačno konfigurirani Kubernetes viri pridejo v produkcijsko okolje, ne da bi jih kdo opazil.
Namen tega magistrskega dela je načrtovati in implementirati popolnoma avtomatiziran cevovod (angl. pipeline) za nameščanje vsebniške aplikacije na Kubernetes, ki sledi načelom GitOps in vključuje varnostno pregledovanje kot del
delovnega procesa. Cilj je pokazati, da lahko avtomatizirano nameščanje in avtomatizirano varnostno pregledovanje delujeta skupaj, brez da bi to upočasnilo
razvojni proces. 

Magistrsko delo najprej predstavi arhitekturo Kubernetes, vključno z glavnimi komponentami gruče: kontrolno ravnino (angl. control plane) z aplikacijskim programskim vmesnikom (angl. Application Programming Interface - API),
razporejevalnikom (angl. scheduler) in krmilniki (angl. controllers), ter delovnimi
vozlišči (angl. worker node), kjer tečejo aplikacijski vsebniki v enotah, imenovanih
podi. Opisani so ključni koncepti, kot so imenski prostori (angl. namespace) za
logično ločevanje virov, konfiguracija z objekti ConfigMap in Secret, mrežne poltike (angl. Network Policy) za nadzor prometa med podi ter mehanizmi za trajno
shranjevanje podatkov. Predstavljeni so tudi načini izpostavljanja aplikacij zunanjim uporabnikom prek storitev (angl. Service) in vstopnih točk (angl. Ingress),
varnostni mehanizmi za avtentikacijo in avtorizacijo uporabnikov ter strategije
za postopno posodabljanje aplikacij.
V nadaljevanju je predstavljen koncept GitOps, ki razširja najboljše prakse
DevOps na upravljanje infrastrukture. Po principih GitOps, git repozitorij postane edini vir resnice za želeno stanje celotnega sistema. Namesto da bi cevovod
za neprekinjeno integracijo in namestitev (angl. Continuous Integration / Continuous Delivery - CI/CD) od zunaj potiskal spremembe v gručo, krmilnik znotraj
gruče nenehno primerja dejansko stanje z definicijami v gitu in po potrebi izvede
uskladitev. Vsaka sprememba je zabeležena v zgodovini gita, kar naredi sistem
sledljiv in omogoča enostavno vračanje na prejšnja stanja.
Argo CD je ogrodje, ki implementira GitOps model s pristopom vlečenja
(angl. pull-based). Teče kot agent znotraj Kubernetes gruče, spremlja git repozitorije in samodejno usklajuje stanje gruče z definicijami v repozitoriju. Za
pakiranje Kubernetes virov se uporablja Helm, orodje za upravljanje predlog,
ki omogoča definiranje vseh Kubernetes objektov, ki jih aplikacija potrebuje, z
nastavljivimi vrednostmi za različna okolja.
Implementacija
Praktični del dela prikazuje celoten sistem na primeru trinivojske spletne aplikacije za upravljanje bloga (Blog CMS). Aplikacija je sestavljena iz React uporabniškega vmesnika, Node.js zalednega sistema z REST API-jem ter PostgreSQL podatkovne baze. Vsaka komponenta je pakirana kot ločena Docker slika in
nameščena na Kubernetes gručo.
Gruča je sestavljena iz glavnega vozlišča (angl. master node), delovnega vozlišča in zunanjega izrvanalca obremenitve (angl. load balancer). Za centralizirano avtentikacijo in avtorizacijo uporabnikov sta nameščena Keycloak kot ponudnik identitete (angl. Identity Provider) in Rancher kot upravljalna platforma
za Kubernetes. Keycloak hrani uporabniške identitete in članstva v skupinah ter
omogoča večfaktorsko avtentikacijo. Rancher preverja uporabnike prek Keycloaka in preslikava njihove skupine v Kubernetes vloge RBAC, s čimer zagotavlja enotno prijavo (angl. Single Sign-On - SSO) za celotno platformo.
Aplikacija je pakirana kot Helm chart, ki definira vse potrebne Kubernetes
vire: imenski prostor, konfiguracije, skrivnosti, trajne nosilce podatkov (angl. Persistent Volume), storitve, vstopne točke, mrežne politike in horizontalni avtomatski skalator podov. Konfiguracija Argo CD uporablja vzorec aplikacija-aplikacij
(angl. app-of-apps), kar pomeni, da je dodajanje ali odstranjevanje namestitve
tako preprosto kot dodajanje ali brisanje datoteke v formatu YAML.
Cevovod CI/CD je zgrajen z GitHub Actions in pokriva celoten življenjski
cikel spremembe kode. Ob vsakem potiskanju na nadzorovano vejo se samodejno
zaženejo trije varnostni pregledi vzporedno: SonarQube izvede statično analizo
izvorne kode za odkrivanje napak in ranljivosti, Snyk pregleda odvisnosti projekta
za znane varnostne težave, KubeLinter pa preveri Helm chart glede na najboljše
prakse za Kubernetes. Šele ko se vsi trije pregledi uspešno izvedejo, cevovod
zgradi Docker slike, jih potisne v register in posodobi Helm chart z novimi oznakami slik. Argo CD nato zazna spremembo in samodejno izvede posodobitev v
gruči.
Rezultati in zaključki
Končni sistem deluje tako, da razvijalec spremeni kodo aplikacije in potisne
spremembe v ciljno vejo repozitorija. Cevovod zazna potisk, zažene varnostne
preglede, zgradi nove Docker slike in jih potisne v Docker Hub z oznako, ki ustreza
zgoščenemu (angl. Secure Hash Algorithm - SHA) zapisu spremembe. Nato posodobi datoteko values.yaml v Helm chartu z novo oznako slike in to spremembo
zapiše nazaj v repozitorij. Argo CD, ki je konfiguriran prek vzorca aplikacijaaplikacij, zazna posodobljeno datoteko values.yaml, primerja novo stanje z viri,
ki trenutno tečejo v gruči, in izvede uskladitev.
Delo pokaže, da sta GitOps in varnost lahko tesno povezana. Z uporabo Gita
kot edinega vira resnice in z avtomatizacijo varnostnih pregledov postane veliko
težje nenamenoma namestiti nekaj pokvarjenega ali nevarnega.</TujJezik_Opis>
  <KljucneBesede>
    <Beseda>Kubernetes</Beseda>
    <Beseda>GitOps</Beseda>
    <Beseda>Argo CD</Beseda>
    <Beseda>Helm</Beseda>
    <Beseda>CI/CD</Beseda>
    <Beseda>security scanning</Beseda>
    <Beseda>containerization</Beseda>
    <Beseda>DevOps</Beseda>
  </KljucneBesede>
  <TujJezik_KljucneBesede>
    <Beseda>Kubernetes</Beseda>
    <Beseda>GitOps</Beseda>
    <Beseda>Argo CD</Beseda>
    <Beseda>Helm</Beseda>
    <Beseda>CI/CD</Beseda>
    <Beseda>varnostno pregledovanje</Beseda>
    <Beseda>vsebniki</Beseda>
    <Beseda>DevOps</Beseda>
    <Beseda>magisteriji</Beseda>
  </TujJezik_KljucneBesede>
  <Potrjeno>true</Potrjeno>
  <JeZaklenjeno>false</JeZaklenjeno>
  <JeRecenzirano>false</JeRecenzirano>
  <Zaloznik>D. Keserović</Zaloznik>
  <Izvor></Izvor>
  <Jezik ID="1033" ISO639-3="eng">Angleški jezik</Jezik>
  <TujJezik ID="1060" ISO639-3="slv">Slovenski jezik</TujJezik>
  <Povezave></Povezave>
  <Pokrivanje></Pokrivanje>
  <CasovnoPokritje></CasovnoPokritje>
  <AvtorskePravice></AvtorskePravice>
  <VrstaGradiva ID="mb22" DRIVER="info:eu-repo/semantics/masterThesis">Magistrsko delo/naloga</VrstaGradiva>
  <DatumVstavljanja>2026-06-19 12:05:38</DatumVstavljanja>
  <DatumObjave>2026-06-19 12:05:50</DatumObjave>
  <DatumSpremembe>2026-06-24 12:47:58</DatumSpremembe>
  <DatumTrajnegaHranjenja>0000-00-00 00:00:00</DatumTrajnegaHranjenja>
  <LetoIzida>2026</LetoIzida>
  <LetoIzidaDo>0</LetoIzidaDo>
  <KrajIzida>Ljubljana</KrajIzida>
  <LetoIzvedbe>2026</LetoIzvedbe>
  <KrajIzvedbe>Ljubljana</KrajIzvedbe>
  <Opomba></Opomba>
  <StStrani>1 spletni vir (1 datoteka PDF (XXVI, 102 str.))</StStrani>
  <StevilcenjeNivo1></StevilcenjeNivo1>
  <StevilcenjeNivo2></StevilcenjeNivo2>
  <Kronologija></Kronologija>
  <Patent_Stevilka></Patent_Stevilka>
  <Patent_DatumVeljavnosti>0000-00-00</Patent_DatumVeljavnosti>
  <VerzijaDokumenta>NiDoloceno</VerzijaDokumenta>
  <StatusObjaveDrugje>NiDoloceno</StatusObjaveDrugje>
  <VrstaStroskaObjave>NiDoloceno</VrstaStroskaObjave>
  <DatumPoslanoVRecenzijo>0000-00-00</DatumPoslanoVRecenzijo>
  <DatumSprejetjaClanka>0000-00-00</DatumSprejetjaClanka>
  <DatumObjaveClanka>0000-00-00</DatumObjaveClanka>
  <EmbargoDo></EmbargoDo>
  <VrstaEmbarga ID="1" Naziv="Takojšnja javna objava" OpenAIREDostop="openAccess"></VrstaEmbarga>
  <Osebe>
    <Oseba ID="161876" Ime="Džana" Priimek="Keserović" AltIme="" VlogaID="70" VlogaNaziv="Avtor" ConorID="420415491" Afiliacija="" ArrsID="" ORCID=""></Oseba>
    <Oseba ID="48722" Ime="Urban" Priimek="Sedlar" AltIme="U. Sedlar" VlogaID="991" VlogaNaziv="Mentor" ConorID="55353699" Afiliacija="" ArrsID="25419" ORCID=""></Oseba>
  </Osebe>
  <Identifikatorji>
    <Identifikator ID="4" Sifra="UDK" Naziv="UDK" URL="">004(043.3)</Identifikator>
    <Identifikator ID="16" Sifra="VisID" Naziv="VisID" URL="">63316</Identifikator>
    <Identifikator ID="3" Sifra="CobissID" Naziv="COBISS_ID" URL="https://plus.cobiss.net/cobiss/si/sl/bib/282708483">282708483</Identifikator>
  </Identifikatorji>
  <Relacije>
  </Relacije>
  <VerzijeGradiva>
  </VerzijeGradiva>
  <Datoteke>
    <Datoteka ID="236103" DatotekaNRID="14716538" NamenDatotekeID="2" NamenDatoteke="Predstavitvena datoteka" FormatDatotekeID="2" FormatDatoteke=".pdf" MIME="application/pdf" IkonaFormata="pdf.png" IkonaFormataPolniUrl="https://repozitorij.uni-lj.si/teme/rulDev/img/fileTypes/pdf.png" VelikostDatoteke="4043890" VelikostDatotekeKratko="3,86 MB" DatumVstavljanja="2026-06-19 12:05:52" JeZbrisana="false" JeJavnoVidna="true" JeIndeksirana="false" JeVidno="true" VidnoOd="01.01.0001" Zaporedje="0">
      <Naziv>Keserovic_Dzana_-_Avtomatizirano_in_varno_namescanje_aplikacij_z_uporabo_GitOps_in_Kubernetesa.pdf</Naziv>
      <OrgNaziv>Keserovic_Dzana_-_Avtomatizirano_in_varno_namescanje_aplikacij_z_uporabo_GitOps_in_Kubernetesa.pdf</OrgNaziv>
      <URL></URL>
      <Opis></Opis>
      <OpisTujJezik></OpisTujJezik>
      <UrlObdelave></UrlObdelave>
      <FrekvencaAzuriranjaID>1</FrekvencaAzuriranjaID>
      <Verzija></Verzija>
      <MD5>43C2EBAFAAC0E090FF1996DB52D323C1</MD5>
      <SHA256>8ca1948adee50987cf548d67b9cd8deccdeb5b34a537eb5c9ac5728b5af48cce</SHA256>
      <UUID>62d739f8-6bc6-11f1-9b0d-0050569b8976</UUID>
      <PID></PID>
      <PrenosPolniUrl>https://repozitorij.uni-lj.si/Dokument.php?lang=slv&amp;id=236103</PrenosPolniUrl>
      <Vsebine>
      </Vsebine>
    </Datoteka>
  </Datoteke>
  <Organizacije>
    <Organizacija OrganizacijaID="27" Kratica="FE" ZavodEvsID="0000060" Logo="" LogoPolniUrl="https://repozitorij.uni-lj.si/teme/rulDev/img/logo/">Fakulteta za elektrotehniko</Organizacija>
  </Organizacije>
  <OrganizacijeVira>
  </OrganizacijeVira>
  <MetodeZbiranjaPodatkov>
  </MetodeZbiranjaPodatkov>
  <TipologijaDela ID="2.09" Koda="2.09" Naziv="Magistrsko delo" SchemaOrg="Thesis"></TipologijaDela>
  <Ostalo>
    <StIrodsDatotek>0</StIrodsDatotek>
    <StDatotekPodTrajnimEmbargom>0</StDatotekPodTrajnimEmbargom>
    <StDatotekZOmejenimDostopom>0</StDatotekZOmejenimDostopom>
  </Ostalo>
</Gradivo>
