Artikli tÔlge on ettevalmistatud kursuse alguseks .

Kuidas sÀÀsta pilvekulusid Kubernetese kasutamisel? Ăhte Ă”iget lahendust ei ole, kuid selles artiklis on kirjeldatud mitmeid tööriistu, mis aitavad teil tĂ”husamalt hallata ressursse ja vĂ€hendada pilvearvutamise kulusid.
Selle artikli olen kirjutannut silmas pidades Kubernetese AWS-is, kuid see kehtib (peaaegu) samamoodi ka teiste pilveteenuste pakkujate jaoks. Eeldan, et teie kluster(ite)l on juba seadistatud automaatne skaleerimine (). Ressursside eemaldamine ja juurutamise suuruse vÀhendamine aitab sÀÀsta ainult siis, kui see samuti vÀhendab teie töökohti (EC2 instantsid).
Selles artiklis kÀsitletakse:
- mittetÀiendavate ressursside puhastamine ()
- koormuse vÀhendamine mitte tööajal ()
- horisontaalse automaatse skaleerimise (HPA) kasutamine,
- ĂŒleliigse ressursi reservi vĂ€hendamine (, VPA)
- Spot instantside kasutamine
Mittekasutatavate ressursside puhastamine
Töötamine kiiresti muutuvas keskkonnas on suurepĂ€rane. Soovime, et tehnilised organisatsioonid . Kiirelema tarkvara tarnimine tĂ€hendab ka rohkem PR-deploy'e, vaheversioone, prototĂŒĂŒpe ja analĂŒĂŒtilisi lahendusi. KĂ”ik on juurutatud Kuberneteses. Kes tahab aega kulutada, et kĂ€sitsi testijuhtimisi puhastada? On kerge unustada eemaldada nĂ€dalatevanune eksperiment. Pilveteenuse arve hakkab lĂ”puks kasvama, kuna unustame sulgeda:

(Henning Jacobs:
Elu:
(tsitaat) Cory Quinn:
MĂŒĂŒt: Teie AWS arve sĂ”ltub teie kasutajate arvust.
TÔde: Teie AWS arve sÔltub teie inseneride arvust.
Ivan Kurnosov (vastuseks):
Reaalne tĂ”de: Teie AWS arve sĂ”ltub asjade arvust, mille unustasite vĂ€lja lĂŒlitada/edeleteerida.)
(kube-janitor) aitab teie klastrit puhastada. Janitori konfiguratsioon on paindlik nii globaalse kui ka kohaliku kasutuse jaoks:
- Kogu klastrile kehtivad ĂŒldised reeglid, mis vĂ”ivad mÀÀrata maksimaalse eluea (TTL - time-to-live) PR/testijuhtimiste jaoks.
- Erinevaid ressursse saab annoteerida janitor/ttl abil, nĂ€iteks spike/prototĂŒĂŒbi automaatseks eemaldamiseks 7 pĂ€eva pĂ€rast.
Ăldreeglid mÀÀratakse YAML-failis. Selle teekond edastatakse parameetri kaudu --rules-file kube-janitorile. Siin on nĂ€ide reeglist, et eemaldada kĂ”ik nimed, mis sisaldavad -pr- nimes kahe pĂ€eva pĂ€rast:
- id: cleanup-resources-from-pull-requests
resources:
- namespaces
jmespath: "contains(metadata.name, '-pr-')"
ttl: 2dJÀrgmine nÀide mÀÀratleb application mÀrgi kasutamise Deployment ja StatefulSet pod'ides kÔigi uute Deploymentide/StatefulSet'ide jaoks aastast 2020, kuid samal ajal vÔimaldab testide sooritamist ilma selle mÀrgita nÀdala jooksul:
- id: require-application-label
# eemaldada deployments ja statefulsets ilma "application" mÀrgita
resources:
- deployments
- statefulsets
# vt http://jmespath.org/specification.html
jmespath: "!(spec.template.metadata.labels.application) && metadata.creationTimestamp > '2020-01-01'"
ttl: 7dAjaliselt piiratud demoversioon 30 minutiks kasti, kus töötab kube-janitor:
kubectl run nginx-demo --image=nginx
kubectl annotate deploy nginx-demo janitor/ttl=30mĂks tĂ”usvate kulude allikaid on pĂŒsivolumeid (AWS EBS). Kui Kubernetes StatefulSet'i eemaldatakse, ei eemaldata selle pĂŒsivalt (PVC â PersistentVolumeClaim). Kasutamata EBS mahud vĂ”ivad kergesti pĂ”hjustada sadu dollareid kulusid kuus. Kubernetes Janitoril on funktsioon kasutamata PVC-de puhastamiseks. NĂ€iteks see reegel eemaldab kĂ”ik PVC-d, mis ei ole ĂŒles seatud mooduliga ja millele ei viita StatefulSet vĂ”i CronJob:
# ŃЎалОŃŃ ĐČŃĐ” PVC, ĐșĐŸŃĐŸŃŃĐ” ĐœĐ” ŃĐŒĐŸĐœŃĐžŃĐŸĐČĐ°ĐœŃ Đž ĐœĐ° ĐșĐŸŃĐŸŃŃĐ” ĐœĐ” ŃŃŃлаŃŃŃŃ StatefulSets
- id: remove-unused-pvcs
resources:
- persistentvolumeclaims
jmespath: "_context.pvc_is_not_mounted && _context.pvc_is_not_referenced"
ttl: 24hKubernetes Janitor vĂ”ib aidata teil hoida oma klastrit âpuhtanaâ ja vĂ€ltida aeglaselt kogunevaid pilvearvutamise kulusid. Ăksikasjade jaoks juurutamise ja seadistamise kohta jĂ€rgige .
Maha suurendamine mitte tööajal
Testimis- ja vahepealsed sĂŒsteemid vajavad tavaliselt tööd ainult tööajal. MĂ”ned tootmisrakendused, nagu back-office / haldustööriistad, vajavad samuti ainult piiratud kĂ€ttesaadavust ja vĂ”ivad öösel vĂ€lja lĂŒlitada.
(kube-downscaler) vĂ”imaldab kasutajatel ja operaatoritel vĂ€hendada sĂŒsteemi suurust mitte tootmisajal. Deployments ja StatefulSets saab skaleerida null-replikaatidele. CronJobs vĂ”ivad olla peatatud. Kubernetes Downscaler seadistatakse kogu klastrile, ĂŒhele vĂ”i mitmele nimekontrollile vĂ”i ĂŒksikutele ressurssidele. Saate seadistada kas âseisakuajaâ vĂ”i vastupidi âtöötamise ajaâ. NĂ€iteks, et maksimaalselt vĂ€hendada skaleerimist öösel ja nĂ€dalavahetustel:
image: hjacobs/kube-downscaler:20.4.3
args:
- --interval=30
# Àrge keelake infrastruktuuri komponente
- --exclude-namespaces=kube-system,infra
# Àrge keelake kube-downscalerit ja jÀtke Postgres Operator, et vÀlistatud andmebaase saaks hallata
- --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-timeSiin on graafik klastrite töötavate sÔlmede skaleerimise kohta nÀdalavahetustel:

Skaleerimine ~13-lt 4 töökohtadele annab kindlasti tunda erinevust AWS arvel.
Aga mis siis, kui pean töötama klastris "seisaku ajal"? Teatud juurutamised saab igaveseks mÔÔtmisest vÀlja jÀtta, lisades annotatsiooni downscaler/exclude: true. Juurutamisi saab ajaliselt vÀlja jÀtta annotatsiooni downscaler/exclude-until abil, mille absoluutne ajamÀrk on formaadis AAAA-KK-PP TT:MM (UTC). Vajadusel saab kogu klastri tagasi mÔÔta, juurutades poodi koos annotatsiooniga downscaler/force-uptime, nÀiteks kÀivitades nginx mudeli:
kubectl run scale-up --image=nginx
kubectl annotate deploy scale-up janitor/ttl=1h # kustuta juurutamine tunni pÀrast
kubectl annotate pod $(kubectl get pod -l run=scale-up -o jsonpath="{.items[0].metadata.name}") downscaler/force-uptime=trueVaata , kui teid huvitab juurutamise juhend ja tÀiendavad valikud.
Kasutage horisontaalset automaatskaalumist
Paljud rakendused/teenused tegelevad dĂŒnaamilise koormusgraafikuga: mĂ”nikord on nende moodulid seisakus ja mĂ”nikord töötavad nad tĂ€ievĂ”imsusega. PĂŒsiva podide pargi hoidmine maksimaalse tippkoormuse haldamiseks ei ole majanduslik. Kubernetes toetab horisontaalset automaatset kaalumist lĂ€bi ressursi (HPA). CPU kasutamine on sageli hea nĂ€itaja skaleerimiseks:
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: my-app
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 3
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
averageUtilization: 100
type: UtilizationZalando on loonud komponendi, mis lihtsustab kasutajamÔÔtmete ĂŒhendamist skaleerimiseks: (kube-metrics-adapter) on universaalne mÔÔtmete adapter Kubernetes jaoks, mis suudab koguda ja teenindada kasutaja- ja vĂ€list mÔÔtmeid pod'ide horisontaalse automaatse skaleerimise jaoks. See toetab skaleerimist Prometheuse, SQS jĂ€rjekordade ja muude seadistuste pĂ”hiselt. NĂ€iteks, et skaleerida rakenduse poolt esitatud kasutajamÔÔdiku pĂ”hjal, mis on JSON kujul aadressil /metrics, kasutage:
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: myapp-hpa
annotations:
# metric-config.../
metric-config.pods.requests-per-second.json-path/json-key: "$.http_server.rps"
metric-config.pods.requests-per-second.json-path/path: /metrics
metric-config.pods.requests-per-second.json-path/port: "9090"
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp
minReplicas: 1
maxReplicas: 10
metrics:
- type: Pods
pods:
metric:
name: requests-per-second
target:
averageValue: 1k
type: AverageValueHorisontaalse automaasistumise seadistamine HPA abil peaks olema ĂŒks vaikeseade, et suurendada teenuste efektiivsust olekust sĂ”ltumatult. Spotify-l on esitluses oma kogemused ja soovitused HPA kohta: .
ressursside ĂŒlevarustamise vĂ€hendamine
Kubernetesi töökohustused mÀÀravad oma CPU/mÀlu vajadused "ressursside taotluste" (resource requests) kaudu. CPU ressursid mÔÔdetakse virtuaalsete tuumade vÔi sagedamini "millicores" (millikernad) kaudu, nÀiteks 500m tÀhendab 50% vCPU-st. MÀlu ressursid mÔÔdetakse baitides ning saab kasutada tavalisi sufikseid, nÀiteks 500Mi, mis tÀhendab 500 MB. Ressursside taotlused "broneerivad" mahtu töötlusÔlmedes, see tÀhendab, et moodul, mille CPU taotlus on 1000m, jÀÀb 4 virtuaalse CPU-ga sÔlmes, jÀtab ainult 3 virtuaalset CPU-d teistele moodulitele.
Slack (ĂŒlejÀÀk) â on vahe taotletud ressursside ja tegeliku kasutamise vahel. NĂ€iteks pod, mis taotleb 2 GiB mĂ€lu, kuid kasutab ainult 200 MiB, omab ~ 1,8 GiB "ĂŒlejÀÀki" mĂ€lu. ĂlejÀÀk maksab raha. Ăks pelgalt hinnang on, et 1 GiB ĂŒleliigset mĂ€lu maksab ~ 10 dollarit kuus.
(kube-resource-report) kuvab liigsed varud ja vÔib aidata teil mÀÀrata vÔimalikku kokkuhoidu:

nĂ€itab ĂŒlemÀÀrasid, mille rakendus ja meeskond on kokku kogunud. See aitab leida kohti, kus ressursipĂ€ringut saab vĂ€hendada. Generitud HTML-raport annab ainult hetkepildi ressursi kasutamisest. Peaksite vaatama protsessori/mĂ€lu kasutamist ajas, et mÀÀrata sobivad ressursipĂ€ringud. Siin on Grafana diagramm âtĂŒĂŒpiliseâ kĂ”rgelt koormatud teenuse jaoks: kĂ”ik podid kasutavad oluliselt vĂ€hem kui 3 nĂ”utud protsessorituuma.

ProtsessoripÀringu vÀhendamine 3000m-lt ~400m-le vabastab ressursse teiste töökoormuste jaoks ja vÔimaldab klastrit vÀhendada.
âEC2 instantside keskmine protsessorikasutus kĂ”igub sageli ĂŒhesigitistes protsentides,â . Samal ajal kui EC2 , muudatused mĂ”nedes Kubernetes'e ressursipĂ€ringutes YAML-failis on lihtsad ja vĂ”ivad tuua tohutu kokkuhoiu.
Aga kas me tÔeliselt tahame, et inimesed muudaksid vÀÀrtusi YAML-failides? Ei, masinad saavad seda palju paremini teha! Kubernetes (VPA) tegeleb just sellega: kohandab ressursipÀringuid ja piiranguid vastavalt töökoormusele. Siin on nÀide Prometheuse CPU pÀringute graafikust (peen sinine joon), mida on kohandatud VPA aja jooksul:

infrastruktuuri komponente jaoks. Mitte-kriitilised rakendused saavad samuti VPA-d kasutada.
Fairwindilt â see on tööriist, mis loob VPA iga nimede ruumi juuresoleku jaoks ja seejĂ€rel kuvab VPA soovituse oma juhtpaneelil. See aitab arendajatel seada Ă”iged CPU/mĂ€lu pĂ€ringud oma rakendustele:

Kirjutasin vÀikesest 2019. aastal ja hiljuti arutati .
EC2 Spot instantside kasutamine
LĂ”puks, mis ei ole vĂ€hem oluline, saab AWS EC2 kulusid vĂ€hendada, kasutades Spot instantside kui Kubernetes tööÔliseid . Spot instantsi on saadaval kuni 90% soodsamalt vĂ”rreldes nĂ”udmisest tulenevate hindadega. Kubernetes kĂ€ivitamine EC2 Spotil on hea kombinatsioon: peate mÀÀrama mitu erinevat instantsitĂŒĂŒpi kĂ”rgema saadavuse tagamiseks, st saate sama vĂ”i madalama hinna eest suurema sĂ”lme ning suurenenud mahtu saab kasutada Kubernetes'i konteineritöökoormustes.
Kuidas kĂ€ivitada Kubernetes EC2 Spotal? On mitmeid vĂ”imalusi: kasutada kolmanda osapoole teenust, nagu SpotInst (nĂŒĂŒd tuntud kui âSpotâ, Ă€ra kĂŒsi, miks), vĂ”i lihtsalt lisada Spot AutoScalingGroup (ASG) oma klastrisse. NĂ€iteks siin on CloudFormation'i fragment âmahtude optimeeritudâ Spot ASG jaoks mitme eksemplari tĂŒĂŒbiga:
MySpotAutoScalingGroup:
Properties:
HealthCheckGracePeriod: 300
HealthCheckType: EC2
MixedInstancesPolicy:
InstancesDistribution:
OnDemandPercentageAboveBaseCapacity: 0
SpotAllocationStrategy: capacity-optimized
LaunchTemplate:
LaunchTemplateSpecification:
LaunchTemplateId: !Ref LaunchTemplate
Version: !GetAtt LaunchTemplate.LatestVersionNumber
Overrides:
- InstanceType: "m4.2xlarge"
- InstanceType: "m4.4xlarge"
- InstanceType: "m5.2xlarge"
- InstanceType: "m5.4xlarge"
- InstanceType: "r4.2xlarge"
- InstanceType: "r4.4xlarge"
LaunchTemplate:
LaunchTemplateId: !Ref LaunchTemplate
Version: !GetAtt LaunchTemplate.LatestVersionNumber
MinSize: 0
MaxSize: 100
Tags:
- Key: k8s.io/cluster-autoscaler/node-template/label/aws.amazon.com/spot
PropagateAtLaunch: true
Value: "true"MÔned mÀrkmed Spot'i kasutamise kohta Kubernetes'ega:
- peate haldama Spot'i lÔpetamisi, nÀiteks sÔlme massimise kaudu instantsi seiskamisel
- Zalando kasutab ametlikku klastrite automaatset skaleerimist sÔlmede basseinide prioriteetidega
- Spot'i sÔlmed töötavate koormuste "registreeringute" vastuvÔtmist Spot'is
KokkuvÔte
Loodan, et leiate mÔned esitatud tööriistad kasulikuks oma pilvearvutuse arve vÀhendamiseks. Suurema osa artikli sisust leiate ka .
Millised on teie parimad praktikud Kubernetes'e pilvekulude kokkuhoiuks? Andke kindlasti teada .
Tegelikult jÀÀb vĂ€hem kui 3 virtuaalset CPU-d kasutamiseks sobivaks, kuna sĂ”lme lĂ€bilaskevĂ”ime vĂ€heneb reserveeritud sĂŒsteemressursside tĂ”ttu. Kubernetes eristab fĂŒĂŒsilist sĂ”lme suutlikkust ja "eraldatud" ressursse ().
NĂ€ide arvutusest: ĂŒks m5.large instants 8 GiB mĂ€luga maksab umbes 84 USA dollarit kuus (eu-central-1, On-Demand), st 1/8 sĂ”lme lukustamine maksab umbes 10 USA dollarit kuus.
On veel palju viise, kuidas oma EC2 arvet vĂ€hendada, nĂ€iteks reserveeritud instantsid, sÀÀstuplaan jne â ma ei kavatse neid teemasid siin kĂ€sitleda, kuid peaksite kindlasti uurima!
Allikas: habr.com
