Artikli tÔlge on koostatud kursuse alguse eelÔhtul .

Kuidas vĂ€hendada pilvekasutuse kulusid Kubernetesega töötades? Ăhte Ă”iget lahendust ei eksisteeri, kuid kĂ€esolevas artiklis on kirjeldatud mitmeid tööriistu, mis aitavad teil tĂ”husamalt hallata ressursse ja vĂ€hendada pilvearvutamise kulusid.
Kirjutasin selle artikli pilguga AWS-i Kubernetesile, kuid see kehtib (peaaegu) tÀpselt ka teiste pilveteenuse pakkujate puhul. Eeldan, et teie klastril(on) juba mÀÀratud automaatne skaleerimine (). Ressursside eemaldamine ja juurutamise skaleerimise vÀhendamine aitab kokku hoida ainult siis, kui see vÀhendab ka teie töösÔlmede (EC2 instantside) arvu.
KÀesolevas artiklis kÀsitletakse:
- kasutamata ressursside puhastamine ()
- ),)
- kube-downscaler
- ),liigne ressursside reserveerimise vÀhendamine (
- kube-resource-report
, VPA)
Spot instantside kasutamine Töötamine kiiresti muutuvas keskkonnas on suurepÀrane. Soovime, et tehnilised organisatsioonid

kiireneksid
. Kiirem tarkvara Edastamine tĂ€hendab ka rohkem PR-i juurutusi, eelvaate keskkondi, prototĂŒĂŒpe ja analĂŒĂŒtilisi lahendusi. KĂ”ik juurutatakse Kuberneteses. Kes suudab leida aega kĂ€sitsi testimist vĂ€lja puhtaks teha? Eksperimendi eemaldamine nĂ€dal tagasi vĂ”ib lihtsalt ununeda. Pilvekulu tĂ”useb lĂ”puks, kuna unustame sulgeda:
(Henning Jacobs:
TÔde:
(tsitaat) Corey Quinn:
MĂŒĂŒt: Teie AWS arve sĂ”ltub teie kasutajate arvust.
TÔde: Teie AWS arve sÔltub teie inseneride arvust.
TĂ”eline tĂ”de: Teie AWS arve sĂ”ltub asjade arvust, mille unustasite vĂ€lja lĂŒlitada/maha vĂ”tta.)
- Kubernetes Janitor (kube-janitor) aitab teie klastrit puhastada. Janitori konfiguratsioon on paindlik nii globaalseteks kui ka lokaalseks kasutamiseks:
- Eri ressursid vĂ”ivad olla mĂ€rgitud janitor/ttl abil, nĂ€iteks spike/prototĂŒĂŒbi automaatseks eemaldamiseks 7 pĂ€eva pĂ€rast.
Ăldreeglid on mÀÀratletud YAML failis. Selle tee edastatakse parameetri kaudu --rules-file kube-janitorisse. Siin on nĂ€ide reeglist, mis eemaldab kĂ”ik nimesed, millel on -pr- kahe pĂ€eva pĂ€rast:
- id: cleanup-resources-from-pull-requests
resources:
- namespaces
jmespath: "contains(metadata.name, '-pr-')"
ttl: 2dJÀrgmine nÀide reguleerib rakenduse sildi kasutamist Deployment ja StatefulSet podides kÔigi uute Deployments/StatefulSet jaoks 2020. aastal, kuid samas vÔimaldab nÀdalase testimise ilma selle sildita:
- id: require-application-label
# eemaldada deployments ja statefulsets ilma "application" sildita
resources:
- deployments
- statefulsets
# vt http://jmespath.org/specification.html
jmespath: "!(spec.template.metadata.labels.application) && metadata.creationTimestamp > '2020-01-01'"
ttl: 7dKube-janitoriga töötavas klastris aja piiramine demode kÀivitamine 30 minutiks:
kubectl run nginx-demo --image=nginx
kubectl annotate deploy nginx-demo janitor/ttl=30mTeine kasvavate kulude allikas on pĂŒsivolĂŒĂŒmid (AWS EBS). Kubernetesi StatefulSet'i kustutamisel ei kustutata selle pĂŒsivolumeid (PVC â PersistentVolumeClaim). Kasutamata EBS-i mahutid vĂ”ivad kergesti pĂ”hjustada sadu dollareid kuus. Kubernetesi Janitoril on funktsioon, mis puhastab kasutamata PVC-sid. NĂ€iteks see reegel eemaldab kĂ”ik PVC-d, mida moodul ei ole mountinud ja millega StatefulSet vĂ”i CronJob ei viita:
# ŃЎалОŃŃ ĐČŃĐ” PVC, ĐșĐŸŃĐŸŃŃĐ” ĐœĐ” ŃĐŒĐŸĐœŃĐžŃĐŸĐČĐ°ĐœŃ Đž ĐœĐ° ĐșĐŸŃĐŸŃŃĐ” ĐœĐ” ŃŃŃлаŃŃŃŃ StatefulSets
- id: remove-unused-pvcs
resources:
- persistentvolumeclaims
jmespath: "_context.pvc_is_not_mounted && _context.pvc_is_not_referenced"
ttl: 24hKubernetesi Janitor aitab teil hoida oma klastrit 'puhtana' ja vÀltida aeglaselt kumulatiivsete pilvandmete kulude tekkimist. Juhiste saamiseks juurutamise ja seadistamise kohta jÀrgige .
Mastaabi vÀhendamine mitte-tööaegadel
Testimis- ja arendusĂŒsteemid on tavaliselt vajalikud ainult tööaegadel. MĂ”ned tootmisrakendused, nagu back-office/admin tööriistad, vajavad samuti vaid piiratud kĂ€ttesaadavust ja vĂ”ivad öösel vĂ€lja lĂŒlitada.
(kube-downscaler) vĂ”imaldab kasutajatel ja operaatoritel vĂ€hendada sĂŒsteemi mahtu mitteaktiivsete perioodide jooksul. Deployments ja StatefulSets saab skaleerida null replikani. CronJobs saab peatada. Kubernetes Downscaler seadistatakse kogu klastrile, ĂŒhele vĂ”i mitmele nimeruumi vĂ”i eraldi ressursside jaoks. Saab seadistada kas âseisakuajaâ vĂ”i vastupidi âtööajaâ. NĂ€iteks, et minimeerida skaleerimist öösel ja nĂ€dalavahetustel:
image: hjacobs/kube-downscaler:20.4.3
args:
- --interval=30
# ei keelata infrastruktuuri komponente
- --exclude-namespaces=kube-system,infra
# jÀtab keelamata kube-downscaleri ning jÀtab Postgres operaatori, et haldada vÀlistatud andmebaase
- --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 klastrite töövÔrkude skaleerimise graafik nÀdalavahetustel:

Skaalate vÀhendamine ~13-lt 4-le töövÔrgule toob kindlasti suured erinevused AWS arvel.
Aga mida teha, kui mul on vaja töötada klastrite âseisakuajalâ? Teatud deploymente saab igaveseks vĂ€lja jĂ€tta skaleerimisest, lisades annotatsiooni downscaler/exclude: true. Deploymente saab ajaliselt vĂ€lja jĂ€tta annotatsiooniga downscaler/exclude-until, kusjuures kuupĂ€ev ja kellaaeg peavad olema absoluutsetes ajatempos formadis YYYY-MM-DD HH:MM (UTC). Kui vajalik, saab kogu klastrit uuesti skaleerida, kĂ€ivitades puu annotatsiooniga downscaler/force-uptime, nĂ€iteks Nginx'i malliga:
kubectl run scale-up --image=nginx
kubectl annotate deploy scale-up janitor/ttl=1h # kustuta deployment tunni pÀrast
kubectl annotate pod $(kubectl get pod -l run=scale-up -o jsonpath="{.items[0].metadata.name}") downscaler/force-uptime=trueVaata , kui sind huvitab, kuidas rakendada ning lisavÔimalusi.
Kasutage horisontaalset automaatskalaarimist
Paljud rakendused/teenused tegelevad dĂŒnaamilise koormuse mustriga: mĂ”nikord nende moodulid seisavad ning mĂ”nikord töötavad nad tĂ€isvĂ”imsusel. Pideva puudepargi haldamine maksimumkoormuse korral ei ole majanduslik. Kubernetes toetab horisontaalset automaatset skaleerimist 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 lÔi komponente, et lihtsustada kohandatud mÔÔdikute integreerimist skaleerimise jaoks: (kube-metrics-adapter) on universaalne mÔÔdikuadapter Kubernetes'e jaoks, mis suudab koguda ja teenindada kohandatud ja vÀliseid mÔÔdikuid horisontaalsete podide automaatseks skaleerimiseks. See toetab skaleerimist Prometheuse, SQS jÀrjekordade ja teiste seadistuste alusel. NÀiteks, et skaleerida rakenduse poolt esitatud kohandatud mÔÔdikut JSON formaadis /metrics, kasutage:
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: myapp-hpa
annotations:
# metric-config.<metricType>.<metricName>.<collectorName>/<configKey>
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: AverageValueHPA kaudu horisontaalse automaatse skaleerimise seadistamine peaks olema ĂŒks vaikimisi toimingutest teenuste tĂ”hususe suurendamiseks oleku arvestamata. Spotify'l on esitluses nende kogemus ja soovitused HPA jaoks: .
ĂlemÀÀrase ressursireservi vĂ€henemine
Kubernetes'e töökoormused mÀÀravad nende vajadused CPU/mĂ€lu osas "ressursi taotlemise" kaudu. CPU ressursse mÔÔdetakse virtuaalsete tuumade vĂ”i sagedamini "millicores"'ides, nĂ€iteks 500m tĂ€hendab 50% vCPU-d. MĂ€luresursse mÔÔdetakse baitides ja tavapĂ€raseid suffikseid saab kasutada, nĂ€iteks 500Mi, mis tĂ€hendab 500 megabaiti. Ressursi taotlused âlukustavadâ mahu tööjaamadele, st 1000m CPU taotlusega moodul 4 virtuaalse CPU-ga sĂ”lmes jĂ€tab ainult 3 virtuaalset CPU-d teistele moodulitele.
Slack (ĂŒlemÀÀrane reserveerimine) â see on erinevus nĂ”utud ressursside ja tegeliku kasutamise vahel. NĂ€iteks pood, mis nĂ”uab 2 GiB mĂ€lu, kuid kasutab ainult 200 MiB, omab ~ 1,8 GiB "ĂŒlejÀÀki". ĂlejÀÀk maksab raha. Ligikaudne hinnang on, et 1 GiB ĂŒlejÀÀgi hind on ~ 10 dollarit kuus.
(kube-resource-report) kuvab liigsed reservid ja vÔib aidata teil leida sÀÀstmise potentsiaali:

nĂ€itab ĂŒlejÀÀki, mille on agreggeerinud rakendus ja meeskond. See aitab leida kohti, kus ressursi nĂ”udmisi vĂ”ib vĂ€hendada. Genereeritud HTML aruanne pakub ainult ressursi kasutamise hetkeseisu. Te peaksid vaatama protsessori/mĂ€lu kasutamist ajas, et mÀÀrata adekvaatsed ressursi nĂ”udmised. Siin on Grafana diagramm "tĂŒĂŒpilise" teenuse jaoks, millel on suur koormus protsessorile: kĂ”ik podid kasutavad oluliselt vĂ€hem kui 3 nĂ”utud tuuma:

Protsessori nÔudmise vÀhendamine 3000m kuni ~400m vabastab ressursid teiste koormuste jaoks ja vÔimaldab klastrit vÀhendada.
"Keskmine EC2 instantside protsessori kasutamine kĂ”igub sageli ĂŒhesĂ”nalistes protsentides," . Kuigi EC2 , siis mĂ”ned Kubernetes'e ressursi nĂ”udmiste muutmine YAML failis toimub lihtsalt ja vĂ”ib tuua tohutut kokkuhoidu.
Aga kas me tÔeliselt tahame, et inimesed muudaksid vÀÀrtusi YAML failides? Ei, masinad saavad seda palju paremini teha! Kubernetes (VPA) tegeleb sellega: kohandab ressursi nÔudmisi ja piiranguid vastavalt koormusele. Siin on nÀide Prometheuse protsessori nÔudmiste graafikust (Ôhuke sinine joon), mille VPA on kohandanud ajas:

infrastruktuuri komponente. Mitte-kriitilised rakendused vÔivad samuti kasutada VPA.
Fairwindilt on tööriist, mis loob iga juurutamise jaoks VPA nimetusruumis ja seejÀrel kuvab soovituse VPA oma armatuurlaud.

Olen kirjutanud vÀikese 2019. aastal ja hiljuti .
EC2 Spot instantside kasutamine.
LĂ”puks, mis ei ole vĂ€hem oluline, on AWS EC2 kulusid vĂ”imalik vĂ€hendada, kasutades Spot-instance'e Kubernetes'i töövĂ”rkudena. . Spot-instance'id on saadaval kuni 90% soodsamalt vĂ”rreldes nĂ”udmise hindadega. Kubernetes'i kĂ€ivitamine EC2 Spot'il on hea kombinatsioon: peate mÀÀrama mitu erinevat instance'i tĂŒĂŒpi kĂ”rgema saadavuse tagamiseks, see tĂ€hendab, et saate suurema node'i sama vĂ”i madalama hinna eest ning suurenenud mahtu saab kasutada Kubernetes'i konteineritöökoormuste jaoks.
Kuidas kĂ€ivitada Kubernetes EC2 Spot'il? On mitu vĂ”imalust: kasutada kolmanda osapoole teenust nagu SpotInst (nĂŒĂŒd nimetatakse lihtsalt 'Spot', mitte kĂŒsi, miks), vĂ”i lihtsalt lisada Spot AutoScalingGroup (ASG) oma klastrisse. NĂ€iteks siin on CloudFormation'i fragment 'kapatsiteed optimeeritud' Spot ASG jaoks mitme instance'i 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Àrkused Spot'i kasutamise kohta Kubernetes'ega:
- Peate tegelema Spot'i lÔpetamistega, nÀiteks node'i mahapanemise kaudu, kui instance'i peatatakse.
- Zalando kasutab ametlikku klastrite automaatset skaleerimist, kus on node'i basseinide prioriteedid.
- Spot node'id aktsepteerima töökoormuste 'registreerimisi' Spot'is kÀivitamiseks.
Elulookirjeldus
Loodan, et leiate mÔned esitatud tööriistad kasulikuks oma pilveteenuste arve vÀhendamiseks. Enamik artikli sisust on saadaval ka minu esitluses DevOps Gathering 2019 YouTube'is ja slaidide kujul. .
Twitteris (@try_except_) .
Tegelikult jÀÀb kasutamiseks sobivaks vĂ€hem kui 3 virtuaalset CPU-d, kuna sĂ”lme lĂ€bilaskevĂ”ime vĂ€heneb reserveeritud sĂŒsteemiressursside tĂ”ttu. Kubernetes eristab fĂŒĂŒsilist sĂ”lme mahtu ja "eraldatud" ressursse ().
NĂ€ide arvutusest: ĂŒks m5.large eksemplar, millel on 8 GiB mĂ€lu, maksab ~84 USA dollarit kuus (eu-central-1, On-Demand), st 1/8 sĂ”lme kinni hoidmine maksab umbes ~10 USA dollarit kuus.
On veel palju vĂ”imalusi oma EC2 arvet vĂ€hendada, nĂ€iteks reserveeritud eksemplarid, sÀÀstuplaanid jt â ma ei hakka neid teemasid siin kĂ€sitlema, kuid kindlasti peaksite neist uurima!
Allikas: habr.com
