Sutaupykite „Kubernetes“ debesies mokesčių sistemoje AWS

Straipsnio vertimas buvo parengtas kursų pradžios išvakarėse „Infrastruktūros platforma, pagrįsta Kubernetes“.

Sutaupykite „Kubernetes“ debesies mokesčių sistemoje AWS

Kaip sutaupyti debesies išlaidų dirbant su Kubernetes? Nėra vieno tinkamo sprendimo, tačiau šiame straipsnyje aprašomi keli įrankiai, kurie gali padėti efektyviau valdyti išteklius ir sumažinti debesų kompiuterijos išlaidas.

Šį straipsnį parašiau turėdamas omenyje „Kubernetes“, skirtą AWS, tačiau jis bus taikomas (beveik) lygiai taip pat ir kitiems debesų paslaugų teikėjams. Darau prielaidą, kad jūsų klasteryje (-ėse) jau sukonfigūruotas automatinis mastelio keitimas (klasteris-automatinis skaleris). Pašalinus išteklius ir sumažinus diegimą sutaupysite pinigų tik tuo atveju, jei taip pat sumažinsite darbuotojų mazgų parką (EC2 atvejai).

Šis straipsnis apims:

  • nepanaudotų išteklių valymas (kube-sargas)
  • Sumažinkite mastelio keitimą ne darbo valandomis (kube mažinimo priemonė)
  • naudojant horizontalųjį automatinį mastelį (HPA),
  • sumažinti perteklinį išteklių rezervavimą (kube-resource-report, VPA)
  • naudojant „Spot“ egzempliorius

Nenaudojamų išteklių valymas

Dirbti greito tempo aplinkoje yra puiku. Mes norime technologijų organizacijų paspartėjo. Greitesnis programinės įrangos pristatymas taip pat reiškia daugiau viešųjų ryšių diegimo, peržiūros aplinkų, prototipų ir analizės sprendimų. Viskas yra įdiegta Kubernetes. Kas turi laiko rankiniu būdu išvalyti bandomuosius diegimus? Lengva pamiršti apie savaitės senumo eksperimento ištrynimą. Debesų sąskaita padidės dėl kažko, ką pamiršome uždaryti:

Sutaupykite „Kubernetes“ debesies mokesčių sistemoje AWS

(Henningas Jacobsas:
Žiza:
(citatos) Corey Quinn:
Mitas: jūsų AWS paskyra priklauso nuo jūsų turimų vartotojų skaičiaus.
Faktas: jūsų AWS balas priklauso nuo jūsų turimų inžinierių skaičiaus.

Ivanas Kurnosovas (atsakyme):
Tikras faktas: jūsų AWS balas priklauso nuo dalykų, kuriuos pamiršote išjungti / ištrinti, skaičiaus funkcija.)

Kubernetes sargas (kube-janitor) padeda išvalyti jūsų grupę. Prižiūrėtojo konfigūracija yra lanksti tiek pasauliniam, tiek vietiniam naudojimui:

  • Visą grupę apimančios taisyklės gali apibrėžti maksimalų PR / bandomojo diegimo laiką (TTL).
  • Atskiri ištekliai gali būti pažymėti janitor/ttl, pavyzdžiui, norint automatiškai pašalinti smaigalį / prototipą po 7 dienų.

Bendrosios taisyklės yra apibrėžtos YAML faile. Jo kelias praeina per parametrą --rules-file kube-sargyboje. Štai taisyklės pavyzdys, kaip pašalinti visas vardų sritis -pr- vardu po dviejų dienų:

- id: cleanup-resources-from-pull-requests
  resources:
    - namespaces
  jmespath: "contains(metadata.name, '-pr-')"
  ttl: 2d

Toliau pateiktame pavyzdyje reglamentuojamas programos etiketės naudojimas diegimo ir „StatefulSet“ rinkiniuose visuose naujuose diegimuose / „StatefulSet“ 2020 m., tačiau tuo pačiu metu leidžiama savaitę atlikti bandymus be šios etiketės:

- 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

Paleiskite riboto laiko demonstracinę versiją 30 minučių klasteryje, kuriame veikia kube-janitor:

kubectl run nginx-demo --image=nginx
kubectl annotate deploy nginx-demo janitor/ttl=30m

Kitas didėjančių sąnaudų šaltinis yra nuolatiniai apimtys (AWS EBS). Ištrynus Kubernetes StatefulSet nepašalinami jo nuolatiniai tomai (PVC – PersistentVolumeClaim). Nepanaudoti EBS kiekiai gali lengvai sukelti šimtus dolerių per mėnesį. Kubernetes Janitor turi funkciją, leidžiančią išvalyti nepanaudotus PVC. Pavyzdžiui, ši taisyklė pašalins visus PVC, kurie nėra sumontuoti modulyje ir kurių nenurodo StatefulSet arba CronJob:

# удалить все PVC, которые не смонтированы и на которые не ссылаются StatefulSets
- id: remove-unused-pvcs
  resources:
  - persistentvolumeclaims
  jmespath: "_context.pvc_is_not_mounted && _context.pvc_is_not_referenced"
  ttl: 24h

„Kubernetes Janitor“ gali padėti išlaikyti klasterį švarų ir neleisti lėtai kauptis debesų kompiuterijos išlaidoms. Norėdami gauti diegimo ir konfigūravimo instrukcijas, vadovaukitės README kube-sargas.

Sumažinkite mastelį ne darbo valandomis

Bandymo ir sustojimo sistemos paprastai turi veikti tik darbo valandomis. Kai kurioms gamybinėms programoms, pvz., „back office“ / administratoriaus įrankiams, taip pat reikalingas ribotas pasiekiamumas ir jos gali būti išjungtos per naktį.

Kubernetes Downscaler (kube-downscaler) leidžia vartotojams ir operatoriams sumažinti sistemos mastelį ne darbo valandomis. Diegimai ir „StatefulSets“ gali būti keičiami iki nulio kopijų. CronJobs gali būti sustabdytas. „Kubernetes Downscaler“ sukonfigūruotas visam klasteriui, vienai ar kelioms vardų erdvėms arba atskiriems ištekliams. Galite nustatyti „neaktyvumo laiką“ arba, atvirkščiai, „darbo laiką“. Pavyzdžiui, norėdami kiek įmanoma sumažinti mastelį naktimis ir savaitgaliais:

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

Čia pateikiamas klasterio darbuotojų mazgų mastelio keitimo savaitgaliais grafikas:

Sutaupykite „Kubernetes“ debesies mokesčių sistemoje AWS

Sumažinus nuo ~13 iki 4 darbuotojų mazgų, jūsų AWS sąskaita tikrai pastebimai pasikeis.

Bet ką daryti, jei man reikia dirbti klasterio „prastovos“ metu? Tam tikri diegimai gali būti visam laikui pašalinti iš mastelio, pridedant sumažinimo/išskyrimo: tikroji anotacija. Diegimus galima laikinai neįtraukti naudojant sumažinimo / išskyrimo iki anotaciją su absoliučia laiko žyma formatu YYYY-MM-DD HH:MM (UTC). Jei reikia, viso klasterio mastelį galima sumažinti įdiegiant bloką su anotacija downscaler/force-uptime, pavyzdžiui, paleidus 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

pamatyti README kube sumažinimo priemonė, jei jus domina diegimo instrukcijos ir papildomos parinktys.

Naudokite horizontalų automatinį mastelį

Daugelis programų/paslaugų susiduria su dinamine įkrovimo schema: kartais jų moduliai neveikia, o kartais veikia visu pajėgumu. Eksploatuoti nuolatinį ankščių parką, kad būtų galima susidoroti su maksimalia apkrova, nėra ekonomiška. „Kubernetes“ palaiko horizontalų automatinį mastelio keitimą visame šaltinyje HorizontalusPodAutoscaler (HPA). CPU naudojimas dažnai yra geras mastelio keitimo rodiklis:

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: Utilization

„Zalando“ sukūrė komponentą, leidžiantį lengvai prijungti pasirinktinę mastelio keitimo metriką: Kube metrikos adapteris (kube-metrics-adapter) yra bendras metrikos adapteris, skirtas Kubernetes, kuris gali rinkti ir teikti tinkintą ir išorinę metriką, skirtą horizontaliam automatinio mastelio keitimui. Jis palaiko mastelio keitimą, pagrįstą Prometheus metrika, SQS eilėmis ir kitais parametrais. Pavyzdžiui, norėdami pritaikyti tinkintą metriką, kurią pati programa pateikia kaip JSON /metrics, naudokite:

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: AverageValue

Horizontaliojo automatinio mastelio konfigūravimas naudojant HPA turėtų būti vienas iš numatytųjų veiksmų, siekiant pagerinti paslaugų be būsenos efektyvumą. „Spotify“ pristato savo patirtį ir rekomendacijas dėl HPA: padidinkite savo dislokavimą, o ne savo piniginę.

Sumažinkite išteklių perteklinį rezervavimą

„Kubernetes“ darbo krūviai nustato jų procesoriaus / atminties poreikius per „resursų užklausas“. CPU ištekliai matuojami virtualiais branduoliais arba dažniau „milicore“, pavyzdžiui, 500 m reiškia 50% vCPU. Atminties ištekliai matuojami baitais, galima naudoti įprastas priesagas, pvz., 500Mi, o tai reiškia 500 megabaitų. Išteklių užklausos „užrakina“ darbuotojų mazgų pajėgumą, o tai reiškia, kad blokas su 1000 m CPU užklausa mazge su 4 vCPU paliks tik 3 vCPU prieinamus kitiems blokams. [1]

Laisvas (perteklinis rezervas) yra skirtumas tarp prašomų išteklių ir faktinio naudojimo. Pavyzdžiui, blokas, kuris reikalauja 2 GiB atminties, bet naudoja tik 200 MiB, turi ~1,8 GiB „perteklinės“ atminties. Perteklius kainuoja pinigus. Galima apytiksliai apskaičiuoti, kad 1 GiB perteklinės atminties kainuoja ~10 USD per mėnesį. [2]

Kubernetes išteklių ataskaita (kube-resource-report) rodo perteklinius rezervus ir gali padėti nustatyti taupymo galimybes:

Sutaupykite „Kubernetes“ debesies mokesčių sistemoje AWS

Kubernetes išteklių ataskaita rodomas perteklius, sukauptas pagal programą ir komandą. Tai leidžia jums rasti vietas, kur galima sumažinti išteklių poreikį. Sukurtoje HTML ataskaitoje pateikiama tik išteklių naudojimo momentinė nuotrauka. Turėtumėte pažvelgti į procesoriaus / atminties naudojimą laikui bėgant, kad nustatytumėte tinkamas išteklių užklausas. Štai Grafana diagrama, skirta „tipinei“ daug procesoriaus reikalaujančiai paslaugai: visi moduliai naudoja žymiai mažiau nei 3 reikalaujami procesoriaus branduoliai:

Sutaupykite „Kubernetes“ debesies mokesčių sistemoje AWS

Sumažinus procesoriaus užklausą nuo 3000m iki ~400m, atlaisvinami resursai kitiems darbo krūviams ir klasteris gali būti mažesnis.

Vidutinis EC2 egzempliorių procesoriaus naudojimas dažnai svyruoja vienaženklių procentų diapazone. rašo Corey Quinn. Nors dėl EC2 tinkamo dydžio įvertinimas gali būti blogas sprendimasPakeisti kai kurias Kubernetes išteklių užklausas YAML faile yra paprasta ir galima sutaupyti daug.

Bet ar tikrai norime, kad žmonės pakeistų YAML failų reikšmes? Ne, mašinos gali tai padaryti daug geriau! Kubernetes Vertical Pod Autoscaler (VPA) tai daro: pritaiko išteklių užklausas ir apribojimus pagal darbo krūvį. Štai „Prometheus“ procesoriaus užklausų (plona mėlyna linija), kurią laikui bėgant pritaikyta VPA, diagramos pavyzdys:

Sutaupykite „Kubernetes“ debesies mokesčių sistemoje AWS

„Zalando“ naudoja VPA visose savo grupėse infrastruktūros komponentams. Nekritinės programos taip pat gali naudoti VPA.

Goldilokai iš Fairwind yra įrankis, kuris sukuria VPA kiekvienam diegimui vardų srityje ir tada pateikia VPA rekomendaciją savo prietaisų skydelyje. Tai gali padėti kūrėjams nustatyti tinkamas procesoriaus / atminties užklausas savo programoms:

Sutaupykite „Kubernetes“ debesies mokesčių sistemoje AWS

Aš parašiau mažą tinklaraščio įrašas apie VPA 2019 m., o neseniai – m CNCF galutinių vartotojų bendruomenė aptarė VPA problemą.

Naudojant EC2 taškinius atvejus

Paskutinis, bet ne mažiau svarbus dalykas – AWS EC2 išlaidas galima sumažinti naudojant „Spot“ egzempliorius kaip „Kubernetes“ darbuotojų mazgus [3]. Vietiniai egzemplioriai yra prieinami su nuolaida iki 90%, palyginti su kainomis pagal pareikalavimą. „Kubernetes“ paleidimas „EC2 Spot“ yra geras derinys: norint pasiekti didesnį pasiekiamumą, reikia nurodyti kelis skirtingus egzempliorių tipus, o tai reiškia, kad galite gauti didesnį mazgą už tą pačią arba mažesnę kainą, o padidintą talpą galima naudoti konteineriniams Kubernetes darbo krūviams.

Kaip paleisti „Kubernetes“ „EC2 Spot“? Yra keletas variantų: naudokite trečiosios šalies paslaugą, pvz., „SpotInst“ (dabar vadinamą „Spot“, neklauskite kodėl) arba tiesiog pridėkite „Spot AutoScalingGroup“ (ASG) prie savo grupės. Pavyzdžiui, čia yra „CloudFormation“ fragmentas, skirtas „optimizuoto pajėgumo“ Spot ASG su keliais egzempliorių tipais:

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"

Kai kurios pastabos apie „Spot“ naudojimą su „Kubernetes“:

  • Turite tvarkyti „Spot“ nutraukimus, pavyzdžiui, sujungdami mazgą, kai egzempliorius sustabdomas
  • Zalando naudoja šakutė oficialus klasterio automatinis mastelio keitimas su mazgų telkinio prioritetais
  • Taškiniai mazgai gali būti priverstinai priimti darbo krūvių „registracijas“, kad būtų galima vykdyti „Spot“.

Santrauka

Tikiuosi, kad kai kurie iš pateiktų įrankių jums bus naudingi mažinant debesijos sąskaitą. Daugumą straipsnio turinio taip pat galite rasti adresu mano pranešimas „DevOps Gathering 2019“ „YouTube“ ir skaidrėse.

Kokia yra geriausia jūsų „Kubernetes“ debesies išlaidų taupymo praktika? Praneškite man adresu „Twitter“ (@try_except_).

[1] Tiesą sakant, mažiau nei 3 vCPU liks naudoti, nes mazgo pralaidumas sumažėja dėl rezervuotų sistemos išteklių. „Kubernetes“ išskiria fizinį mazgo pajėgumą ir „suteiktus“ išteklius (Paskirstomas mazgas).

[2] Skaičiavimo pavyzdys: vienas m5.didelis egzempliorius su 8 GiB atminties kainuoja ~84$ per mėnesį (eu-central-1, On-Demand), t.y. 1/8 mazgo blokavimas yra maždaug ~ 10 USD per mėnesį.

[3] Yra daug daugiau būdų, kaip sumažinti EC2 sąskaitą, pvz., rezervuoti egzemplioriai, taupymo planas ir tt – tų temų čia nenagrinėsiu, bet jūs tikrai turėtumėte jas pasidomėti!

Sužinokite daugiau apie kursą.

Šaltinis: www.habr.com

Добавить комментарий