Preskočiť na obsah
$ invictus-solutions
EN SK
← Späť na všetky prípadové štúdie

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.