Kako prihraniti pri stroških v oblaku pri delu s Kubernetesom? Enotne prave rešitve ni, vendar ta članek opisuje več orodij, ki vam lahko pomagajo učinkoviteje upravljati vire in zmanjšati stroške računalništva v oblaku.
Ta članek sem napisal z mislijo na Kubernetes za AWS, vendar bo veljal (skoraj) na popolnoma enak način za druge ponudnike v oblaku. Predvidevam, da imajo vaše gruče že konfigurirano samodejno skaliranje (cluster-autoscaler). Z odstranitvijo virov in zmanjšanjem uvedbe boste denar prihranili le, če boste zmanjšali tudi vašo floto delovnih vozlišč (instance EC2).
Delo v hitrem okolju je super. Želimo tehnološke organizacije pospešeno. Hitrejša dostava programske opreme pomeni tudi več uvedb PR, predoglednih okolij, prototipov in analitičnih rešitev. Vse je razporejeno na Kubernetes. Kdo ima čas za ročno čiščenje testnih uvedb? Na brisanje teden dni starega poskusa je enostavno pozabiti. Račun za oblak se bo na koncu povečal zaradi nečesa, kar smo pozabili zapreti:
(Henning Jacobs:
Zhiza:
(navedki) Corey Quinn:
Mit: Vaš račun AWS je funkcija števila uporabnikov, ki jih imate.
Dejstvo: vaš rezultat AWS je funkcija števila inženirjev, ki jih imate.
Ivan Kurnosov (v odgovor):
Resnično dejstvo: vaš rezultat AWS je funkcija števila stvari, ki ste jih pozabili onemogočiti/izbrisati.)
Kubernetes hišnik (kube-janitor) pomaga očistiti vašo gručo. Konfiguracija hišnika je prilagodljiva za globalno in lokalno uporabo:
Pravila za celotno gručo lahko definirajo najdaljši čas življenja (TTL) za PR/testne uvedbe.
Posamezne vire je mogoče označiti z janitor/ttl, na primer za samodejno odstranitev konice/prototipa po 7 dneh.
Splošna pravila so opredeljena v datoteki YAML. Njegova pot je podana skozi parameter --rules-file v kube-hišnik. Tukaj je primer pravila za odstranitev vseh imenskih prostorov -pr- v imenu po dveh dneh:
Naslednji primer ureja uporabo oznake aplikacije na sklopih Deployment in StatefulSet za vse nove Deployments/StatefulSets v letu 2020, vendar hkrati dovoljuje izvajanje testov brez te oznake za en teden:
- 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
Zaženite časovno omejeno predstavitev za 30 minut na gruči, v kateri se izvaja kube-janitor:
kubectl run nginx-demo --image=nginx
kubectl annotate deploy nginx-demo janitor/ttl=30m
Drug vir naraščajočih stroškov so trajne količine (AWS EBS). Če izbrišete Kubernetes StatefulSet, ne izbrišete njegovih trajnih nosilcev (PVC – PersistentVolumeClaim). Neuporabljene količine EBS lahko zlahka povzročijo stroške v višini več sto dolarjev na mesec. Kubernetes Janitor ima funkcijo za čiščenje neuporabljenih PVC-jev. Na primer, to pravilo bo odstranilo vse PVC-je, ki niso nameščeni z modulom in na katere se ne sklicuje StatefulSet ali CronJob:
# удалить все PVC, которые не смонтированы и на которые не ссылаются StatefulSets
- id: remove-unused-pvcs
resources:
- persistentvolumeclaims
jmespath: "_context.pvc_is_not_mounted && _context.pvc_is_not_referenced"
ttl: 24h
Kubernetes Janitor vam lahko pomaga ohraniti vašo gručo čisto in preprečiti, da bi se stroški računalništva v oblaku počasi kopičili. Za navodila za uvajanje in konfiguracijo sledite PREBERI ME kube-hišnik.
Zmanjšajte nastanek kamna v prostem času
Testni in uprizoritveni sistemi morajo običajno delovati le med delovnim časom. Nekatere produkcijske aplikacije, kot so zaledna/skrbniška orodja, prav tako zahtevajo le omejeno razpoložljivost in so lahko čez noč onemogočene.
Kubernetes Downscaler (kube-downscaler) omogoča uporabnikom in operaterjem, da zmanjšajo sistem v času izven delovnega časa. Razmestitve in StatefulSets se lahko prilagodijo na nič replik. CronJobs je lahko začasno ustavljen. Kubernetes Downscaler je konfiguriran za celotno gručo, enega ali več imenskih prostorov ali posamezne vire. Nastavite lahko "čas mirovanja" ali, nasprotno, "delovni čas". Na primer, da čim bolj zmanjšate skaliranje med nočmi in vikendi:
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
Tukaj je graf za skaliranje delovnih vozlišč gruče ob vikendih:
Zmanjšanje s ~13 na 4 delovna vozlišča zagotovo naredi opazno razliko v vašem računu za AWS.
Kaj pa, če moram delati med "nedelovanjem" gruče? Določene uvedbe je mogoče trajno izključiti iz skaliranja z dodajanjem opombe downscaler/exclude: true. Razmestitve je mogoče začasno izključiti z opombo downscaler/exclude-until z absolutnim časovnim žigom v obliki LLLL-MM-DD HH:MM (UTC). Po potrebi je mogoče celotno gručo pomanjšati z uvedbo sklopa z opombo downscaler/force-uptime, na primer z zagonom 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
Številne aplikacije/storitve se ukvarjajo z dinamičnim vzorcem nalaganja: včasih njihovi moduli mirujejo, včasih pa delujejo s polno zmogljivostjo. Upravljanje stalne flote strokov za obvladovanje največje konične obremenitve ni ekonomično. Kubernetes podpira vodoravno samodejno skaliranje po viru HorizontalPodAutoscaler (HPA). Uporaba procesorja je pogosto dober pokazatelj za skaliranje:
Zalando je ustvaril komponento za enostavno povezovanje meritev po meri za skaliranje: Adapter Kube Metrics (kube-metrics-adapter) je generični metrični adapter za Kubernetes, ki lahko zbira in streže prilagojene in zunanje metrike za horizontalno samodejno skaliranje podov. Podpira skaliranje na podlagi metrik Prometheus, čakalnih vrst SQS in drugih nastavitev. Na primer, če želite razširiti svojo uvedbo na meritev po meri, ki jo sama aplikacija predstavlja kot JSON v /metrics, uporabite:
Konfiguriranje vodoravnega samodejnega skaliranja s HPA bi moralo biti eno od privzetih dejanj za izboljšanje učinkovitosti storitev brez stanja. Spotify ima predstavitev z njihovimi izkušnjami in priporočili za HPA: razširite svoje uvedbe, ne denarnice.
Zmanjšajte prezasedenost virov
Delovne obremenitve Kubernetes določajo njihove potrebe po CPU/pomnilniku prek »zahtev za sredstva«. Sredstva procesorja se merijo v navideznih jedrih ali pogosteje v "milijedrih", na primer 500 m implicira 50 % vCPE. Pomnilniški viri se merijo v bajtih, uporabljajo pa se lahko običajne pripone, na primer 500Mi, kar pomeni 500 megabajtov. Zahteve za vir "zaklenejo" zmogljivost na delovnih vozliščih, kar pomeni, da bo pod z zahtevo 1000 m CPE na vozlišču s 4 vCPU pustil na voljo samo 3 vCPU drugim podom. [1]
Ohlapnost (presežna rezerva) je razlika med zahtevanimi viri in dejansko uporabo. Na primer, pod, ki zahteva 2 GiB pomnilnika, vendar uporablja le 200 MiB, ima ~1,8 GiB "odvečnega" pomnilnika. Presežek stane. Približno lahko ocenimo, da 1 GiB redundantnega pomnilnika stane ~10 USD na mesec. [2]
Poročilo o virih Kubernetes (kube-resource-report) prikazuje presežne rezerve in vam lahko pomaga določiti potencial prihranka:
Poročilo o virih Kubernetes prikazuje presežek, združen po aplikaciji in ukazu. To vam omogoča, da najdete mesta, kjer je mogoče zmanjšati zahteve po virih. Ustvarjeno poročilo HTML zagotavlja le posnetek uporabe virov. Če želite določiti ustrezne zahteve po sredstvih, morate pogledati porabo procesorja/pomnilnika skozi čas. Tukaj je grafikon Grafana za "tipično" storitev, ki je obremenjena s CPE: vsi sklopi uporabljajo bistveno manj kot 3 zahtevana jedra CPE:
Zmanjšanje zahteve CPE s 3000 m na ~ 400 m sprosti vire za druge delovne obremenitve in omogoči, da je gruča manjša.
»Povprečna poraba procesorja instanc EC2 se pogosto giblje v enomestnem razponu odstotkov,« piše Corey Quinn. Medtem ko za EC2 ocenjevanje prave velikosti je lahko slaba odločitevSpreminjanje nekaterih poizvedb virov Kubernetes v datoteki YAML je preprosto in lahko prinese velike prihranke.
Toda ali res želimo, da ljudje spreminjajo vrednosti v datotekah YAML? Ne, stroji zmorejo veliko bolje! Kubernetes Vertical Pod Autoscaler (VPA) naredi prav to: prilagodi zahteve za vire in omejitve glede na delovno obremenitev. Tukaj je primer grafa zahtev CPE Prometheus (tanka modra črta), ki jih je VPA prilagodil skozi čas:
Goldilocks podjetja Fairwind je orodje, ki ustvari VPA za vsako uvedbo v imenskem prostoru in nato na svoji nadzorni plošči prikaže priporočilo VPA. Razvijalcem lahko pomaga pri nastavitvi pravilnih zahtev CPU/pomnilnika za njihove aplikacije:
Nenazadnje je mogoče stroške AWS EC2 zmanjšati z uporabo instanc Spot kot delovnih vozlišč Kubernetes [3]. Promptni primerki so na voljo s popustom do 90 % v primerjavi s cenami na zahtevo. Izvajanje Kubernetesa na EC2 Spot je dobra kombinacija: določiti morate več različnih vrst instanc za višjo razpoložljivost, kar pomeni, da lahko dobite večje vozlišče za enako ali nižjo ceno, povečano zmogljivost pa lahko uporabijo kontejnerske delovne obremenitve Kubernetes.
Kako zagnati Kubernetes na EC2 Spot? Obstaja več možnosti: uporabite storitev tretje osebe, kot je SpotInst (zdaj imenovana "Spot", ne sprašujte me zakaj), ali preprosto dodajte skupino Spot AutoScalingGroup (ASG) v vašo gručo. Tukaj je na primer izrezek CloudFormation za "zmogljivo optimiziran" Spot ASG z več vrstami primerkov:
Katere so vaše najboljše prakse za prihranek stroškov v oblaku na Kubernetesu? Prosim, sporočite mi na Twitter (@try_except_).
[1] Pravzaprav bodo ostali uporabni manj kot 3 vCPU-ji, saj se prepustnost vozlišča zmanjša zaradi rezerviranih sistemskih virov. Kubernetes razlikuje med zmogljivostjo fizičnega vozlišča in "zagotovljenimi" viri (Vozlišče, ki ga je mogoče dodeliti).
[2] Primer izračuna: ena instanca m5.large z 8 GiB pomnilnika znaša ~84 $ na mesec (eu-central-1, On-Demand), tj. blokiranje 1/8 vozlišča je približno ~10 USD/mesec.
[3] Obstaja veliko več načinov za znižanje računa EC2, kot so rezervirani primerki, varčevalni načrt itd. – teh tem ne bom obravnaval tukaj, vendar jih morate vsekakor preučiti!