Docker Swarm ar Kubernetes: mažų projektų sprendimas

Kodėl apskritai kalbame apie orkestraciją?

Prieš kelerius metus konteinerizacija atrodė kaip kažkas iš fantastikos – dabar tai tapusi standartu. Bet kai tavo aplikacija auga, vieną ar du konteinerius valdyti rankiniu būdu dar įmanoma. Kai jų tampa dešimtys ar šimtai, prasideda tikras košmaras. Čia ir ateina į pagalbą orkestracijos įrankiai.

Problema ta, kad dauguma straipsnių ir tutorialų iš karto šoka prie Kubernetes, tarsi tai vienintelis pasirinkimas. Realybė kiek kitokia – ypač kai dirbi su mažu projektu, startup’u ar tiesiog nori greitai paleisti kažką veikiančio be savaitės mokymosi kreivės. Docker Swarm dažnai lieka užmirštas, nors daugeliui projektų jis būtų idealus pasirinkimas.

Dirbau su abiem šiais įrankiais realiuose projektuose. Mačiau, kaip komandos kovoja su Kubernetes sudėtingumu projektams, kuriems to iš viso nereikia. Taip pat mačiau, kaip Docker Swarm puikiai tvarkosi su užduotimis, už kurias kiti moka tūkstančius cloud provaideriams už managed Kubernetes.

Docker Swarm – paprastumas kaip privalumas

Docker Swarm yra įmontuotas į patį Docker. Jei jau naudoji Docker (o kas šiais laikais nenaudoja?), Swarm jau yra tavo sistemoje. Nereikia instaliuoti papildomų įrankių, mokytis naujų koncepcijų ar konfigūruoti dešimčių YAML failų.

Aktyvuoti Swarm režimą galima viena komanda: docker swarm init. Ir viskas – tu jau turi veikiantį klasterį. Norint pridėti papildomų mazgų (nodes), tiesiog paleidi komandą, kurią sistema tau sugeneravo. Nėra jokių certificate authority, etcd klasterių ar kitų komplikacijų.

Kai pradedi dirbti su Swarm, greitai supranti, kad čia nėra jokios magijos. Services, stacks, tasks – visa tai logiškai seka vienas iš kito. Jei supranti Docker Compose (o jei naudoji Docker, tikrai supranti), tai Swarm bus intuityvus. Dauguma Compose failų veikia Swarm’e su minimaliomis modifikacijomis arba visai be jų.

Praktinis pavyzdys: turiu Node.js aplikaciją su PostgreSQL duombaze ir Redis cache. Docker Compose failas man jau yra. Noriu deploy’inti į produkciją su trim serveriais. Su Swarm tai užtrunka gal valandą, įskaitant serverių paruošimą. Tas pats su Kubernetes? Pasiruošk praleisti dieną ar daugiau, jei darai tai pirmą kartą.

Kubernetes – galybė su kaina

Kubernetes (arba K8s, jei nori atrodyti cool) yra visiškai kita istorija. Tai ne tiesiog orkestracijos įrankis – tai visa ekosistema, platforma, filosofija. Google sukūrė jį remdamasis savo vidine Borg sistema, kuri valdo milijonus konteinerių.

Ir čia slypi problema mažiems projektams. K8s sukurtas spręsti Google masto problemas. Tai reiškia, kad jame yra funkcionalumas, kurio 90% projektų niekada nenaudos. Bet už tą funkcionalumą mokėsi sudėtingumu.

Norint paleisti net paprasčiausią aplikaciją Kubernetes, reikia suprasti: pods, deployments, services, ingress, config maps, secrets, persistent volumes, storage classes, namespaces… Sąrašas tęsiasi. Kiekvienas iš šių komponentų turi savo YAML konfigūraciją su dešimtimis galimų parametrų.

Bet štai kodėl visi vis tiek kalba apie Kubernetes: jis tikrai galingas. Kai tau reikia sudėtingo tinklo konfigūravimo, pažangių deployment strategijų (canary, blue-green), custom resource definitions, arba integracijos su šimtais įvairių įrankių – K8s neturi konkurencijos. Jis tapo de facto standartu didelėse organizacijose ne be priežasties.

Dirbu su vienu projektu, kuris prasidėjo ant Swarm. Kai komanda išaugo iki 15 žmonių ir aplikacija tapo microservices architektūra su 30+ servisų, migracija į Kubernetes buvo logiška. Bet kai jie tik pradėjo su 3 žmonėmis ir 5 servisais? Swarm buvo tobulas.

Realūs skirtumai praktikoje

Kalbant apie mokymosi kreivę, skirtumas yra dramatiškas. Docker Swarm galiu išmokyti junior developerį per kelias valandas. Kubernetes? Net su patirtimi užtrunka savaites, kol jaučiesi komfortabiliai.

Deployment procesas irgi skiriasi. Swarm’e: docker stack deploy -c docker-compose.yml myapp. Viskas. Kubernetes’e reikia kubectl komandų serijos, arba Helm charts, arba CI/CD pipeline su daugybe žingsnių. Taip, galima automatizuoti, bet pirminis setup yra nepalyginamai sudėtingesnis.

Išteklių naudojimas – dar vienas svarbus aspektas. Swarm master node gali veikti su 512MB RAM ir vis tiek valdyti nemažą klasterį. Kubernetes control plane vien sau reikia mažiausiai 2GB, o geriau 4GB. Kai moki už cloud infrastruktūrą, tai skaičiuojasi.

Debugging ir troubleshooting irgi skiriasi. Swarm’e, kai kažkas negerai, paprastai gana greitai randi problemą. Logs yra aiškūs, būsenos paprastos. Kubernetes’e gali praleisti valandas bandydamas suprasti, kodėl tavo pod’as nepasileidžia, nes problema gali būti bet kuriame iš dešimčių sluoksnių.

Tačiau štai kur Kubernetes tikrai šviečia: high availability ir disaster recovery. K8s turi daug pažangesnių mechanizmų self-healing, automatiniam scaling’ui, ir fault tolerance. Swarm turi bazines šių funkcijų versijas, bet jos nėra tokios sofistikuotos.

Kada rinktis Docker Swarm

Jei tavo projektas atitinka šiuos kriterijus, Swarm greičiausiai yra geresnis pasirinkimas:

Komanda maža – iki 5-10 žmonių. Nėra dedikuoto DevOps inžinieriaus ar komandos. Visi developeriai jau naudoja Docker kasdieniam darbui. Tokioje situacijoje Swarm leidžia produktyviai dirbti be papildomo mokymosi.

Aplikacija nėra super sudėtinga – gal 5-15 servisų, standartinė architektūra. Nereikia crazy networking reikalavimų ar custom resource management. Paprastas load balancing ir service discovery visiškai pakanka.

Infrastruktūra ribota – gal keli VPS serveriai ar nedidelis cloud budget. Swarm veikia efektyviau su mažesniais ištekliais. Galiu paleisti production-ready klasterį su trimis 2GB RAM serveriais. Kubernetes’ui to nepakaktų net control plane’ui.

Reikia greitai paleisti – startup’ai, MVP, proof of concept projektai. Kai svarbu greitis ir paprastumas, ne feature richness. Galiu setup’inti Swarm produkciją per popietę, įskaitant monitoring ir backups.

Praktinis patarimas: pradėk su Swarm, jei nesitiki labai greitai augti iki dešimčių ar šimtų servisų. Migracija į Kubernetes vėliau yra įmanoma, nors ir nėra trivialu. Bet pradėti su K8s „nes visi taip daro” yra over-engineering klasikinis pavyzdys.

Kada Kubernetes yra būtinas

Yra situacijų, kai Kubernetes tikrai yra geresnis pasirinkimas nuo pat pradžių:

Didelė komanda ir organizacija – kai turi dedikuotą DevOps/Platform komandą, kuri gali valdyti sudėtingumą. Kai kelios komandos dirba su ta pačia infrastruktūra ir reikia gero isolation ir resource management.

Sudėtinga microservices architektūra – dešimtys ar šimtai servisų, sudėtingi tarpusavio ryšiai, reikalingas service mesh (Istio, Linkerd). Swarm tiesiog neturi įrankių tokiam masto valdymui.

Multi-cloud ar hybrid cloud strategija – Kubernetes veikia vienodai AWS, GCP, Azure, on-premise. Jei planuoji multi-cloud arba migraciją tarp providerių, K8s suteikia abstrakciją. Swarm yra labiau susietas su Docker ekosistema.

Reikia pažangių deployment strategijų – canary deployments, blue-green, A/B testing su traffic splitting. Nors kai kuriuos galima implementuoti ir Swarm’e, Kubernetes turi tai built-in su geresniais įrankiais.

Compliance ir security reikalavimai – didelės organizacijos dažnai turi griežtus reikalavimus. Kubernetes turi brandesnį security modelį, RBAC, network policies, pod security policies. Swarm’e šie dalykai yra paprastesni, kas gali būti ir privalumas, ir trūkumas.

Vienas projektas, su kuriuo dirbau, pradėjo migraciją į K8s kai pasiekė apie 25 microservices ir komanda išaugo iki 20 žmonių. Iki tol Swarm puikiai tvarkėsi. Migracija užtruko 3 mėnesius, bet dabar su 50+ servisų jie džiaugiasi K8s galimybėmis.

Hibridiniai scenarijai ir alternatyvos

Nebūtinai reikia rinktis vieną ar kitą visam laikui. Kai kurios komandos naudoja abu: Swarm development ir staging aplinkoms (greičiau, paprasčiau), Kubernetes produkcijai (daugiau kontrolės, galimybių).

Yra ir kitų variantų. Nomad iš HashiCorp yra įdomus middle ground – paprastesnis už Kubernetes, bet galingesnis už Swarm. Jis gali valdyti ne tik konteinerius, bet ir VMs, standalone binaries. Bet ekosistema mažesnė nei K8s.

Managed Kubernetes servisai (EKS, GKE, AKS) sumažina sudėtingumą, nes provideris valdo control plane. Bet vis tiek reikia suprasti K8s konceptus, ir kaina būna aukštesnė. Kai kuriems projektams tai geras kompromisas.

Docker Desktop dabar turi Kubernetes built-in, kas puiku mokymui ir local development. Bet production’e vis tiek reikia spręsti, ką naudoti.

Dar viena tendencija – serverless ir managed services. Kai kuriems projektams AWS Fargate ar Google Cloud Run gali būti geresni pasirinkimai nei bet kokia orkestracijos platforma. Moki tik už tai, ką naudoji, ir visai nevaldi infrastruktūros.

Ką daryti su legacy projektais

Jei jau turi veikiantį projektą ant vienos ar kitos platformos, migracija nėra lengvas sprendimas. Reikia svarstyti ne tik techninius aspektus, bet ir komandos laiką, riziką, business value.

Projektas ant Swarm veikia gerai? Greičiausiai nėra priežasties migruoti. „Visi naudoja Kubernetes” nėra geras argumentas. Migruok tik kai tikrai atsiranda reikalavimų, kurių Swarm negali patenkinti.

Jei vis tik nusprendei migruoti iš Swarm į K8s, rekomenduoju:

Pirma, išmok Kubernetes gerai. Ne tik basic tutorials, bet tikrai suprask, kaip jis veikia. Užtruks laiko, bet būtina.

Antra, pradėk nuo ne-critical servisų. Migruok po vieną servisą, testuok, mokykis. Nedaryk big bang migracijos.

Trečia, automatizuok viską nuo pradžių. Helm charts, CI/CD pipelines, infrastructure as code. Kubernetes sudėtingumas reikalauja automatizacijos.

Ketvirta, investuok į monitoring ir observability. Kubernetes aplinkoje tai dar svarbiau nei Swarm’e. Prometheus, Grafana, distributed tracing – visa tai tampa būtina.

Migracija iš K8s į Swarm? Retai matau tokių atvejų, bet jie būna. Paprastai kai startup’as sumažina scope arba nori sumažinti operational overhead. Techniškai įmanoma, bet reikia perdaryt visą deployment setup.

Kaip priimti sprendimą jūsų projektui

Geriausias patarimas: būk sąžiningas sau apie projekto poreikius. Ne apie tai, ką galbūt reikės už metų, o apie tai, kas reikia dabar ir artimiausioje ateityje.

Pradėk nuo šių klausimų:

Kiek žmonių komandoje dirbs su infrastruktūra? Jei vienas-du, Swarm greičiausiai geriau. Jei dedikuota DevOps komanda – K8s tampa realesnis.

Kiek servisų/konteinerių planuojate turėti per artimiausius 6-12 mėnesių? Iki 20 – Swarm tikrai pakanka. Daugiau nei 30-40 – pradėk galvoti apie K8s.

Koks komandos patyrimo lygis su šiais įrankiais? Jei visi jau moka K8s – naudokit jį. Jei niekas nemoka – Swarm bus greičiau produktyvus.

Koks budget infrastruktūrai ir DevOps laikui? K8s reikalauja daugiau išteklių ir laiko. Jei budget ribotas – Swarm efektyvesnis.

Ar yra specifinių reikalavimų, kuriuos tik K8s gali patenkinti? Jei taip – pasirinkimas aiškus. Jei ne – kodėl komplikuoti?

Asmeniškai, matyti kaip projektas auga nuo Docker Compose local development iki Swarm staging ir production, o vėliau gal migruoja į K8s kai tikrai reikia – tai natūrali evoliucija. Pradėti iš karto su Kubernetes „nes tai industry standard” dažnai baigiasi frustrated komanda ir over-engineered infrastruktūra.

Docker Swarm nėra „prastas” ar „outdated” pasirinkimas. Tai puikus įrankis tam tikroms situacijoms. Kubernetes irgi nėra silver bullet, nors marketing taip ir tvirtina. Abu turi savo vietą. Svarbu suprasti, kuri vieta yra jūsų projektas.

Nebijok pradėti paprasčiau. Galėsi komplikuoti vėliau, kai tikrai reikės. Bet pradėjus su per sudėtinga sistema, supaprastinti beveik neįmanoma – komanda įpras, procesai susiformuos, ir būsi įstrigęs su infrastruktūra, kuri projektui per didelė.

Daugiau

Saugūs mokėjimai internete, ką tikrinti prieš patvirtinant