Architektura mikroservis a kontejnerizace: principy

Architektura mikroservis a kontejnerizace: Principy

Proč mikroservisy a proč právě teď

Architektura mikroservis rozkládá aplikaci na menší služby, které lze nezávisle nasazovat a škálovat a které spolu komunikují prostřednictvím dobře definovaných rozhraní. V kombinaci s kontejnerizací (OCI image) a orchestrací (Kubernetes) umožňuje rychlé vydávání verzí, nezávislé nasazování, lepší izolaci chyb a efektivní využití zdrojů. Cenou za tuto flexibilitu je komplexita: správa distribuovaného systému, observabilita, spolehlivost sítě a bezpečnost.

Principy mikroservis: hranice, nezávislost a kontrakty

  • Jedna odpovědnost: každá služba se zaměřuje na malou obchodní schopnost (např. „fakturace“), nikoli na technickou vrstvu.
  • Jasně vymezené hranice: kontrakty API jsou explicitní; data vlastní služba (vlastnictví dat) a nesdílejí se na úrovni databáze.
  • Nezávislé nasazování: každá služba má svůj životní cyklus, CI/CD a verzi.
  • Odolnost vůči chybám: standardně se předpokládá selhání sítě i závislostí; implementují se opakované pokusy, časové limity, jističe a izolované oblasti.

Doménový návrh a dekompozice

Mikroservisy by měly odrážet doménové hranice (DDD): ohraničený kontext určuje slovník a pravidla dané domény. Dekompozice „podle databázových tabulek“ vede k těsnému propojení; vhodnější je dělit podle případů užití a toků hodnoty. Klíčové je zvolit správnou granularitu: příliš malé služby zvyšují režijní náklady na provoz, příliš velké omezují přínosy nezávislosti.

Datová vrstva: jedna služba, jeden zdroj pravdy

  • Polyglotní perzistence: každá služba si volí databázi podle potřeby (relační, dokumentovou, pro časové řady nebo grafovou).
  • Integrace dat: místo sdílené databáze používejte události (CDC, protokol změn) a materializované pohledy u konzumentů.
  • Transakční konzistence: vyhýbejte se distribuovanému dvoufázovému potvrzování (2PC); upřednostněte vzorec Saga (choreografii/orchestraci) s kompenzačními kroky.

Komunikace: synchronní vs. asynchronní

  • Synchronní (HTTP/gRPC): vhodná pro komunikaci požadavek–odpověď a nízkou latenci; je nutné definovat časové limity, idempotenci a prodlevy mezi opakovanými pokusy.
  • Asynchronní (sběrnice událostí, streamy): oddělení producentů od konzumentů, vyšší odolnost vůči špičkám; vyžaduje schéma událostí, verzování a fronty odložených zpráv.
  • Nejprve kontrakt: OpenAPI/AsyncAPI/Protobuf jako zdroj pravdy, generování klientů a validátorů.

Kontejnerizace: neměnné artefakty a přenositelnost

  • OCI image: reprodukovatelné sestavení (vícefázové), minimální základní image (distroless, alpine), samostatný uživatel (ne root), kořenový souborový systém pouze pro čtení.
  • Dodavatelský řetězec: SBOM (CycloneDX/SPDX), skenování zranitelností, podepisování image (cosign), doklad o původu z CI.
  • Konfigurace: zásady 12-Factor – konfigurace prostřednictvím proměnných, tajemství uložená externě (Vault/KMS), vstupní bod bez úprav typu shell hack.

Orchestrace v Kubernetes: od podů ke službám

  • Základní objekty: Pod (běh kontejnerů), Deployment (repliky a postupné nasazování), Service (vyvažování zátěže na L4), Ingress/Gateway (směrování na L7).
  • Škálování: HPA (metriky CPU/paměti/vlastní metriky), VPA pro doporučení, KEDA pro škálování řízené událostmi.
  • Úložiště: CSI pro persistentní svazky, třídy úložiště; stavové služby prostřednictvím StatefulSet, PodDisruptionBudget.
  • Síť: CNI (Calico/Cilium), NetworkPolicy pro izolaci; šifrování komunikace mezi pody (IPsec/WireGuard) podle CNI.

Service Mesh: spolehlivost a bezpečnost na síťové vrstvě

Proxy sidecar (např. Envoy) přidává mTLS, řízení provozu, opakované pokusy/jistič, telemetrii a politiky bez změn aplikačního kódu. Dávejte pozor na režii: zvažte varianty ambient nebo bez sidecaru, případně mesh pouze pro kritické domény.

Observabilita: logy, metriky a trasování

  • Metriky: RED/USE (rate, errors, duration / utilization, saturation, errors), standard OpenMetrics; centralizace do TSDB a upozorňování na základě SLO/SLI.
  • Logy: strukturované JSON, korelační ID napříč službami; pravidla uchovávání a maskování.
  • Trasování: OpenTelemetry pro měření latence od začátku do konce; vzorkování (tail-based) a baggage pro obchodní korelace.

Odolnost a řízení provozu

  • Časový limit, opakované pokusy, jitter: vždy je definujte a testujte – výchozí hodnoty existují jen v dokumentaci.
  • Jistič: izolujte kaskádová selhání; záložní řešení a izolace vláken/poolů pomocí oddělených oblastí.
  • Chaos engineering: řízené výpadky (sítě, uzlů, závislostí) s měřitelným cílem (SLO).

Bezpečnost cloud-native: od kódu po runtime

  • Shift-left: kontroly SAST/SCA/IaC v CI; blokování kritických CVE.
  • Provozní prostředí: seccomp/AppArmor, odebrání capabilities, souborový systém pouze pro čtení, běh bez oprávnění root, standardy zabezpečení podů, síťové politiky, detekce anomálií pomocí eBPF.
  • Politiky: OPA/Gatekeeper nebo Kyverno – vynucování podpisů image, štítků, limitů zdrojů a práce s tajemstvími.
  • Identita: identita úloh (SPIFFE/SPIRE, cloudové OIDC), rotace klíčů, nulová důvěra (Zero Trust).

CI/CD a GitOps pro mikroservisy

  • Pipeline: lint → build → test → SBOM → sign → push → deploy; matice verzí a paralelní zpracování.
  • Manifesty: deklarativní správa (Helm/Kustomize); GitOps (Argo CD/Flux) jako zdroj pravdy – auditovatelné změny, automatická rekonciliace.
  • Strategie vydávání verzí: blue-green, canary s metrikami, příznaky funkcí; automatický návrat k předchozí verzi podle SLO.

Konfigurace, tajemství a multitenance

  • Konfigurace: ConfigMap/Secrets, šablonování a verzování; prostředí oddělená pomocí namespace a RBAC.
  • Tajemství: integrace s Vault/KMS, zapečetěná tajemství; žádná tajemství v image ani v otevřené podobě v repozitáři Git.
  • Multitenance: limity/kvóty, síťové politiky, oddělené ingress/gateway, požadavky/limity zdrojů a PDB pro spravedlivé plánování.

Testování v distribuovaném světě

  • Testování kontraktů: ověřuje kompatibilitu producenta a konzumenta (podobně jako Pact).
  • Dočasná prostředí: náhledy pro jednotlivé větve (preview apps) – rychlá zpětná vazba.
  • Zátěžové a chaos testy: realistická data, testování latence, špiček a degradace závislostí.

Výkon a náklady

  • Profilování: APM, pprof/eBPF, plamenné grafy; identifikace úzkých míst (CPU, I/O, zámky, GC).
  • Řízení zdrojů: správně nastavené požadavky/limity předcházejí thrashingu a jevu hlučného souseda.
  • Nákladové metriky: náklady na požadavek, na tenanta; práh automatického škálování podle obchodních metrik (KEDA + Prometheus).

Antipatterny a jak se jim vyhnout

  • Distribuovaný monolit: mnoho služeb, ale těsné vazby a koordinovaná vydávání verzí – řešení: kontrakty, asynchronní události, nezávislá úložiště dat.
  • Upovídané služby: příliš mnoho synchronních volání na kritické cestě – řešení: agregace, CQRS, ukládání do mezipaměti, dávkové API.
  • Sdílená databáze: obcházení API prostřednictvím sdílené tabulky – řešení: vlastnictví dat a CDC/události.
  • „Jeden klastr pro všechno“: míchání rizik a priorit – řešení: izolace prostředí, skupiny uzlů, taints/tolerations.

Stavové mikroservisy a transakce

Stav je nevyhnutelný: StatefulSet s persistentním úložištěm, proby readiness/liveness/startup, řízení pod anti-affinity, topology spread, záložní repliky a vhodná strategie pod disruption. Transakce řeší Saga, idempotentní operace a sémantika pořadí v datových proudech událostí.

Platform engineering a zkušenost vývojářů

  • Osvědčené postupy: připravené šablony (Backstage/portál), přednastavené pipeline a manifesty.
  • Samoobsluha: katalog služeb, standardizované „stavebnice“ (buildpacky), interní vývojářská platforma s bezpečným výchozím nastavením.
  • Správa a řízení: policy-as-code, SLO-as-code, jednotné standardy telemetrie a dokumentace.

Hraniční případy: hybridní/multicloud a suverenita dat

Pro distribuovanou infrastrukturu jsou klíčové federace klastrů, zjišťování služeb napříč regiony, globální řízení provozu a řízení latence. Suverenita dat vyžaduje lokalitu úložiště, geofencing a šifrování dat v klidu i při přenosu.

Kontrolní seznam pro nasazení mikroservis v kontejnerech

  • Jasně vymezené domény a kontrakty (OpenAPI/AsyncAPI/Protobuf), verzování a zpětná kompatibilita.
  • OCI image: vícefázové sestavení, běh bez oprávnění root, pouze pro čtení, SBOM, podpis, skenování zranitelností.
  • Kubernetes: správně nastavené požadavky/limity, readiness/liveness, NetworkPolicy, PDB, HPA/VPA/KEDA.
  • Bezpečnost: zabezpečení podů, seccomp/AppArmor, OPA/Kyverno, identita úloh, tajemství mimo image.
  • Observabilita: metriky RED/USE, strukturované logy, trasování OpenTelemetry, SLO/upozornění.
  • CI/CD a GitOps: automatizované sestavení, canary/blue-green, návrat k předchozí verzi na základě SLO, auditní stopa.
  • Odolnost: časové limity, opakované pokusy s jitterem, jistič, oddělené oblasti, chaos testy.

Závěr: mikroservisy jako organizační i technický závazek

Mikroservisy a kontejnerizace přinášejí rychlost a škálovatelnost, vyžadují však disciplínu při návrhu kontraktů, datové architektury, bezpečnosti a observability. Úspěch neurčuje počet služeb, nýbrž kvalita hranic, automatizace a provozní vyspělost. Vytvoření stabilní platformy, standardizovaných cest pro vývojáře a měřitelných SLO proměňuje komplexitu cloud-native prostředí v konkurenční výhodu.