KÄ ietaupÄ«t uz mÄkoÅa izmaksÄm, strÄdÄjot ar Kubernetes? Nav viena pareizÄ risinÄjuma, taÄu Å”ajÄ rakstÄ ir aprakstÄ«ti vairÄki rÄ«ki, kas var palÄ«dzÄt efektÄ«vÄk pÄrvaldÄ«t resursus un samazinÄt mÄkoÅdatoÅ”anas izmaksas.
Es uzrakstÄ«ju Å”o rakstu, paturot prÄtÄ Kubernetes for AWS, taÄu tas (gandrÄ«z) tieÅ”i tÄpat attieksies uz citiem mÄkoÅa pakalpojumu sniedzÄjiem. Es pieÅemu, ka jÅ«su klasterim(-iem) jau ir konfigurÄta automÄtiskÄ mÄrogoÅ”ana (klasteris-autoscaler). Resursu noÅemÅ”ana un izvietoÅ”anas samazinÄÅ”ana ietaupÄ«s naudu tikai tad, ja samazinÄsies arÄ« darbinieku mezglu parks (EC2 gadÄ«jumi).
StrÄdÄt straujÄ vidÄ ir lieliski. MÄs vÄlamies tehnoloÄ£iju organizÄcijas paÄtrinÄta. ÄtrÄka programmatÅ«ras piegÄde nozÄ«mÄ arÄ« vairÄk PR izvietoÅ”anas, priekÅ”skatÄ«juma vides, prototipu un analÄ«tikas risinÄjumu. Viss ir izvietots Kubernetes. Kam ir laiks manuÄli notÄ«rÄ«t testa izvietojumus? Ir viegli aizmirst par nedÄļu veca eksperimenta dzÄÅ”anu. MÄkoÅa rÄÄ·ins pieaugs, jo aizmirsÄm aizvÄrt:
(Henings Džeikobss:
Žiza:
(pÄdas) Korijs Kvins:
MÄ«ts: jÅ«su AWS konts ir atkarÄ«gs no jÅ«su lietotÄju skaita.
Fakts: jÅ«su AWS rezultÄts ir atkarÄ«gs no jÅ«su inženieru skaita.
Ivans Kurnosovs (atbildÄ):
Patiess fakts: jÅ«su AWS rezultÄts ir atkarÄ«gs no to lietu skaita, kuras esat aizmirsis atspÄjot/dzÄst.)
Kubernetes sÄtniece (kube-janitor) palÄ«dz iztÄ«rÄ«t jÅ«su kopu. SÄtnieka konfigurÄcija ir elastÄ«ga gan globÄlai, gan vietÄjai lietoÅ”anai:
Klastera mÄroga noteikumi var definÄt maksimÄlo darbÄ«bas laiku (TTL) PR/testa izvietoÅ”anai.
AtseviŔķus resursus var anotÄt ar janitor/ttl, piemÄram, lai pÄc 7 dienÄm automÄtiski noÅemtu smaili/prototipu.
VispÄrÄ«gi noteikumi ir definÄti YAML failÄ. TÄs ceļŔ tiek izvadÄ«ts caur parametru --rules-file in kube-sÄtnieks. Å eit ir kÄrtulas piemÄrs, lai noÅemtu visas nosaukumvietas -pr- vÄrdÄ pÄc divÄm dienÄm:
Å is piemÄrs regulÄ lietojumprogrammas etiÄ·etes izmantoÅ”anu izvietoÅ”anas un StatefulSet blokos visiem jaunajiem izvietojumiem/StatefulSets 2020. gadÄ, taÄu tajÄ paÅ”Ä laikÄ atļauj nedÄļu veikt testus bez Ŕīs etiÄ·etes.
Palaidiet ierobežotu laika demonstrÄciju 30 minÅ«tes klasterÄ«, kurÄ darbojas kube-janitor:
kubectl run nginx-demo --image=nginx
kubectl annotate deploy nginx-demo janitor/ttl=30m
VÄl viens izmaksu pieauguma avots ir pastÄvÄ«gie apjomi (AWS EBS). DzÄÅ”ot Kubernetes StatefulSet, netiek dzÄsti tÄ pastÄvÄ«gie sÄjumi (PVC ā PersistentVolumeClaim). Neizmantotie EBS apjomi var viegli radÄ«t izmaksas simtiem dolÄru mÄnesÄ«. Kubernetes Janitor ir funkcija, lai notÄ«rÄ«tu neizmantotos PVC. PiemÄram, Å”is noteikums noÅems visus PVC, kas nav uzstÄdÄ«ti ar moduli un uz kuriem nav atsauces StatefulSet vai CronJob:
Kubernetes Janitor var palÄ«dzÄt jums uzturÄt kopu tÄ«ru un novÄrst mÄkoÅdatoÅ”anas izmaksu lÄnu uzkrÄÅ”anos. IzvÄrÅ”anas un konfigurÄcijas norÄdÄ«jumus skatiet tÄlÄk README kube-sÄtnieks.
Samaziniet mÄrogoÅ”anu Ärpus darba laika
TestÄÅ”anas un inscenÄÅ”anas sistÄmas parasti ir nepiecieÅ”amas darbÄ«bai tikai darba laikÄ. DažÄm ražoÅ”anas lietojumprogrammÄm, piemÄram, biroja/administratora rÄ«kiem, ir nepiecieÅ”ama tikai ierobežota pieejamÄ«ba, un tÄs var atspÄjot vienas nakts laikÄ.
Kubernetes Downscaler (kube-downscaler) ļauj lietotÄjiem un operatoriem samazinÄt sistÄmas apjomu Ärpus darba laika. Izvietojumi un StatefulSets var tikt mÄrogoti lÄ«dz nullei replikÄm. CronJobs var tikt apturÄts. Kubernetes Downscaler ir konfigurÄts visam klasterim, vienai vai vairÄkÄm nosaukumvietÄm vai atseviŔķiem resursiem. Varat iestatÄ«t ādÄ«kstÄves laikuā vai, gluži pretÄji, ādarba laikuā. PiemÄram, lai pÄc iespÄjas samazinÄtu mÄrogoÅ”anu naktÄ«s un brÄ«vdienÄs:
Å eit ir grafiks klasteru darbinieku mezglu mÄrogoÅ”anai nedÄļas nogalÄs:
Samazinot no ~13 lÄ«dz 4 darbinieku mezgliem, noteikti ir ievÄrojama atŔķirÄ«ba jÅ«su AWS rÄÄ·inÄ.
Bet ko darÄ«t, ja man ir jÄstrÄdÄ klastera "dÄ«kstÄves" laikÄ? Dažus izvietojumus var neatgriezeniski izslÄgt no mÄrogoÅ”anas, pievienojot samazinÄÅ”anas/izslÄgÅ”anas: patieso anotÄciju. Izvietojumus var Ä«slaicÄ«gi izslÄgt, izmantojot samazinÄÅ”anas/izslÄgÅ”anas lÄ«dz anotÄciju ar absolÅ«tu laikspiedolu formÄtÄ GGGG-MM-DD HH:MM (UTC). Ja nepiecieÅ”ams, visu kopu var samazinÄt, izvietojot podziÅu ar anotÄciju downscaler/force-uptime, piemÄram, palaižot nginx blank:
kubectl run scale-up --image=nginx
kubectl annotate deploy scale-up janitor/ttl=1h # ŃŠ“Š°Š»ŠøŃŃ ŃŠ°Š·Š²ŠµŃŃŃŠ²Š°Š½ŠøŠµ ŃŠµŃŠµŠ· ŃŠ°Ń
kubectl annotate pod $(kubectl get pod -l run=scale-up -o jsonpath="{.items[0].metadata.name}") downscaler/force-uptime=true
redzÄt README kube-downscaler, ja jÅ«s interesÄ izvietoÅ”anas instrukcijas un papildu iespÄjas.
Daudzas lietojumprogrammas/pakalpojumi nodarbojas ar dinamisku ielÄdes modeli: dažreiz to moduļi ir dÄ«kstÄvÄ, un dažreiz tie darbojas ar pilnu jaudu. PastÄvÄ«ga pÄkstu parka darbÄ«ba, lai tiktu galÄ ar maksimÄlo maksimÄlo slodzi, nav ekonomiska. Kubernetes atbalsta horizontÄlo automÄtisko mÄrogoÅ”anu visÄ resursÄ HorizontalPodAutoscaler (HPA). CPU lietojums bieži ir labs mÄrogoÅ”anas rÄdÄ«tÄjs:
Zalando ir izveidojis komponentu, lai viegli savienotu pielÄgotus mÄrogoÅ”anas rÄdÄ«tÄjus: Kube metrikas adapteris (kube-metrics-adapter) ir vispÄrÄjs Kubernetes metrikas adapteris, kas var apkopot un apkalpot pielÄgotas un ÄrÄjas metrikas aplikumu horizontÄlai automÄtiskai mÄrogoÅ”ana. TÄ atbalsta mÄrogoÅ”anu, pamatojoties uz Prometheus metriku, SQS rindÄm un citiem iestatÄ«jumiem. PiemÄram, lai mÄrogotu izvietoÅ”anu uz pielÄgotu metriku, ko pati lietojumprogramma attÄlo kÄ JSON mapÄ /metrics, izmantojiet:
HorizontÄlÄs automÄtiskÄs mÄrogoÅ”anas konfigurÄÅ”anai ar HPA vajadzÄtu bÅ«t vienai no noklusÄjuma darbÄ«bÄm, lai uzlabotu bezvalsts pakalpojumu efektivitÄti. Spotify ir prezentÄcija ar savu pieredzi un ieteikumiem HPA: mÄrogojiet savu izvietoÅ”anu, nevis savu maku.
Samaziniet resursu pÄrsniegÅ”anu
Kubernetes darba slodzes nosaka viÅu CPU/atmiÅas vajadzÄ«bas, izmantojot āresursu pieprasÄ«jumusā. CentrÄlÄ procesora resursi tiek mÄrÄ«ti virtuÄlajos kodolos vai biežÄk āmilikodosā, piemÄram, 500 m nozÄ«mÄ 50% vCPU. AtmiÅas resursi tiek mÄrÄ«ti baitos, un var izmantot parastos sufiksus, piemÄram, 500Mi, kas nozÄ«mÄ 500 megabaitus. Resursu pieprasÄ«jumi "bloÄ·Ä" darbinieku mezglu jaudu, kas nozÄ«mÄ, ka pods ar 1000 m CPU pieprasÄ«jumu mezglÄ ar 4 vCPU atstÄs tikai 3 vCPU pieejamus citiem podiem. [1]
AtslÄbums (liekÄ rezerve) ir atŔķirÄ«ba starp pieprasÄ«tajiem resursiem un faktisko izmantoÅ”anu. PiemÄram, podam, kas pieprasa 2 GiB atmiÅu, bet izmanto tikai 200 MiB, ir ~1,8 GiB āliekÄsā atmiÅas. PÄrmÄrÄ«ba maksÄ naudu. Var aptuveni aprÄÄ·inÄt, ka 1 GiB liekas atmiÅas maksÄ ~10 USD mÄnesÄ«. [2]
Kubernetes resursu pÄrskats (kube-resource-report) parÄda liekÄs rezerves un var palÄ«dzÄt noteikt ietaupÄ«jumu potenciÄlu:
Kubernetes resursu pÄrskats parÄda pÄrpalikumu, kas apkopots pÄc lietojumprogrammas un komandas. Tas ļauj jums atrast vietas, kur var samazinÄt resursu pieprasÄ«jumu. Ä¢enerÄtais HTML pÄrskats sniedz tikai resursu izmantoÅ”anas momentuzÅÄmumu. Lai noteiktu atbilstoÅ”us resursu pieprasÄ«jumus, jums vajadzÄtu apskatÄ«t CPU/atmiÅas lietojumu laika gaitÄ. Å eit ir Grafana diagramma par "tipisku" CPU intensÄ«vu pakalpojumu: visi podi izmanto ievÄrojami mazÄk nekÄ 3 pieprasÄ«tie CPU kodoli:
CPU pieprasÄ«juma samazinÄÅ”ana no 3000 m lÄ«dz ~ 400 m atbrÄ«vo resursus citÄm darba slodzÄm un ļauj klasterim bÅ«t mazÄkam.
"EC2 gadÄ«jumu vidÄjais CPU lietojums bieži vien svÄrstÄs viencipara procentu diapazonÄ." raksta Korijs Kvins. KamÄr par EC2 pareizÄ izmÄra noteikÅ”ana var bÅ«t slikts lÄmumsDažu Kubernetes resursu vaicÄjumu mainÄ«Å”ana YAML failÄ ir vienkÄrÅ”a un var radÄ«t milzÄ«gus ietaupÄ«jumus.
Bet vai mÄs tieÅ”Äm vÄlamies, lai cilvÄki mainÄ«tu vÄrtÄ«bas YAML failos? NÄ, maŔīnas to var izdarÄ«t daudz labÄk! Kubernetes VertikÄlais pods Autoscaler (VPA) dara tieÅ”i to: pielÄgo resursu pieprasÄ«jumus un ierobežojumus atbilstoÅ”i darba slodzei. TÄlÄk ir sniegts Prometheus CPU pieprasÄ«jumu diagrammas paraugs (plÄna zila lÄ«nija), ko laika gaitÄ pielÄgojis VPA:
Goldilocks no Fairwind ir rÄ«ks, kas izveido VPA katrai izvietoÅ”anai nosaukumvietÄ un pÄc tam savÄ informÄcijas panelÄ« parÄda VPA ieteikumu. Tas var palÄ«dzÄt izstrÄdÄtÄjiem iestatÄ«t pareizos CPU/atmiÅas pieprasÄ«jumus savÄm lietojumprogrammÄm:
Visbeidzot, AWS EC2 izmaksas var samazinÄt, izmantojot Spot gadÄ«jumus kÄ Kubernetes darbinieku mezglus [3]. VietÄjie gadÄ«jumi ir pieejami ar atlaidi lÄ«dz pat 90%, salÄ«dzinot ar cenÄm pÄc pieprasÄ«juma. Kubernetes palaiÅ”ana EC2 Spot ir laba kombinÄcija: jums ir jÄnorÄda vairÄki dažÄdi gadÄ«jumu veidi, lai nodroÅ”inÄtu augstÄku pieejamÄ«bu, kas nozÄ«mÄ, ka varat iegÅ«t lielÄku mezglu par tÄdu paÅ”u vai zemÄku cenu, un palielinÄto jaudu var izmantot konteinerizÄtÄs Kubernetes darba slodzes.
KÄ palaist Kubernetes vietnÄ EC2 Spot? Ir vairÄkas iespÄjas: izmantojiet treÅ”Äs puses pakalpojumu, piemÄram, SpotInst (tagad to sauc par "Spot", nejautÄjiet man, kÄpÄc) vai vienkÄrÅ”i pievienojiet savai klasterim Spot AutoScalingGroup (ASG). PiemÄram, Å”eit ir CloudFormation fragments āoptimizÄtai kapacitÄteiā Spot ASG ar vairÄkiem gadÄ«jumu tipiem:
KÄda ir jÅ«su labÄkÄ prakse mÄkoÅa izmaksu ietaupÄ«Å”anai vietnÄ Kubernetes? LÅ«dzu, dariet man zinÄmu plkst Twitter (@try_except_).
[1] Faktiski mazÄk nekÄ 3 vCPU paliks izmantojami, jo mezgla caurlaidspÄju samazina rezervÄtie sistÄmas resursi. Kubernetes izŔķir fizisko mezglu jaudu un "nodroÅ”inÄtos" resursus (PieŔķirams mezgls).
[2] AprÄÄ·ina piemÄrs: viena m5.liela instance ar 8 GiB atmiÅu ir ~84 $ mÄnesÄ« (eu-central-1, On-Demand), t.i. 1/8 mezgla bloÄ·ÄÅ”ana ir aptuveni USD 10 mÄnesÄ«.
[3] Ir vÄl daudzi veidi, kÄ samazinÄt EC2 rÄÄ·inu, piemÄram, rezervÄtie gadÄ«jumi, taupÄ«Å”anas plÄns u.c. ā Ŕīs tÄmas es Å”eit neapskatÄ«Å”u, taÄu jums tÄs noteikti vajadzÄtu izpÄtÄ«t!