Kaip sutaupyti debesies išlaidų dirbant su Kubernetes? Nėra vieno tinkamo sprendimo, tačiau šiame straipsnyje aprašomi keli įrankiai, kurie gali padėti efektyviau valdyti išteklius ir sumažinti debesų kompiuterijos išlaidas.
Šį straipsnį parašiau turėdamas omenyje „Kubernetes“, skirtą AWS, tačiau jis bus taikomas (beveik) lygiai taip pat ir kitiems debesų paslaugų teikėjams. Darau prielaidą, kad jūsų klasteryje (-ėse) jau sukonfigūruotas automatinis mastelio keitimas (klasteris-automatinis skaleris). Pašalinus išteklius ir sumažinus diegimą sutaupysite pinigų tik tuo atveju, jei taip pat sumažinsite darbuotojų mazgų parką (EC2 atvejai).
Dirbti greito tempo aplinkoje yra puiku. Mes norime technologijų organizacijų paspartėjo. Greitesnis programinės įrangos pristatymas taip pat reiškia daugiau viešųjų ryšių diegimo, peržiūros aplinkų, prototipų ir analizės sprendimų. Viskas yra įdiegta Kubernetes. Kas turi laiko rankiniu būdu išvalyti bandomuosius diegimus? Lengva pamiršti apie savaitės senumo eksperimento ištrynimą. Debesų sąskaita padidės dėl kažko, ką pamiršome uždaryti:
(Henningas Jacobsas:
Žiza:
(citatos) Corey Quinn:
Mitas: jūsų AWS paskyra priklauso nuo jūsų turimų vartotojų skaičiaus.
Faktas: jūsų AWS balas priklauso nuo jūsų turimų inžinierių skaičiaus.
Ivanas Kurnosovas (atsakyme):
Tikras faktas: jūsų AWS balas priklauso nuo dalykų, kuriuos pamiršote išjungti / ištrinti, skaičiaus funkcija.)
Kubernetes sargas (kube-janitor) padeda išvalyti jūsų grupę. Prižiūrėtojo konfigūracija yra lanksti tiek pasauliniam, tiek vietiniam naudojimui:
Visą grupę apimančios taisyklės gali apibrėžti maksimalų PR / bandomojo diegimo laiką (TTL).
Atskiri ištekliai gali būti pažymėti janitor/ttl, pavyzdžiui, norint automatiškai pašalinti smaigalį / prototipą po 7 dienų.
Bendrosios taisyklės yra apibrėžtos YAML faile. Jo kelias praeina per parametrą --rules-file kube-sargyboje. Štai taisyklės pavyzdys, kaip pašalinti visas vardų sritis -pr- vardu po dviejų dienų:
Toliau pateiktame pavyzdyje reglamentuojamas programos etiketės naudojimas diegimo ir „StatefulSet“ rinkiniuose visuose naujuose diegimuose / „StatefulSet“ 2020 m., tačiau tuo pačiu metu leidžiama savaitę atlikti bandymus be šios etiketės:
- id: require-application-label
# удалить deployments и statefulsets без метки "application"
resources:
- deployments
- statefulsets
# см. http://jmespath.org/specification.html
jmespath: "!(spec.template.metadata.labels.application) && metadata.creationTimestamp > '2020-01-01'"
ttl: 7d
Paleiskite riboto laiko demonstracinę versiją 30 minučių klasteryje, kuriame veikia kube-janitor:
kubectl run nginx-demo --image=nginx
kubectl annotate deploy nginx-demo janitor/ttl=30m
Kitas didėjančių sąnaudų šaltinis yra nuolatiniai apimtys (AWS EBS). Ištrynus Kubernetes StatefulSet nepašalinami jo nuolatiniai tomai (PVC – PersistentVolumeClaim). Nepanaudoti EBS kiekiai gali lengvai sukelti šimtus dolerių per mėnesį. Kubernetes Janitor turi funkciją, leidžiančią išvalyti nepanaudotus PVC. Pavyzdžiui, ši taisyklė pašalins visus PVC, kurie nėra sumontuoti modulyje ir kurių nenurodo StatefulSet arba CronJob:
# удалить все PVC, которые не смонтированы и на которые не ссылаются StatefulSets
- id: remove-unused-pvcs
resources:
- persistentvolumeclaims
jmespath: "_context.pvc_is_not_mounted && _context.pvc_is_not_referenced"
ttl: 24h
„Kubernetes Janitor“ gali padėti išlaikyti klasterį švarų ir neleisti lėtai kauptis debesų kompiuterijos išlaidoms. Norėdami gauti diegimo ir konfigūravimo instrukcijas, vadovaukitės README kube-sargas.
Sumažinkite mastelį ne darbo valandomis
Bandymo ir sustojimo sistemos paprastai turi veikti tik darbo valandomis. Kai kurioms gamybinėms programoms, pvz., „back office“ / administratoriaus įrankiams, taip pat reikalingas ribotas pasiekiamumas ir jos gali būti išjungtos per naktį.
Kubernetes Downscaler (kube-downscaler) leidžia vartotojams ir operatoriams sumažinti sistemos mastelį ne darbo valandomis. Diegimai ir „StatefulSets“ gali būti keičiami iki nulio kopijų. CronJobs gali būti sustabdytas. „Kubernetes Downscaler“ sukonfigūruotas visam klasteriui, vienai ar kelioms vardų erdvėms arba atskiriems ištekliams. Galite nustatyti „neaktyvumo laiką“ arba, atvirkščiai, „darbo laiką“. Pavyzdžiui, norėdami kiek įmanoma sumažinti mastelį naktimis ir savaitgaliais:
image: hjacobs/kube-downscaler:20.4.3
args:
- --interval=30
# не отключать компоненты инфраструктуры
- --exclude-namespaces=kube-system,infra
# не отключать kube-downscaler, а также оставить Postgres Operator, чтобы исключенными БД можно было управлять
- --exclude-deployments=kube-downscaler,postgres-operator
- --default-uptime=Mon-Fri 08:00-20:00 Europe/Berlin
- --include-resources=deployments,statefulsets,stacks,cronjobs
- --deployment-time-annotation=deployment-time
Čia pateikiamas klasterio darbuotojų mazgų mastelio keitimo savaitgaliais grafikas:
Sumažinus nuo ~13 iki 4 darbuotojų mazgų, jūsų AWS sąskaita tikrai pastebimai pasikeis.
Bet ką daryti, jei man reikia dirbti klasterio „prastovos“ metu? Tam tikri diegimai gali būti visam laikui pašalinti iš mastelio, pridedant sumažinimo/išskyrimo: tikroji anotacija. Diegimus galima laikinai neįtraukti naudojant sumažinimo / išskyrimo iki anotaciją su absoliučia laiko žyma formatu YYYY-MM-DD HH:MM (UTC). Jei reikia, viso klasterio mastelį galima sumažinti įdiegiant bloką su anotacija downscaler/force-uptime, pavyzdžiui, paleidus 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
Daugelis programų/paslaugų susiduria su dinamine įkrovimo schema: kartais jų moduliai neveikia, o kartais veikia visu pajėgumu. Eksploatuoti nuolatinį ankščių parką, kad būtų galima susidoroti su maksimalia apkrova, nėra ekonomiška. „Kubernetes“ palaiko horizontalų automatinį mastelio keitimą visame šaltinyje HorizontalusPodAutoscaler (HPA). CPU naudojimas dažnai yra geras mastelio keitimo rodiklis:
„Zalando“ sukūrė komponentą, leidžiantį lengvai prijungti pasirinktinę mastelio keitimo metriką: Kube metrikos adapteris (kube-metrics-adapter) yra bendras metrikos adapteris, skirtas Kubernetes, kuris gali rinkti ir teikti tinkintą ir išorinę metriką, skirtą horizontaliam automatinio mastelio keitimui. Jis palaiko mastelio keitimą, pagrįstą Prometheus metrika, SQS eilėmis ir kitais parametrais. Pavyzdžiui, norėdami pritaikyti tinkintą metriką, kurią pati programa pateikia kaip JSON /metrics, naudokite:
Horizontaliojo automatinio mastelio konfigūravimas naudojant HPA turėtų būti vienas iš numatytųjų veiksmų, siekiant pagerinti paslaugų be būsenos efektyvumą. „Spotify“ pristato savo patirtį ir rekomendacijas dėl HPA: padidinkite savo dislokavimą, o ne savo piniginę.
Sumažinkite išteklių perteklinį rezervavimą
„Kubernetes“ darbo krūviai nustato jų procesoriaus / atminties poreikius per „resursų užklausas“. CPU ištekliai matuojami virtualiais branduoliais arba dažniau „milicore“, pavyzdžiui, 500 m reiškia 50% vCPU. Atminties ištekliai matuojami baitais, galima naudoti įprastas priesagas, pvz., 500Mi, o tai reiškia 500 megabaitų. Išteklių užklausos „užrakina“ darbuotojų mazgų pajėgumą, o tai reiškia, kad blokas su 1000 m CPU užklausa mazge su 4 vCPU paliks tik 3 vCPU prieinamus kitiems blokams. [1]
Laisvas (perteklinis rezervas) yra skirtumas tarp prašomų išteklių ir faktinio naudojimo. Pavyzdžiui, blokas, kuris reikalauja 2 GiB atminties, bet naudoja tik 200 MiB, turi ~1,8 GiB „perteklinės“ atminties. Perteklius kainuoja pinigus. Galima apytiksliai apskaičiuoti, kad 1 GiB perteklinės atminties kainuoja ~10 USD per mėnesį. [2]
Kubernetes išteklių ataskaita (kube-resource-report) rodo perteklinius rezervus ir gali padėti nustatyti taupymo galimybes:
Kubernetes išteklių ataskaita rodomas perteklius, sukauptas pagal programą ir komandą. Tai leidžia jums rasti vietas, kur galima sumažinti išteklių poreikį. Sukurtoje HTML ataskaitoje pateikiama tik išteklių naudojimo momentinė nuotrauka. Turėtumėte pažvelgti į procesoriaus / atminties naudojimą laikui bėgant, kad nustatytumėte tinkamas išteklių užklausas. Štai Grafana diagrama, skirta „tipinei“ daug procesoriaus reikalaujančiai paslaugai: visi moduliai naudoja žymiai mažiau nei 3 reikalaujami procesoriaus branduoliai:
Sumažinus procesoriaus užklausą nuo 3000m iki ~400m, atlaisvinami resursai kitiems darbo krūviams ir klasteris gali būti mažesnis.
Vidutinis EC2 egzempliorių procesoriaus naudojimas dažnai svyruoja vienaženklių procentų diapazone. rašo Corey Quinn. Nors dėl EC2 tinkamo dydžio įvertinimas gali būti blogas sprendimasPakeisti kai kurias Kubernetes išteklių užklausas YAML faile yra paprasta ir galima sutaupyti daug.
Bet ar tikrai norime, kad žmonės pakeistų YAML failų reikšmes? Ne, mašinos gali tai padaryti daug geriau! Kubernetes Vertical Pod Autoscaler (VPA) tai daro: pritaiko išteklių užklausas ir apribojimus pagal darbo krūvį. Štai „Prometheus“ procesoriaus užklausų (plona mėlyna linija), kurią laikui bėgant pritaikyta VPA, diagramos pavyzdys:
Goldilokai iš Fairwind yra įrankis, kuris sukuria VPA kiekvienam diegimui vardų srityje ir tada pateikia VPA rekomendaciją savo prietaisų skydelyje. Tai gali padėti kūrėjams nustatyti tinkamas procesoriaus / atminties užklausas savo programoms:
Paskutinis, bet ne mažiau svarbus dalykas – AWS EC2 išlaidas galima sumažinti naudojant „Spot“ egzempliorius kaip „Kubernetes“ darbuotojų mazgus [3]. Vietiniai egzemplioriai yra prieinami su nuolaida iki 90%, palyginti su kainomis pagal pareikalavimą. „Kubernetes“ paleidimas „EC2 Spot“ yra geras derinys: norint pasiekti didesnį pasiekiamumą, reikia nurodyti kelis skirtingus egzempliorių tipus, o tai reiškia, kad galite gauti didesnį mazgą už tą pačią arba mažesnę kainą, o padidintą talpą galima naudoti konteineriniams Kubernetes darbo krūviams.
Kaip paleisti „Kubernetes“ „EC2 Spot“? Yra keletas variantų: naudokite trečiosios šalies paslaugą, pvz., „SpotInst“ (dabar vadinamą „Spot“, neklauskite kodėl) arba tiesiog pridėkite „Spot AutoScalingGroup“ (ASG) prie savo grupės. Pavyzdžiui, čia yra „CloudFormation“ fragmentas, skirtas „optimizuoto pajėgumo“ Spot ASG su keliais egzempliorių tipais:
Kokia yra geriausia jūsų „Kubernetes“ debesies išlaidų taupymo praktika? Praneškite man adresu „Twitter“ (@try_except_).
[1] Tiesą sakant, mažiau nei 3 vCPU liks naudoti, nes mazgo pralaidumas sumažėja dėl rezervuotų sistemos išteklių. „Kubernetes“ išskiria fizinį mazgo pajėgumą ir „suteiktus“ išteklius (Paskirstomas mazgas).
[2] Skaičiavimo pavyzdys: vienas m5.didelis egzempliorius su 8 GiB atminties kainuoja ~84$ per mėnesį (eu-central-1, On-Demand), t.y. 1/8 mazgo blokavimas yra maždaug ~ 10 USD per mėnesį.
[3] Yra daug daugiau būdų, kaip sumažinti EC2 sąskaitą, pvz., rezervuoti egzemplioriai, taupymo planas ir tt – tų temų čia nenagrinėsiu, bet jūs tikrai turėtumėte jas pasidomėti!