Chmura bez lock in: nowe podejścia do multi cloud i open source

0
33
Rate this post

Nawigacja:

Co naprawdę boli: lock‑in na własne życzenie

Objawy uzależnienia od jednego dostawcy chmury

Lock‑in nie wygląda jak awaria – bardziej jak powolne wiązanie rąk. Najczęstsze sygnały: rosnące koszty egress przy próbie wyprowadzenia danych, utrata prędkości wdrożeń po użyciu zbyt wielu usług specyficznych dla jednego dostawcy, kłopot z audytem zgodności (np. lokalizacja danych w świetle RODO, DORA, KSC), a także niechęć zespołów do refaktoryzacji, bo „i tak nie przeniesiemy tego nigdzie indziej”.

Organizacje w Polsce często odkładają temat, dopóki nie pojawi się realna blokada: przetarg wymaga drugiego regionu w UE, partner narzuca innego hyperscalera, regulator pyta o plan wyjścia, lub budżet reaguje alergicznie na rachunek za transfer danych między chmurami. Wtedy zaczyna się sprint z obciążeniem – najmniej przyjemny rodzaj fitnessu.

Konsekwencje dla zespołu i budżetu

Technicznie lock‑in oznacza większe sprzężenie z API dostawcy i nietransferowalne umiejętności. Ekonomicznie prowadzi do trudniejszych negocjacji, bo brak realnych alternatyw obniża siłę przetargową. Operacyjnie – utratę elastyczności: część incydentów rozwiążesz tylko „po ichniemu”, a wdrożenie DR poza chmurą macierzystą staje się projektem na kwartały, nie tygodnie.

Organizacyjnie coraz trudniej utrzymać wspólny standard – IAM, monitoring, polityki bezpieczeństwa i pipeline’y CI/CD rozjeżdżają się pomiędzy zespołami. Dochodzi „dług operacyjny” i rosną koszty zmiany. Jak w starym Excelu: na początku wystarczyło kilka scalonych komórek, aż w końcu nie da się ich odscalić bez bólu.

Krótki przykład z praktyki

Zespół analityczny oparł się w całości na zarządzanym ekosystemie jednego dostawcy: składowanie w obiekcie, natywne ETL, silnik SQL, funkcje serverless do transformacji, dashboardy SaaS. Po dwóch latach wchodzi wymóg utrzymania lustrzanej kopii danych w drugiej chmurze i prowadzenia testów DR. Koszty wyjścia rosną trzykrotnie: transfer danych, przepisywanie funkcji i potoków, nowe uprawnienia i audyty. Gdyby wcześniej przyjęto otwarte formaty (Parquet), utrzymano przenośne narzędzia ETL (dbt, Airflow) i plan wyjścia (eksport + katalog schematów), migracja byłaby iteracyjna, a nie „wszystko albo nic”.

Dlaczego tak się dzieje: pięć źródeł uzależnienia od dostawcy

Dane i ich grawitacja

Najcięższy element systemu to dane. Lock‑in powstaje przez:

  • koszty egress i opłaty międzyregionowe,
  • formaty niedające się łatwo wyeksportować lub brak metadanych,
  • usługi analityczne przywiązane do konkretnego storage/metastore.

Gdy compute musi wykonywać zapytania „przez chmury”, rachunek rośnie wykładniczo, a opóźnienia stają się barierą architektoniczną.

PaaS i zamknięte API

Managed services są świetne do startu, ale każde niestandardowe API czy unikalny mechanizm uprawnień to ukryty kontrakt, który kiedyś trzeba będzie odtworzyć. Im głębiej wchodzisz w funkcje „magiczne” i specyficzne dla dostawcy, tym trudniej o równoważnik u konkurencji.

IAM i sieć – niewidzialne kajdany

Model tożsamości (IAM), struktura kont/subskrypcji i sieć (VPC/VNet) mają nazwy własne i różne semantyki. Gdy pipeline bezpieczeństwa, polityki i skanery uzależnisz od konkretnego IAM, każda kolejna chmura to drugi komplet narzędzi. To nie brzmi groźnie – dopóki nie trzeba tego utrzymać 24/7.

Operacje, monitoring, SRE

Vendorowe portfolio obserwowalności (metryki, logi, ślady), narzędzia backupu, wewnętrzne rejestry i funkcje serverless przywiązują CICD i runbooki do ekosystemu. W efekcie nawet błahe migracje pipeline’ów zamieniają się w serię niezgodności.

Licencje i zmiany licencyjne

„Open source” bywa źródłem lock‑in, gdy licencja przestaje być OSI‑zgodna lub warunki się zmieniają. Przykłady dyskusji wokół SSPL (MongoDB), zmian licencyjnych Terraform (i pojawienia się OpenTofu) czy Elastic pokazują, że źródło dostępne to nie zawsze otwarty standard. Licencje to też ryzyko strategiczne.

Jak wyjść z pułapki: wzorce architektoniczne, które nie przywiązują do jednego dostawcy

Warstwa danych: przenośne formaty i niezależny katalog

Najpierw odcinamy najcięższy balast. Dane trzymaj w formatach kolumnowych (Parquet), a układ tabel zarządzaj przez otwarty table format: Iceberg albo Delta (community edition) – to daje time travel, schematy i partycjonowanie niezależnie od chmury. Metadane trzymaj w katalogu, który ma alternatywy u konkurencji (Hive Metastore, Glue Catalog z możliwością eksportu, Nessie). Na tej bazie możesz uruchamiać compute gdzie chcesz: Trino/Presto, Spark, Flink, DuckDB.

W praktyce: jeżeli hurtownia musi żyć natywnie w chmurze A, utrzymuj lustrzany „lakehouse” w formatach otwartych. Synchronizacja obiektów między chmurami? Użyj replikacji na poziomie bucketów (z filtrami prefiksów) lub narzędzi kompatybilnych z S3 (rclone, mc/MinIO), zamiast własnych skryptów „rsync na sterydach”.

Aplikacje: runtime, który ma drugie lotnisko

Konteneryzacja to warunek konieczny, ale nie wystarczający. Oprócz Kubernetesa zdefiniuj wspólny baseline: wersje CRI/CNI, ingress (np. NGINX/Envoy), rejestr OCI z replikacją, polityki podów (OPA/Gatekeeper lub Kyverno) i klasę storage dla stanów. Dla funkcji „serverless” użyj przenośnych interfejsów (Knative, CloudEvents), a wywołania zdarzeń izoluj przez broker, który ma multi‑cloud (Kafka/Redpanda z mirrorowaniem topiców, NATS JetStream).

Niedoświadczone zespoły często „wypychają” wszystko do managed PaaS. Lepiej mieć 80% użycia PaaS plus plan B w kontenerach niż 100% wygody i zero alternatywy.

Infrastruktura jako kod: neutralna i audytowalna

Zmiany licencyjne uczą pokory. Jeżeli IaC to Terraform, miej przygotowaną ścieżkę równoległą (OpenTofu) lub warstwę wyżej (Crossplane, Pulumi). Moduły rób „dwutorowo”: wspólne interfejsy wejścia/wyjścia i warianty provider‑specyficzne schowane wewnątrz. Stan (state) eksportuj okresowo i testuj odtworzenie w pustym środowisku – nie tylko apply w piątek po 17.

Tożsamość i autoryzacja: federacja najpierw

Centralny IdP (np. Entra/Keycloak/Okta) z federacją do chmur przez OIDC/SAML upraszcza onboarding i audyt. Mapowanie ról na grupy utrzymuj w repo (GitOps), a polityki egzekwuj przez OPA/Styra lub AWS/Azure/GCP IAM z regułami generowanymi z jednego źródła. Dla workloadów zastosuj SPIFFE/SPIRE – zaufanie oparte na tożsamości usługi działa tak samo w obu chmurach i w on‑prem. Mniej tajnych kluczy, mniej kłopotów.

Obserwowalność i kopie bezpieczeństwa: jeden język metryk i śladów

OpenTelemetry jako wspólny SDK/agent, Prometheus z remote‑write do centralnego magazynu i system logów oparty na otwartych formatach (np. Loki/Elastic z retentionem per źródło). Dla śladów – Tempo/Jaeger. Ważne: sampling i retencja projektuj na koszt, nie na marzenia. Backupy projektuj cross‑restore: zrzuty baz w formatach przenośnych, test odtworzenia w drugiej chmurze co najmniej raz na kwartał. Test bez odtworzenia to nie test, to prezentacja.

Sieć i egress: architektura „blisko danych”

Minimalizuj ruch między chmurami: compute do danych, nie odwrotnie. Gdy musisz spinać regiony/dostawców, rozważ neutralny kręgosłup (Equinix/Interconnect/Megaport, Cloudflare/Akamai dla warstwy L7) i mTLS z rotacją certyfikatów. PrivateLink‑owe cuda między chmurami kuszą, ale kosztują – zacznij od prostszych wzorców: cache, kompresja, batch zamiast chatty RPC.

Kryteria wyboru rozwiązań open source i multi‑cloud

  • Standardy i interoperacyjność: OCI dla obrazów, S3‑compatible dla obiektów, SQL ANSI lub jasno opisane dialekty, OTLP dla telemetry.
  • Ład projektowy: fundacja (CNCF, Apache), publiczny roadmap, wielu aktywnych maintainerów, brak „jednej firmy‑zbawcy”.
  • Licencja bez niespodzianek: Apache‑2.0/MIT/BSD/MPL; unikaj licencji „source‑available” w kluczowych komponentach.
  • Wsparcie i ekosystem: dostępność integracji u trzech dużych dostawców, gotowe operatory/helm charty, eksport/import konfiguracji.
  • Doświadczenia z migracji: referencje i narzędzia „przesiadkowe” (connectory, migratory, compat layers).
  • Operacyjność: obserwowalność wbudowana, tryby HA/DR, polityki bezpieczeństwa, upgrade bez przestojów.
  • Koszt całkowity: TCO z egress, storage, supportem i kompetencjami. Tanie w licencji nie znaczy tanie w 24/7.

Czego unikać: anty‑wzorce walki z lock‑in

  • Najmniejszy wspólny mianownik za wszelką cenę – rezygnacja z wartości PaaS spowalnia produkt. Rób wyjątki tam, gdzie zyskujesz realnie: czas, niezawodność, zgodność.
  • Własne „wewnętrzne PaaS” na start – łatwo zbudować, trudno utrzymać. Zanim zaczniecie malować krawężniki na DevOpsowo, policzcie etaty SRE.
  • Podwajanie wszystkiego – dwa klastry, dwóch dostawców, dwa narzędzia do wszystkiego. Dąż do wspólnej warstwy logicznej (policy/observability/IaC), a sprzęt duplikuj tam, gdzie ryzyko to uzasadnia.
  • „Kontenery rozwiążą lock‑in” – stan, sieć, tożsamość i dane dalej pozostają.
  • Ignorowanie danych w ruchu – budżet egress zjada roadmapy. Każdy międzychmurowy przepływ traktuj jak dług, który trzeba spłacać optymalizacją.

Krótka ścieżka wdrożenia: 90 dni na odzyskanie manewrowości

  1. Inwentaryzacja i klasyfikacja: systemy według przenośności (A – gotowe, B – wymagają prac, C – zależne od PaaS).
  2. Pilot danych: uruchom Iceberg/Delta na istniejącym storage i jedną analitykę (Trino/Spark) w drugiej chmurze; zweryfikuj wydajność i koszty egress.
  3. Baseline platformy: wspólny cluster profile K8s, rejestr obrazów z replikacją, polityki OPA/Kyverno.
  4. Telemetria: wdroż OpenTelemetry SDK i kolektory, jeden backend metryk/śladów (może być zarządzany) z eksportem.
  5. Tożsamość: federacja OIDC, mapowanie ról jako kod, SPIFFE dla workloadów w pilotażu.
  6. IaC: refaktoryzacja 2–3 modułów do wariantów multi‑provider, test odtworzenia środowiska w chmurze B.
  7. Test DR: odtworzenie kopii bazy i usługi w 2. chmurze z runbooka, metryki RTO/RPO zapisane w repo.
  8. Guardraile kosztowe: budżety i alerty egress, limity retencji logów, sampling śladów.

Mini‑checklista: czy działamy w dwóch chmurach bez dramatu

  • Build i deploy działają z tego samego pipeline’u na oba środowiska.
  • Zapytania analityczne wykonują się na danych w otwartych formatach z obu lokalizacji.
  • Monitoring i alerting zbierają sygnały w jednym miejscu; incydent nie wymaga dwóch runbooków.
  • Uprawnienia użytkowników i workloadów są nadawane z jednego IdP, bez kont lokalnych.
  • Backup z chmury A można odtworzyć w B w czasie zgodnym z RTO.
  • Rachunek egress mieści się w zaplanowanym budżecie – i wiesz, skąd biorą się piki.

Kontrakt platformowy: multi‑cloud bez chaosu zespołów

Problem: zespoły aplikacyjne robią „po swojemu”, platforma gasi pożary, a przenośność znika w wyjątkach. Jeden zespół deployuje przez GitHub Actions do chmury A, drugi przez Azure DevOps do B, trzeci ma ręczny skrypt „na wszelki wypadek”. Wersje CRD się rozjeżdżają, a „standard” istnieje tylko w slajdach.

Dlaczego tak się dzieje

  • Brak jednoznacznego interfejsu platformy: nie wiadomo, co jest „paved road”, a co eksperymentem.
  • Ustalenia nie są kodem: polityki, role i profile klastrów żyją w dokumentach, nie w repo.
  • Brak SLO dla platformy: trudno rozstrzygnąć spór „wydajność vs. przenośność”, bo nie ma wspólnych kryteriów.

Co działa w praktyce

  • Katalog usług platformy (service catalog) z jasnym kontraktem: build, artefakt OCI, deploy, telemetria, tożsamość. Każdy element ma definicję „golden path” i „escape hatch”.
  • Wzorce jako kod: szablony repo (templaty), helm/operatory z wersjonowanym profilem klastra i testami conformance (np. Sonobuoy + wasp/kyverno policy tests).
  • Jedna warstwa CI, wiele driverów CD: pipeline’y budują raz, a promują na środowiska przez deklaratywne manifesty (GitOps/Argo CD/Flux) – różnice dostawców ukryte w overlayach.
  • SLO platformy: czas build→deploy, czas provisioningu środowiska, zgodność polityk. Spory rozstrzyga metryka, nie Slack.

Na co uważać

  • „Policja architektoniczna” bez wsparcia: blokery bez gotowych szablonów skończą się prywatnymi forczkami.
  • Ciche forki pipeline’ów: jeśli nie ma okresowych testów przenośności, standard zniknie po pierwszym hotfixie.

Krótka rekomendacja

Potraktuj platformę jak produkt: właściciel, backlog, SLO i wersjonowany kontrakt. „Paved road” musi być szybszy i wygodniejszy niż skrót przez krzaki – inaczej i tak wszyscy pobiegną na przełaj.

FinOps dla multi‑cloud: koszt jako metryka architektury

Problem: rachunek egress i zarządzane dodatki rosną szybciej niż adopcja funkcji. Gdy koszt/żądanie różni się x2 między chmurami, zespół przestaje migrować „bo się nie opłaca”. Karta firmowa zaczyna piszczeć.

Skąd biorą się niespodzianki

  • Rozmowna komunikacja między regionami: chatty RPC, brak cache i batchy.
  • Brak rozbicia kosztu na jednostki: produkt nie widzi kosztu per tenant/event/raport, więc nie ma bodźca do optymalizacji.
  • Tagowanie „po terminie”: brak spójnych tagów/labels → koszty lądują w „misc”.

Jak ustawić grę pod kontrolę

  • Automatyczne tagowanie u źródła: polityki OPA/Kyverno/OPA Gatekeeper wymagają tagów na zasobach; pipeline odrzuca build bez metadanych kosztowych.
  • OpenCost/KubeCost + eksport do wspólnego magazynu: ten sam model kosztowy na obu chmurach, raporty per namespace/serwis/środowisko.
  • Budżety i guardraile: limity egress per usługę, alerty progowe, „circuit breaker” na transfery cross‑cloud powyżej ustalonego progu.
  • Wzorce anty‑egress: compute pushdown (Trino/Spark blisko danych), cache przy L7 (CDN/edge), batch + kompresja zamiast synchronicznych wywołań.
  • Ekonomia jednostkowa w SLO: publikuj koszt/1000 żądań i koszt/GB przetworzonych danych obok latency i błędów.

Czego nie robić

  • Przerzucanie ruchu „na chwilę”: tymczasowe mosty trwają latami. Jeśli most – to z planem wygaszania i budżetem.
  • Rezerwacje bez profilu: commit na rezerwacje/zdolność bez danych o sezonowości kończy się naddatkiem w złej chmurze.

Krótka rekomendacja

Uczyń koszt sygnałem architektonicznym. Jeżeli dashboard nie pokazuje kosztu obok opóźnień, to przenośność prędzej czy później przegra z budżetem.

Bezpieczeństwo i zgodność: jedna linia obrony w wielu chmurach

Problem: to samo API działa inaczej, bo różnią się KMS, role i skanery obrazów. Audyt KNF/RODO wymaga spójnych dowodów, a Ty masz dwa różne światy i trzy różne mechanizmy szyfrowania.

Źródła tarcia

  • Przywiązanie do natywnego KMS: brak envelope encryption → migracja oznacza reencryption i przestój.
  • Tożsamość sekretów „z epoki dinozaurów”: klucze długowieczne w zmiennych środowiskowych, osobno w obu chmurach.
  • Różne łańcuchy zaufania obrazów i artefaktów: skanery, które nie rozmawiają wspólnym językiem.

Praktyczny zestaw minimum

  • Envelope encryption wszędzie: klucze danych zarządzane przez aplikację/warstwę Vault, klucze master w KMS per chmura; rotacja zgodna z jedną polityką.
  • Identyfikacja workloadów zamiast statycznych sekretów: SPIFFE/SPIRE, krótkie tokeny, mTLS end‑to‑end.
  • Łańcuch dostaw jako kod: SBOM (CycloneDX/SPDX), podpisy artefaktów przez Sigstore Cosign, weryfikacja w admission controllerze (Kyverno/OPA) w obu klastrach.
  • Jednolita klasyfikacja danych i polityki DLP: etykiety danych wpływają na routing (edge vs. region), retencję i klucze.

Pułapki

  • Nadmierne zaufanie do „domyślnego” skanera w jednej chmurze – w drugiej nie ma odpowiednika lub ma inne CVE feedy.
  • Wyciek przez kontrolne przepływy: backup/logi/telemetria omijają główne reguły i lądują w tańszym, ale mniej chronionym miejscu.

Krótka rekomendacja

Wybierz jeden punkt zaufania dla łańcucha dostaw i jeden model szyfrowania aplikacyjnego. Resztę dopasuj adapterami do chmury, nie odwrotnie. Podpisuj i weryfikuj wszystko, co się da – od obrazu po manifest.

Mikro‑case: streaming zdarzeń bez przywiązania

Krótki scenariusz z praktyki. Zespół ma eventy w natywnym serwisie chmury A, a analityka stoi w B.

  1. Wydziel tematy i schematy w neutralnym repo (Schema Registry kompatybilny z Apicurio/Confluent, ale hostowany niezależnie).
  2. Postaw Kafka/Redpanda z mirroringiem (MirrorMaker2/replicator) między A i B. Wymuś kontrakty schematów w CI.
  3. Połóż „compute przy danych”: konsument Spark/Flink uruchamiaj w B, a jeśli musi być w A – stosuj agregację okienkową i kompresję przed przesłaniem.
  4. Telemetria przez OTLP: ten sam collector eksportuje metryki lagów i błędów do jednego backendu; alerty na RPO strumienia.
  5. Plan wyjścia: zrób runbook na przełączenie producentów na endpoint neutralny (np. Load Balancer/Anycast), test failoveru raz w miesiącu.

Efekt: eventy są przenośne dzięki schematom i mirrorom, a koszt egress kontroluje agregacja. Bez „magii” specyficznej dla jednej chmury, da się.

Najczęściej zadawane pytania (FAQ)

Jak uniknąć vendor lock‑in w chmurze publicznej?

Traktuj przenośność jako wymaganie niefunkcjonalne od dnia zero. Dane trzymaj w otwartych formatach (Parquet) i table format (Iceberg lub Delta community), metadane w katalogu z opcją eksportu (Hive Metastore, Glue z eksportem, Nessie). Warstwę obliczeniową opieraj na narzędziach działających w wielu chmurach: Trino/Presto, Spark, Flink, DuckDB.

Aplikacje uruchamiaj w kontenerach, ale z jasno zdefiniowanym baseline: ingress, rejestr OCI z replikacją, polityki (OPA/Kyverno), klasy storage. Federuj tożsamość przez centralny IdP (OIDC/SAML), dla workloadów użyj SPIFFE/SPIRE. Obserwowalność standaryzuj przez OpenTelemetry i Prometheus/Loki/Jaeger. I najważniejsze: utrzymuj realny plan wyjścia (cykliczny eksport danych i stanu, test odtworzenia w „pustej” chmurze). Bez testu restore to nie plan, tylko slajd.

Poprzedni artykułJak powstał e-mail i dlaczego do dziś używamy znaku małpy
Sebastian Król
Sebastian Król specjalizuje się w DevOps, chmurze i automatyzacji. Na FPID.org.pl pokazuje, jak budować powtarzalne środowiska, wdrażać aplikacje i monitorować je bez zbędnej teorii. Pracuje na realnych przykładach, weryfikuje komendy w praktyce i dopisuje kontekst: kiedy dane rozwiązanie ma sens, a kiedy lepiej wybrać prostszą drogę. Ceni transparentność konfiguracji, dobre praktyki bezpieczeństwa i czytelne logi. Jego poradniki powstają na bazie doświadczeń z utrzymania usług oraz analizy dokumentacji i zmian w narzędziach.