Hogyan takaríthat meg felhőköltségeket a Kubernetes-el való munka során? Nincs egyetlen helyes megoldás, de ez a cikk számos olyan eszközt ismertet, amelyek segítségével hatékonyabban kezelheti erőforrásait, és csökkentheti a számítási felhő költségeit.
Ezt a cikket a Kubernetes for AWS szem előtt tartásával írtam, de (majdnem) pontosan ugyanúgy fog vonatkozni más felhőszolgáltatókra is. Feltételezem, hogy a fürt(ek)ben már be van állítva az automatikus skálázás (cluster-autoscaler). Az erőforrások eltávolítása és a telepítés kicsinyítése csak akkor takarít meg pénzt, ha csökkenti a dolgozói csomópontok flottáját (EC2 példányok).
Ez a cikk a következőkre terjed ki:
a fel nem használt erőforrások megtisztítása (kube-házmester)
Felgyorsult környezetben dolgozni nagyszerű. Technikai szervezeteket akarunk felgyorsult. A gyorsabb szoftverszállítás több PR-telepítést, előnézeti környezeteket, prototípusokat és elemzési megoldásokat is jelent. Minden telepítve van a Kubernetesen. Kinek van ideje manuálisan megtisztítani a teszttelepítéseket? Könnyű elfelejteni egy hetes kísérlet törlését. A felhőszámla végül növekedni fog valami miatt, amit elfelejtettünk bezárni:
(Henning Jacobs:
Zhiza:
(idézetek) Corey Quinn:
Tévhit: Az AWS-fiókja a felhasználói szám függvénye.
Tény: Az AWS-pontszám a mérnökei számának függvénye.
Ivan Kurnosov (válaszként):
Valós tény: Az AWS-pontszám azon dolgok számától függ, amelyeket elfelejtett letiltani/törölni.)
Kubernetes házmester (kube-janitor) segít megtisztítani a klasztert. A portás konfiguráció rugalmas mind globális, mind helyi használatra:
A fürtszintű szabályok meghatározhatják a PR/teszttelepítések maximális élettartamát (TTL).
Az egyes erőforrásokhoz a janitor/ttl segítségével lehet megjegyzéseket fűzni, például a spike/prototípus automatikus eltávolításához 7 nap után.
Az általános szabályokat a YAML fájl határozza meg. Útja áthalad a paraméteren --rules-file kube-házmesterben. Íme egy példaszabály az összes névtér eltávolításához -pr- a névben két nap után:
A következő példa szabályozza az alkalmazáscímke használatát a Deployment és StatefulSet podokon minden új telepítés/StatefulSet esetében 2020-ban, ugyanakkor lehetővé teszi a tesztek végrehajtását e címke nélkül egy hétig:
- 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
Futtasson egy korlátozott ideig tartó demót 30 percig a kube-janitort futtató fürtön:
kubectl run nginx-demo --image=nginx
kubectl annotate deploy nginx-demo janitor/ttl=30m
A növekvő költségek másik forrása a tartós volumen (AWS EBS). A Kubernetes StatefulSet törlése nem törli annak állandó köteteit (PVC – PersistentVolumeClaim). A fel nem használt EBS-kötetek könnyen több száz dolláros költséggel járhatnak havonta. A Kubernetes Janitor funkcióval rendelkezik a fel nem használt PVC-k tisztítására. Ez a szabály például eltávolítja az összes olyan PVC-t, amelyet nem egy modul szerel fel, és amelyekre nem hivatkozik a StatefulSet vagy a CronJob:
# удалить все PVC, которые не смонтированы и на которые не ссылаются StatefulSets
- id: remove-unused-pvcs
resources:
- persistentvolumeclaims
jmespath: "_context.pvc_is_not_mounted && _context.pvc_is_not_referenced"
ttl: 24h
A Kubernetes Janitor segíthet a fürt tisztán tartásában, és megakadályozhatja, hogy a felhőalapú számítástechnikai költségek lassan felhalmozódjanak. A telepítési és konfigurációs utasításokért kövesse a következőt README kube-janitor.
Csökkentse a méretezést munkaidőn kívül
Teszt- és állomásozórendszerekre jellemzően csak munkaidőben történő működéshez van szükség. Egyes éles alkalmazások, például a háttérirodai/adminisztrátori eszközök, szintén csak korlátozott rendelkezésre állást igényelnek, és egyik napról a másikra letilthatók.
Kubernetes Downscaler (kube-downscaler) lehetővé teszi a felhasználóknak és a kezelőknek, hogy a munkaidőn kívüli idő alatt lekicsinyítsék a rendszert. A telepítések és a StatefulSets nulla replikára méretezhetők. A CronJobs felfüggeszthető. A Kubernetes Downscaler egy teljes fürthöz, egy vagy több névtérhez vagy egyedi erőforrásokhoz van konfigurálva. Beállíthatja az „üresjárati időt”, vagy fordítva, a „munkaidőt”. Például a méretezés csökkentése érdekében éjszaka és hétvégén:
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
Íme egy grafikon a fürt dolgozói csomópontok hétvégi skálázásához:
A ~13-ról 4-re kicsinyítés minden bizonnyal észrevehető különbséget jelent az AWS-számlában.
De mi van akkor, ha a fürt „leállása” alatt kell dolgoznom? Egyes telepítések véglegesen kizárhatók a méretezésből a downscaler/exclude: true annotation hozzáadásával. Az üzembe helyezések ideiglenesen kizárhatók a leskálázó/kizárásig megjegyzés használatával, abszolút időbélyeggel, ÉÉÉÉ-HH-NN ÓÓ:PP (UTC). Ha szükséges, a teljes fürt visszaméretezhető a megjegyzéssel ellátott pod telepítésével downscaler/force-uptimepéldául az nginx blank elindításával:
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
Lát README kube-downscaler, ha érdeklik a telepítési utasítások és a további lehetőségek.
Használjon vízszintes automatikus skálázást
Sok alkalmazás/szolgáltatás dinamikus betöltési mintával foglalkozik: néha tétlenek a moduljaik, néha teljes kapacitással működnek. A maximális csúcsterheléssel való megbirkózás érdekében nem gazdaságos egy állandó tokflotta működtetése. A Kubernetes támogatja a vízszintes automatikus skálázást egy erőforráson keresztül HorizontalPodAutoscaler (HPA). A CPU-használat gyakran jó mutató a méretezéshez:
A Zalando létrehozott egy komponenst, amellyel egyszerűen csatlakoztathatók az egyéni mutatók a méretezéshez: Kube Metrics Adapter (kube-metrics-adapter) egy általános metrika-adapter a Kubernetes számára, amely egyéni és külső metrikákat gyűjthet és szolgálhat ki a sorba rendezések vízszintes automatikus skálázásához. Támogatja a Prometheus-metrikákon, az SQS-sorokon és egyéb beállításokon alapuló skálázást. Ha például a telepítést egy egyéni mérőszámra kívánja méretezni, amelyet maga az alkalmazás JSON-ként képvisel a /metrics mappában, használja a következőket:
A vízszintes automatikus skálázás HPA-val történő konfigurálása az egyik alapértelmezett művelet az állapot nélküli szolgáltatások hatékonyságának javítása érdekében. A Spotify bemutatót tart a HPA-val kapcsolatos tapasztalataikkal és ajánlásaikkal: méretezheti a telepítéseket, nem a pénztárcáját.
Az erőforrások túlfoglalásának csökkentése
A Kubernetes munkaterhelései az „erőforrás-kérések” révén határozzák meg a CPU-/memóriaigényeiket. A CPU erőforrásait virtuális magokban vagy gyakrabban „millicore”-ban mérik, például az 500 m 50%-os vCPU-t jelent. A memória erőforrásait bájtokban mérik, és általános utótagok is használhatók, például 500Mi, ami 500 megabájtot jelent. Az erőforráskérések „zárolják” a dolgozói csomópontok kapacitását, ami azt jelenti, hogy egy 1000 m-es CPU-kéréssel rendelkező pod egy 4 vCPU-val rendelkező csomóponton csak 3 vCPU-t hagy más pod-ok rendelkezésére. [1]
Laza (többlettartalék) a kért erőforrások és a tényleges felhasználás közötti különbség. Például egy pod, amely 2 GiB memóriát igényel, de csak 200 MiB-ot használ, ~1,8 GiB „felesleges” memóriával rendelkezik. A többlet pénzbe kerül. Nagyjából megbecsülhető, hogy 1 GiB redundáns memória havonta ~10 dollárba kerül. [2]
Kubernetes erőforrásjelentés (kube-resource-report) megjeleníti a felesleges tartalékokat, és segíthet meghatározni a megtakarítási lehetőségeket:
Kubernetes erőforrásjelentés a többletet mutatja alkalmazásonként és parancsonként összesítve. Ez lehetővé teszi, hogy olyan helyeket találjon, ahol az erőforrásigény csökkenthető. Az előállított HTML-jelentés csak pillanatképet ad az erőforrás-használatról. Meg kell vizsgálnia a CPU/memóriahasználatot az idő múlásával a megfelelő erőforrásigények meghatározásához. Íme egy Grafana diagram egy "tipikus" CPU-igényes szolgáltatáshoz: minden pod sokkal kevesebbet használ, mint a 3 kért CPU mag:
A CPU-igény 3000 méterről ~400 méterre való csökkentése erőforrásokat szabadít fel más munkaterhelések számára, és lehetővé teszi a fürt kisebb méretét.
„Az EC2 példányok átlagos CPU-használata gyakran az egyszámjegyű százalékos tartományban mozog” írja Corey Quinn. Míg az EC2-re a megfelelő méret megbecslése rossz döntés lehetEgyes Kubernetes-erőforrás-lekérdezések megváltoztatása egy YAML-fájlban egyszerű, és hatalmas megtakarításokat eredményezhet.
De tényleg azt akarjuk, hogy az emberek megváltoztatják a YAML-fájlok értékeit? Nem, a gépek sokkal jobban meg tudják csinálni! Kubernetes Vertical Pod Autoscaler (VPA) éppen ezt teszi: a munkaterheléshez igazítja az erőforráskéréseket és a megszorításokat. Íme egy példadiagram a Prometheus CPU-kéréseiről (vékony kék vonal), amelyet a VPA idővel adaptált:
Boglárka A Fairwind egy olyan eszköz, amely VPA-t hoz létre minden egyes telepítéshez egy névtérben, majd megjelenít egy VPA-ajánlást az irányítópulton. Segíthet a fejlesztőknek beállítani a megfelelő CPU/memóriakérelmeket alkalmazásaikhoz:
Végül, de nem utolsósorban, az AWS EC2 költségei csökkenthetők, ha a Spot példányokat Kubernetes munkavégző csomópontként használjuk [3]. A helyszíni példányok akár 90%-os kedvezménnyel kaphatók az On-Demand árakhoz képest. A Kubernetes futtatása EC2 Spot-on jó kombináció: több különböző példánytípust kell megadni a magasabb rendelkezésre állás érdekében, vagyis azonos vagy alacsonyabb áron kaphatunk nagyobb csomópontot, a megnövekedett kapacitást pedig konténeres Kubernetes-munkaterhelések használhatják.
Hogyan kell futtatni a Kubernetes-et az EC2 Spot-on? Több lehetőség is van: használjon harmadik féltől származó szolgáltatást, például a SpotInst-et (most neve "Spot", ne kérdezze, miért), vagy egyszerűen adjon hozzá egy Spot AutoScalingGroup-ot (ASG) a fürthöz. Például itt van egy CloudFormation kódrészlet egy „kapacitás-optimalizált” Spot ASG-hez több példánytípussal:
Melyek a legjobb gyakorlatok a Kubernetes felhőköltségeinek megtakarítására? Kérem jelezze a címen Twitter (@try_except_).
[1] Valójában kevesebb mint 3 vCPU marad használható, mivel a csomópont átviteli sebességét csökkentik a fenntartott rendszererőforrások. A Kubernetes különbséget tesz a fizikai csomóponti kapacitás és a "kiosztott" erőforrások között (Csomópont allokálható).
[2] Számítási példa: egy m5.large példány 8 GiB memóriával ~84 USD havonta (eu-central-1, On-Demand), azaz. az 1/8 csomópont blokkolása körülbelül ~10 USD/hó.
[3] Az EC2-számla csökkentésének még sok más módja van, mint például lefoglalt példányok, megtakarítási terv stb. – itt nem térek ki ezekre a témákra, de mindenképpen utána kell nézni!