Nola aurreztu hodeiko kostuetan Kubernetesekin lan egiten duzunean? Ez dago irtenbide egoki bakarra, baina artikulu honek zure baliabideak modu eraginkorragoan kudeatzen eta hodeiko informatika kostuak murrizten lagunduko dizuten hainbat tresna deskribatzen ditu.
Artikulu hau idatzi nuen Kubernetes AWSrako kontuan hartuta, baina (ia) berdin aplikatuko da hodeiko beste hornitzaile batzuei. Suposatzen dut zure kluster(k) dagoeneko autoeskala konfiguratuta dutela (cluster-autoscaler). Baliabideak kentzeak eta inplementazioa txikitzeak dirua aurreztuko dizu zure langile-nodoen flota ere murrizten badu (EC2 instantzia).
Artikulu honek:
erabili gabeko baliabideak garbitzea (kube-janitor)
Erritmo bizkorreko ingurune batean lan egitea bikaina da. Erakunde teknologikoak nahi ditugu azeleratua. Softwarearen entrega azkarragoak PR inplementazio, aurrebista-ingurune, prototipo eta soluzio analitiko gehiago ere esan nahi du. Dena Kubernetesen zabaltzen da. Nork du denbora proba-inplementazioak eskuz garbitzeko? Erraza da astebeteko esperimentu bat ezabatzeaz ahaztea. Hodeiaren faktura igotzen amaituko da ixtea ahaztu zaigun zerbaitengatik:
(Henning Jacobs:
Zhiza:
(aipuak) Corey Quinn:
Mitoa: Zure AWS kontua duzun erabiltzaile kopuruaren funtzioa da.
Izan ere: zure AWS puntuazioa duzun ingeniari kopuruaren funtzioa da.
Ivan Kurnosov (erantzun gisa):
Egia da: zure AWS puntuazioa desgaitu/ezabatzea ahaztu duzun gauza kopuruaren funtzioa da.)
Kuberneteseko atezaina (kube-janitor) zure clusterra garbitzen laguntzen du. Atezainaren konfigurazioa malgua da erabilera global eta lokalerako:
Kluster osoko arauek PR/proba inplementazioetarako gehienezko bizi-denbora (TTL) defini dezakete.
Banakako baliabideak janitor/ttl-rekin oharta daitezke, adibidez 7 egunen buruan punta/prototipoa automatikoki kentzeko.
Arau orokorrak YAML fitxategian definitzen dira. Bere bidea parametrotik pasatzen da --rules-file kube-janitor in. Hona hemen izen-espazio guztiak kentzeko arau adibide bat -pr- bi egunen buruan izenean:
Ondorengo adibide honek Deployment eta StatefulSet pod-en aplikazioaren etiketaren erabilera arautzen du 2020ko Inplementazio/StatefulSet berri guztietarako, baina aldi berean etiketa hori gabe probak egiteko aukera ematen du astebetez:
- 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
Exekutatu denbora mugatuko demo bat 30 minutuz kube-janitor exekutatzen duen kluster batean:
kubectl run nginx-demo --image=nginx
kubectl annotate deploy nginx-demo janitor/ttl=30m
Kostuak handitzeko beste iturri bat bolumen iraunkorrak (AWS EBS) dira. Kubernetes StatefulSet bat ezabatzeak ez ditu bere bolumen iraunkorrak ezabatzen (PVC - PersistentVolumeClaim). Erabiltzen ez diren EBS bolumenek hilero ehunka dolar kostuak erraz ditzakete. Kubernetes Janitorrek erabili gabeko PVCak garbitzeko eginbide bat du. Adibidez, arau honek modulu batek muntatzen ez dituen eta StatefulSet edo CronJob-ek erreferentziarik ez duten PVC guztiak kenduko ditu:
# удалить все PVC, которые не смонтированы и на которые не ссылаются StatefulSets
- id: remove-unused-pvcs
resources:
- persistentvolumeclaims
jmespath: "_context.pvc_is_not_mounted && _context.pvc_is_not_referenced"
ttl: 24h
Kubernetes Janitor-ek zure clusterra garbi mantentzen lagunduko dizu eta hodeiko informatikako kostuak poliki-poliki pilatzea ekiditen. Inplementazio eta konfigurazio argibideak lortzeko, jarraitu IRAKURRI kube-janitor.
Murriztu eskalatzea lanik gabeko orduetan
Proba eta eszenatze sistemak normalean lanorduetan soilik funtzionatzeko behar dira. Produkzio-aplikazio batzuek, hala nola back office/administrazio-tresnek, erabilgarritasun mugatua baino ez dute behar eta baliteke egun batetik bestera desgaitzea.
Kubernetes Downscaler (kube-downscaler) erabiltzaileei eta operadoreei sistema eskalatzeko aukera ematen die lanorduz kanpoko orduetan. Inplementazioak eta StatefulSets zero erreplika eskala daitezke. CronJobs eten daiteke. Kubernetes Downscaler kluster oso baterako, izen-espazio baterako edo gehiagorako edo baliabide indibidual baterako konfiguratuta dago. "Inaktibo-denbora" edo, alderantziz, "lan-denbora" ezar dezakezu. Adibidez, gau eta asteburuetan eskalatzea ahalik eta gehien murrizteko:
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
Hona hemen asteburuetan cluster-eko langile-nodoak eskalatzeko grafiko bat:
~ 13 langile-nodotik 4ra jaistea, zalantzarik gabe, alde nabarmena da zure AWS fakturan.
Baina zer gertatzen da klusterraren "geldialdi" garaian lan egin behar badut? Zenbait inplementazio eskalatzetik behin betiko baztertu daitezke beheranzko eskalatzailea/baztertu: egiazko oharpena gehituz. Inplementazioak aldi baterako baztertu daitezke beheranzko eskalatzailea/exclude-until ohartarazpena erabiliz, denbora-zigilu absolutu batekin, YYYY-MM-DD HH:MM (UTC) formatuan. Beharrezkoa izanez gero, kluster osoa eskala daiteke oharpenarekin pod bat zabalduz downscaler/force-uptime, adibidez, nginx blank abiaraziz:
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
Ikusi IRAKURRI kube-downscaler, zabaltzeko argibideak eta aukera osagarriak interesatzen bazaizkizu.
Erabili autoeskala horizontala
Aplikazio/zerbitzu askok karga-eredu dinamiko bati aurre egiten diote: batzuetan haien moduluak inaktibo daude, eta beste batzuetan gaitasun osoz funtzionatzen dute. Lekaren flota iraunkor bat ustiatzea ez da ekonomikoa gehieneko kargari aurre egiteko. Kubernetes-ek eskalatze automatiko horizontala onartzen du baliabide batean zehar HorizontalPodAutoscaler (HPA). PUZaren erabilera eskalatzeko adierazle ona da sarritan:
Zalandok osagai bat sortu du eskalatzeko neurri pertsonalizatuak erraz konektatzeko: Kube Metrics Adapter (kube-metrics-adapter) Kubernetesentzako neurketa-egokitzaile generiko bat da, eta sistema pertsonalizatuak eta kanpoko neurriak bildu eta horni ditzake, lekak horizontalki eskalatzeko. Prometheus-en metriketan, SQS ilaretan eta beste ezarpen batzuetan oinarritutako eskalatzea onartzen du. Adibidez, zure inplementazioa aplikazioak berak JSON gisa adierazten duen metrika pertsonalizatu batera eskalatzeko /metrics use:
HPArekin autoeskala horizontala konfiguratzea estaturik gabeko zerbitzuen eraginkortasuna hobetzeko ekintza lehenetsietako bat izan beharko litzateke. Spotify-k HPArako duten esperientzia eta gomendioekin aurkezpen bat egin du: eskalatu zure inplementazioak, ez zure zorroa.
Murriztu baliabideen gehiegizko erreserba
Kubernetesen lan-kargak beren CPU/memoria beharrak zehazten dituzte "baliabide-eskaeren" bidez. CPU baliabideak nukleo birtualetan neurtzen dira edo normalean "milikoreetan" neurtzen dira, adibidez, 500m-k %50eko vCPU dakar. Memoria-baliabideak bytetan neurtzen dira, eta atzizki arruntak erabil daitezke, adibidez, 500Mi, hau da, 500 megabyte. Baliabideen eskaerak langile-nodoetan gaitasuna "blokeatu" egiten du, hau da, 1000 m-ko CPU eskaera duen pod batek 4 vCPU dituen nodo batean 3 vCPU baino ez ditu erabilgarri utziko beste podentzat. [1]
Slack (gehiegizko erreserba) eskatutako baliabideen eta benetako erabileraren arteko aldea da. Adibidez, 2 GiB memoria eskatzen duen baina 200 MiB soilik erabiltzen dituen pod batek ~ 1,8 GiB "gehiegizko" memoria du. Gehiegizkoak dirua kostatzen du. Gutxi gorabehera kalkula daiteke 1 GiB memoria erredundanteak ~ $ 10 hilean balio duela. [2]
Kubernetes baliabideen txostena (kube-resource-report) gehiegizko erreserbak erakusten ditu eta aurrezteko potentziala zehazten lagun zaitzake:
Kubernetes baliabideen txostena aplikazioaren eta komandoen arabera gehitutako soberakina erakusten du. Horri esker, baliabideen eskaerak murrizteko tokiak aurki ditzakezu. Sortutako HTML txostenak baliabideen erabileraren argazkia baino ez du ematen. PUZaren/memoriaren erabilera denboran zehar aztertu beharko zenuke baliabideen eskaera egokiak zehazteko. Hona hemen Grafana grafiko bat CPU-astuneko zerbitzu "ohiko" baterako: pod guztiek eskatutako 3 CPU nukleoak baino nabarmen gutxiago erabiltzen dituzte:
PUZaren eskaera 3000m-tik ~ 400m-ra murrizteak beste lan-karga batzuetarako baliabideak askatzen ditu eta clusterra txikiagoa izatea ahalbidetzen du.
Baina benetan nahi al dugu jendeak YAML fitxategietan balioak aldatzea? Ez, makinek askoz hobeto egin dezakete! Kubernetes Bertikala Pod Autoscaler (VPA) horixe egiten du: baliabideen eskaerak eta mugak lan-kargaren arabera egokitzen ditu. Hona hemen VPAk denboran zehar egokitutako Prometheus CPU eskaeren (lerro urdin mehea) grafiko adibide bat:
Goldilocks Fairwind-ek izen-espazio batean inplementazio bakoitzerako VPA bat sortzen duen tresna da eta, ondoren, VPA gomendio bat bistaratzen du bere panelean. Garatzaileei beren aplikazioetarako CPU/memoria eskaera zuzenak ezartzen lagun diezaieke:
Azkenik, AWS EC2 kostuak murriztu daitezke Spot instantziak Kubernetesen langile-nodo gisa erabiliz. [3]. Lekuko instantziak % 90erainoko deskontuarekin eskuragarri daude Eskaera Onartutako prezioekin alderatuta. Kubernetes EC2 Spot-en exekutatzen konbinazio ona da: hainbat instantzia mota desberdin zehaztu behar dituzu erabilgarritasun handiagoa izateko, hau da, nodo handiagoa lor dezakezu prezio berdinean edo baxuagoan, eta edukiontzi handitu Kubernetes lan-kargak erabil dezakete.
Nola exekutatu Kubernetes EC2 Spot-en? Hainbat aukera daude: erabili SpotInst bezalako hirugarrenen zerbitzu bat (gaur egun "Spot" izenekoa, ez galdetu zergatik), edo, besterik gabe, gehitu Spot AutoScalingGroup (ASG) zure klusterrean. Adibidez, hona hemen CloudFormation zati bat "edukiera optimizatutako" Spot ASG baterako hainbat instantzia mota dituena:
[1] Izan ere, 3 vCPU baino gutxiago erabilgarri jarraituko dute nodoaren erreserba sistemaren baliabideek murriztu egiten baitute. Kubernetes-ek nodo fisikoen gaitasuna eta "hornitutako" baliabideak bereizten ditu (Nodo esleigarria).
[2] Kalkulu-adibidea: 5 GiB-ko memoria duen m8.instantzia handi bat hilean ~ $ 84 da (eu-central-1, On-Demand), hau da. 1/8 nodo blokeatzea ~ $ 10 hilean da gutxi gorabehera.
[3] EC2 faktura murrizteko beste modu asko daude, hala nola Erreserbatutako Instantziak, Aurrezki Plana, etab. - Ez ditut gai horiek landuko hemen, baina aztertu beharko zenituzke zalantzarik gabe!