Software house
Prestavba virtualizovaného Kubernetes klastra — z k3s na RKE2, GitOps, SSO a observabilita
Interný k3s klaster na virtualizácii sa potichu stal produkčnou platformou: ručne skladaný ceph-csi, ad-hoc kubectl deploye, roztrúsené metriky a logy, zdieľané kubeconfigy a RBAC typu "cluster-admin alebo nič". Za deväť týždňov sme ho presunuli na RKE2, Rook-Ceph, ArgoCD GitOps, Harbor, Grafana stack pre metriky/logy/traces, Keycloak SSO, namespace RBAC podľa group claimov a Renovate pre priebežné aktualizácie platformy.
- Trvanie
- 9 týždňov
- Odvetvie
- Software house
- Technológie
- RKE2 Proxmox VE Ansible Rook-Ceph ArgoCD Harbor Prometheus Mimir Grafana Loki Tempo Keycloak Renovate
Problém
K3s klaster na virtualizovanej infraštruktúre potichu vyrástol do tímovej de-facto internej platformy — desiatka produkčných aplikácií — bez toho, aby sa aj spravoval ako platforma. ceph-csi sa pripájal na externý Ceph klaster pre perzistentné volumes. Prometheus a Grafana existovali len čiastočne; logy boli roztrúsené; traces neboli vôbec. Deploy bežal ad-hoc cez kubectl apply z notebookov. Prístup do klastra znamenal kubeconfigy posielané medzi ľuďmi; prístup do aplikácií zas samostatných používateľov a heslá v každej appke. RBAC bol prakticky "cluster-admin alebo nič". Verzie nástrojov sa rozišli a "upgradneme to budúci kvartál" malo dva roky.
Riešenie
Deväťtýždňová spolupráca. Poradie bolo dôležité: najprv control plane klastra a storage, potom GitOps a registry, následne vrstva pre metriky, logy a traces, identity a RBAC, na záver automatizácia.
k3s → RKE2, in place
- Napísané Ansible playbooky, ktoré provisionujú VM klastra na Proxmoxe (template clone, cloud-init, sieť a disk layout) a následne inicializujú HA RKE2 control plane a pridávajú workery — kompletná prestavba klastra od nuly je teraz spustenie jedného playbooku
- Postavený nový RKE2 klaster na rovnakej virtualizácii, dimenzovaný podľa dvanástich mesiacov vyťaženia k3s
- Workloady migrované namespace po namespace cez cordon/drain na k3s a následné nasadenie na RKE2; PVC sa riešili cez storage migráciu nižšie
- K3s klaster bežal paralelne týždeň ako soak test pred dekomisáciou
ceph-csi → Rook-Ceph
- Ceph integrácia presunutá do klastra pod Rook — rovnaký externý Ceph klaster pre dáta, ale spravovaný cez Rook operátory namiesto ručne skladaného ceph-csi
- PVC migrované cez rbd snapshot → restore do novej StorageClass; výpadok po aplikáciách v jednotkách minút
- Storage konfigurácia odvtedy žije v rovnakom GitOps toku ako všetko ostatné
GitOps cez ArgoCD
- ArgoCD nainštalovaný v klastri, jeden app-of-apps pre každé prostredie
- Každý workload v klastri — systémové add-ony, observabilita, interné aplikácie — presunutý do git repozitára s overlaymi pre jednotlivé prostredia
- Vzor „spravil som kubectl apply z laptopu" prestal existovať
Harbor
- Self-hosted Harbor ako pull-through proxy klastra a zároveň tímový zdroj pravdy pre container image
- Podpisovanie image-ov, vulnerability scanning a per-project RBAC naviazané na rovnaké OIDC identity ako všade inde
Modernizovaná observabilita
- Prometheus v klastri; Mimir za ním pre dlhodobé multi-tenant ukladanie metrík
- Loki pre logy, Tempo pre traces — jedna Grafana nad všetkými štyrmi backendmi
- Exemplary prepojené naprieč stackom: z metriky skok na trace, z trace spanu skok na log riadok, z log riadku späť na metriku — on-call nemusí uprostred incidentu prepínať nástroje
- SLO alerting s runbookami priamo z každého alertu; legacy Prometheus pravidlá auditované a buď ponechané, opravené alebo zmazané
Identity a RBAC
- Keycloak ako jediný OIDC provider; kube-apiserver naň zapojený pre kubectl login — žiadne zdieľané kubeconfigy
- Rovnaký Keycloak realm zapojený do ArgoCD, Harboru, Grafany a každej internej aplikácie v klastri — jeden login, jedno miesto na zrušenie prístupu
- Granulárny namespace RBAC: roly definované v gite, väzby skupina→namespace riadené Keycloak group claimami, takže onboarding/offboarding je zmena Keycloak skupiny, nie patch klastra
Renovate
- Self-hosted Renovate skenujúci GitOps repozitár, Kustomize bases aj verzie platformových nástrojov (RKE2, Rook, ArgoCD, Harbor, Grafana, Prometheus, Mimir, Loki, Tempo, Keycloak)
- Renovate navrhne version bump, GitOps ho po merge MR-ka aplikuje — verzionovanie prestáva byť „problém na budúci kvartál"
Výsledok
- Klaster na podporovanom RKE2, storage na Rook-Ceph, každý workload spravovaný cez ArgoCD
- Jeden Grafana pohľad naprieč metrikami, logmi a traces s exemplarmi, ktoré ich prepájajú
- Jeden identity provider pre kubectl, ArgoCD, Harbor, Grafanu aj každú internú aplikáciu v klastri
- Namespace RBAC definovaný v gite a riadený členstvom v Keycloak skupinách — onboarding/offboarding je jediná zmena na správnom mieste
- Renovate drží platformový stack aktuálny; verzie nástrojov sa medzi spoluprácami prestávajú rozchádzať
Čoho som sa zámerne nedotkol
Existujúce CI tímu ostalo — produkovalo kontajnerové image, ktoré sa už pushovali do nového Harboru, a spolupráca bola o platforme, nie o build pipeline. Aplikačné funkcionality a optimalizácia nákladov boli mimo rozsahu; to sú samostatné témy.