Sodobne aplikacije se vse pogosteje pakirajo v vsebnike (angl. containers)
in nameščajo na gruče Kubernetes.
Kubernetes omogoča avtomatizirano
nameščanje, skaliranje in upravljanje vsebniških aplikacij, vendar sam proces dostave kode od razvijalca do gruče pogosto še vedno vključuje veliko ročnega dela.
Ekipe pišejo skripte za nameščanje, ročno izvajajo ukaze in pogosto nimajo preprostega načina, da bi preverile, ali stanje v gruči dejansko ustreza temu, kar je
zapisano v konfiguracijskih datotekah. Poleg tega se varnostni pregledi pogosto
obravnavajo ločeno od procesa nameščanja ali pa se jih povsem preskoči. To
pomeni, da lahko ranljivosti v izvorni kodi, zastarele odvisnosti ali napačno konfigurirani Kubernetes viri pridejo v produkcijsko okolje, ne da bi jih kdo opazil.
Namen tega magistrskega dela je načrtovati in implementirati popolnoma avtomatiziran cevovod (angl. pipeline) za nameščanje vsebniške aplikacije na Kubernetes, ki sledi načelom GitOps in vključuje varnostno pregledovanje kot del
delovnega procesa. Cilj je pokazati, da lahko avtomatizirano nameščanje in avtomatizirano varnostno pregledovanje delujeta skupaj, brez da bi to upočasnilo
razvojni proces.
Magistrsko delo najprej predstavi arhitekturo Kubernetes, vključno z glavnimi komponentami gruče: kontrolno ravnino (angl. control plane) z aplikacijskim programskim vmesnikom (angl. Application Programming Interface - API),
razporejevalnikom (angl. scheduler) in krmilniki (angl. controllers), ter delovnimi
vozlišči (angl. worker node), kjer tečejo aplikacijski vsebniki v enotah, imenovanih
podi. Opisani so ključni koncepti, kot so imenski prostori (angl. namespace) za
logično ločevanje virov, konfiguracija z objekti ConfigMap in Secret, mrežne poltike (angl. Network Policy) za nadzor prometa med podi ter mehanizmi za trajno
shranjevanje podatkov. Predstavljeni so tudi načini izpostavljanja aplikacij zunanjim uporabnikom prek storitev (angl. Service) in vstopnih točk (angl. Ingress),
varnostni mehanizmi za avtentikacijo in avtorizacijo uporabnikov ter strategije
za postopno posodabljanje aplikacij.
V nadaljevanju je predstavljen koncept GitOps, ki razširja najboljše prakse
DevOps na upravljanje infrastrukture. Po principih GitOps, git repozitorij postane edini vir resnice za ž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 gručo, krmilnik znotraj
gruče nenehno primerja dejansko stanje z definicijami v gitu in po potrebi izvede
uskladitev. Vsaka sprememba je zabeležena v zgodovini gita, kar naredi sistem
sledljiv in omogoča enostavno vračanje na prejšnja stanja.
Argo CD je ogrodje, ki implementira GitOps model s pristopom vlečenja
(angl. pull-based). Teče kot agent znotraj Kubernetes gruče, spremlja git repozitorije in samodejno usklajuje stanje gruče z definicijami v repozitoriju. Za
pakiranje Kubernetes virov se uporablja Helm, orodje za upravljanje predlog,
ki omogoča definiranje vseh Kubernetes objektov, ki jih aplikacija potrebuje, z
nastavljivimi vrednostmi za različna okolja.
Implementacija
Praktični del dela prikazuje celoten sistem na primeru trinivojske spletne aplikacije za upravljanje bloga (Blog CMS). Aplikacija je sestavljena iz React uporabniškega vmesnika, Node.js zalednega sistema z REST API-jem ter PostgreSQL podatkovne baze. Vsaka komponenta je pakirana kot ločena Docker slika in
nameščena na Kubernetes gručo.
Gruča je sestavljena iz glavnega vozlišča (angl. master node), delovnega vozlišča in zunanjega izrvanalca obremenitve (angl. load balancer). Za centralizirano avtentikacijo in avtorizacijo uporabnikov sta nameščena Keycloak kot ponudnik identitete (angl. Identity Provider) in Rancher kot upravljalna platforma
za Kubernetes. Keycloak hrani uporabniške identitete in članstva v skupinah ter
omogoča večfaktorsko avtentikacijo. Rancher preverja uporabnike prek Keycloaka in preslikava njihove skupine v Kubernetes vloge RBAC, s č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 točke, mrež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 življenjski
cikel spremembe kode. Ob vsakem potiskanju na nadzorovano vejo se samodejno
zaženejo trije varnostni pregledi vzporedno: SonarQube izvede statično analizo
izvorne kode za odkrivanje napak in ranljivosti, Snyk pregleda odvisnosti projekta
za znane varnostne težave, KubeLinter pa preveri Helm chart glede na najboljše
prakse za Kubernetes. Šele ko se vsi trije pregledi uspeš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
gruči.
Rezultati in zaključki
Končni sistem deluje tako, da razvijalec spremeni kodo aplikacije in potisne
spremembe v ciljno vejo repozitorija. Cevovod zazna potisk, zažene varnostne
preglede, zgradi nove Docker slike in jih potisne v Docker Hub z oznako, ki ustreza
zgoščenemu (angl. Secure Hash Algorithm - SHA) zapisu spremembe. Nato posodobi datoteko values.yaml v Helm chartu z novo oznako slike in to spremembo
zapiše nazaj v repozitorij. Argo CD, ki je konfiguriran prek vzorca aplikacijaaplikacij, zazna posodobljeno datoteko values.yaml, primerja novo stanje z viri,
ki trenutno tečejo v gruči, in izvede uskladitev.
Delo pokaže, da sta GitOps in varnost lahko tesno povezana. Z uporabo Gita
kot edinega vira resnice in z avtomatizacijo varnostnih pregledov postane veliko
težje nenamenoma namestiti nekaj pokvarjenega ali nevarnega.
|