Besparje op Kubernetes wolkkosten op AWS

De oersetting fan it artikel waard taret op 'e foarjûn fan it begjin fan' e kursus "Ynfrastruktuerplatfoarm basearre op Kubernetes".

Besparje op Kubernetes wolkkosten op AWS

Hoe kinne jo besparje op wolkkosten as jo wurkje mei Kubernetes? D'r is gjin ienige juste oplossing, mar dit artikel beskriuwt ferskate ark dy't jo kinne helpe jo jo boarnen effektiver te behearjen en jo kosten foar cloud computing te ferminderjen.

Ik skreau dit artikel mei Kubernetes foar AWS yn gedachten, mar it sil (hast) krekt deselde manier jilde foar oare wolkproviders. Ik nim oan dat jo kluster(s) al autoskaal konfigurearre hawwe (kluster-autoscaler). Boarnen fuortsmite en jo ynset fermindere sille jo allinich jild besparje as it ek jo float fan arbeidersknooppunten (EC2-eksimplaren) ferminderet.

Dit artikel sil dekke:

  • net brûkte boarnen opromje (kube-konservator)
  • Skaalfergrutting ferminderje tidens net-wurktiden (kube-downscaler)
  • mei help fan horizontale autoscaling (HPA),
  • reduksje fan oerstallige boarne reservearring (kube-resource-rapport, VPA)
  • mei help fan Spot-eksimplaren

Net brûkte boarnen skjinmeitsje

Wurkje yn in rappe omjouwing is geweldich. Wy wolle technyske organisaasjes fersneld. Snellere softwarelevering betsjut ek mear PR-ynset, preview-omjouwings, prototypes en analytyske oplossingen. Alles wurdt ynset op Kubernetes. Wa hat de tiid om test-ynset manuell op te romjen? It is maklik om te ferjitten oer it wiskjen fan in wike-âld eksperimint. De wolk rekken sil einigje omheech fanwege iets dat wy fergetten te sluten:

Besparje op Kubernetes wolkkosten op AWS

(Henning Jacobs:
Zhiza:
(quotes) Corey Quinn:
Myte: Jo AWS-akkount is in funksje fan it oantal brûkers dat jo hawwe.
Feit: Jo AWS-score is in funksje fan it oantal yngenieurs dat jo hawwe.

Ivan Kurnosov (yn antwurd):
Echt feit: Jo AWS-score is in funksje fan it oantal dingen dat jo fergetten binne útskeakelje / wiskje.)

Kubernetes Janitor (kube-janitor) helpt jo kluster skjin te meitsjen. De konfiguraasje fan 'e janitor is fleksibel foar sawol wrâldwide as lokaal gebrûk:

  • Cluster-wide regels kinne de maksimale time-to-live (TTL) definiearje foar PR / test-ynset.
  • Yndividuele boarnen kinne wurde annotearre mei janitor / ttl, bygelyks om automatysk fuortsmite de spike / prototype nei 7 dagen.

Algemiene regels wurde definieare yn it YAML-bestân. Syn paad wurdt trochjûn troch de parameter --rules-file yn kube-konservator. Hjir is in foarbyldregel om alle nammeromten mei te ferwiderjen -pr- yn de namme nei twa dagen:

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

It folgjende foarbyld regelet it gebrûk fan it applikaasjelabel op 'e Deployment- en StatefulSet-pods foar alle nije Deployments/StatefulSets yn 2020, mar lit tagelyk de útfiering fan testen sûnder dit label foar in wike ta:

- 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

Rin in tiidbeheinde demo foar 30 minuten op in kluster dy't kube-janitor draait:

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

In oare boarne fan tanimmende kosten is persistente voluminten (AWS EBS). It wiskjen fan in Kubernetes StatefulSet wisket syn oanhâldende folumes net (PVC - PersistentVolumeClaim). Net brûkte EBS-voluminten kinne maklik resultearje yn kosten fan hûnderten dollars per moanne. Kubernetes Janitor hat in funksje om net brûkte PVC's op te romjen. Dizze regel sil bygelyks alle PVC's fuortsmite dy't net binne monteard troch in module en dy't net ferwiisd wurde troch in StatefulSet of CronJob:

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

Kubernetes Janitor kin jo helpe om jo kluster skjin te hâlden en te foarkommen dat kosten foar wolkkomputering stadichoan opstapelen. Folgje foar ynstruksjes foar ynset en konfiguraasje README kube-janitor.

Ferminderje skaalfergrutting yn net-wurktiden

Test- en stagingsystemen binne typysk ferplicht om allinich te operearjen tidens bedriuwstiden. Guon produksjeapplikaasjes, lykas back office / admin-ark, fereaskje ek mar beheinde beskikberens en kinne oernachtich útskeakele wurde.

Kubernetes Downscaler (kube-downscaler) lit brûkers en operators it systeem ferminderje yn net-wurktiden. Deployments en StatefulSets kinne skaalfergrutting nei nul replika's. CronJobs kin wurde skorst. Kubernetes Downscaler is konfigurearre foar in hiele kluster, ien of mear nammeromten, of yndividuele boarnen. Jo kinne "idle time" of, oarsom, "wurktiid" ynstelle. Bygelyks om skaalfergrutting safolle mooglik te ferminderjen yn nachten en wykeinen:

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

Hjir is in grafyk foar skaalfergrutting fan klusterwurkersknooppunten yn it wykein:

Besparje op Kubernetes wolkkosten op AWS

Skaalfergrutting fan ~13 nei 4 arbeidersknooppunten makket grif in merkber ferskil yn jo AWS-rekken.

Mar wat as ik moat wurkje tidens kluster "downtime"? Bepaalde ynset kinne permanint útsletten wurde fan skaalfergrutting troch it tafoegjen fan de downscaler/exclude: wiere annotaasje. Ynset kin tydlik útsletten wurde mei de downscaler/exclude-tot annotaasje mei in absolute tiidstempel yn it formaat JJJJ-MM-DD UU:MM (UTC). As it nedich is, kin it hiele kluster weromskaald wurde troch it ynsetten fan in pod mei de annotaasje downscaler/force-uptime, bygelyks troch nginx blank te starten:

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

Sjoch README kube-downscaler, as jo ynteressearre binne yn ynset ynstruksjes en ekstra opsjes.

Brûk horizontale autoscaling

In protte applikaasjes/tsjinsten dogge mei in dynamysk ladenpatroan: soms binne har modules idle, en soms wurkje se op folsleine kapasiteit. It operearjen fan in permaninte float fan pods om te gean mei maksimale pyklast is net ekonomysk. Kubernetes stipet horizontale automatyske skaalfergrutting oer in boarne HorizontalPodAutoscaler (HPA). CPU-gebrûk is faaks in goede yndikator foar skaalfergrutting:

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 hat in komponint makke om maklik oanpaste metriken te ferbinen foar skaalfergrutting: Kube Metric Adapter (kube-metrics-adapter) is in generike metrikenadapter foar Kubernetes dy't oanpaste en eksterne metriken kinne sammelje en tsjinje foar horizontale autoskalearring fan pods. It stipet skaalfergrutting basearre op Prometheus-metriken, SQS-wachtrijen en oare ynstellingen. Bygelyks, om jo ynset te skaaljen nei in oanpaste metrik fertsjintwurdige troch de applikaasje sels as JSON yn / metrics brûke:

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

It konfigurearjen fan horizontale autoskalearring mei HPA moat ien fan 'e standertaksjes wêze om effisjinsje te ferbetterjen foar steatleaze tsjinsten. Spotify hat in presintaasje mei har ûnderfining en oanbefellings foar HPA: skaal jo ynset, net jo portemonnee.

Ferminderje boarne oerboeking

Kubernetes-workloads bepale har CPU-/ûnthâldbehoeften fia "boarneoanfragen." CPU-boarnen wurde mjitten yn firtuele kearnen of faker yn "millicores", bygelyks 500m betsjut 50% vCPU. Unthâldboarnen wurde mjitten yn bytes, en gewoane efterheaksels kinne brûkt wurde, lykas 500Mi, dat betsjut 500 megabytes. Boarne freget om "beskoattelje" kapasiteit op arbeidersknooppunten, wat betsjut dat in pod mei in 1000m CPU-fersyk op in knooppunt mei 4 vCPU's allinich 3 vCPU's beskikber litte sil foar oare pods. [1]

Slack (oerstallige reserve) is it ferskil tusken frege boarnen en werklike gebrûk. Bygelyks, in pod dy't 2 GiB oan ûnthâld freget, mar allinich 200 MiB brûkt, hat ~ 1,8 GiB oan "oerstallich" ûnthâld. Oerskot kostet jild. Men kin rûchwei skatte dat 1 GiB oan oerstallich ûnthâld kostet ~ $ 10 per moanne. [2]

Kubernetes Resource Report (kube-resource-report) toant oerstallige reserves en kin jo helpe om besparringspotinsjeel te bepalen:

Besparje op Kubernetes wolkkosten op AWS

Kubernetes Resource Report toant it oerskot aggregearre troch tapassing en kommando. Hjirmei kinne jo plakken fine wêr't boarne easken kinne wurde fermindere. It oanmakke HTML-rapport jout allinich in momintopname fan boarnegebrûk. Jo moatte sjen nei CPU / ûnthâldgebrûk yn 'e rin fan' e tiid om adekwate boarneoanfragen te bepalen. Hjir is in Grafana-diagram foar in "typyske" CPU-swiere tsjinst: alle pods brûke signifikant minder dan de 3 frege CPU-kearnen:

Besparje op Kubernetes wolkkosten op AWS

It ferminderjen fan it CPU-oanfraach fan 3000m nei ~400m makket boarnen frij foar oare workloads en lit it kluster lytser wêze.

"Gemiddeld CPU-gebrûk fan EC2-eksimplaren sweeft faak yn it iensidige persintaazjeberik," skriuwt Corey Quinn. Wylst foar EC2 it ynskatten fan de juste grutte kin in min beslút wêzeIt feroarjen fan guon Kubernetes-boarnefragen yn in YAML-bestân is maklik en kin enoarme besparrings bringe.

Mar wolle wy wirklik dat minsken wearden feroarje yn YAML-bestannen? Nee, masines kinne it folle better! Kubernetes Fertikale Pod Autoscaler (VPA) docht krekt dat: past boarneoanfragen en beheiningen oan neffens de wurkdruk. Hjir is in foarbyldgrafyk fan Prometheus CPU-oanfragen (tinne blauwe line) oanpast troch VPA oer de tiid:

Besparje op Kubernetes wolkkosten op AWS

Zalando brûkt VPA yn al syn klusters foar ynfrastruktuerkomponinten. Net-krityske applikaasjes kinne ek VPA brûke.

Goldilocks fan Fairwind is in ark dat in VPA makket foar elke ynset yn in nammeromte en dan in VPA-oanbefelling werjaan op syn dashboard. It kin ûntwikkelders helpe om de juste CPU / ûnthâld oanfragen foar har applikaasjes yn te stellen:

Besparje op Kubernetes wolkkosten op AWS

Ik skreau in lyts blogpost oer VPA yn 2019, en koartlyn yn CNCF Eindbrûker Mienskip besprutsen VPA issue.

Mei EC2 Spot-ynstânsjes

As lêste, mar net it minste, kinne AWS EC2-kosten wurde fermindere troch Spot-eksimplaren te brûken as Kubernetes-wurkerknooppunten [3]. Spot-eksimplaren binne te krijen mei in koarting fan maksimaal 90% fergelike mei prizen op oanfraach. It útfieren fan Kubernetes op EC2 Spot is in goede kombinaasje: jo moatte ferskate ferskillende eksimplaartypen opjaan foar hegere beskikberens, wat betsjut dat jo in gruttere knooppunt kinne krije foar deselde of legere priis, en de ferhege kapasiteit kin brûkt wurde troch containerisearre Kubernetes-wurkloads.

Hoe kinne jo Kubernetes útfiere op EC2 Spot? D'r binne ferskate opsjes: brûk in tsjinst fan tredden lykas SpotInst (no "Spot" neamd, freegje my net wêrom), of foegje gewoan in Spot AutoScalingGroup (ASG) ta oan jo kluster. Hjir is bygelyks in CloudFormation-snippet foar in "kapasiteit-optimisearre" Spot ASG mei meardere eksimplaartypen:

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"

Guon notysjes oer it brûken fan Spot mei Kubernetes:

  • Jo moatte Spot-beëinigingen behannelje, bygelyks troch it knooppunt te fusearjen as it eksimplaar stoppe wurdt
  • Zalando brûkt foarke offisjele kluster autoscaling mei node pool prioriteiten
  • Spot knopen kin wurde twongen akseptearje "registraasjes" fan workloads om te rinnen yn Spot

Gearfetting

Ik hoopje dat jo guon fan 'e presinteare ynstruminten nuttich fine by it ferminderjen fan jo wolkrekken. Jo kinne de measte ynhâld fan it artikel ek fine op myn petear by DevOps Gathering 2019 op YouTube en yn dia's.

Wat binne jo bêste praktiken foar it besparjen fan wolkkosten op Kubernetes? Lit it my witte by Twitter (@try_except_).

[1] Yn feite sille minder dan 3 vCPU's brûkber bliuwe, om't de trochfier fan 'e knooppunt wurdt fermindere troch reservearre systeemboarnen. Kubernetes makket ûnderskied tusken fysike knooppuntkapasiteit en "foarsjoen" boarnen (Node Allocatable).

[2] Berekkeningsfoarbyld: ien m5.large eksimplaar mei 8 GiB ûnthâld is ~$84 ​​per moanne (eu-central-1, On-Demand), d.w.s. blokkearje 1/8 knooppunt is likernôch ~ $ 10 / moanne.

[3] D'r binne folle mear manieren om jo EC2-biljet te ferminderjen, lykas Reserved Instances, Savings Plan, ensfh. - Ik sil dizze ûnderwerpen hjir net dekke, mar jo moatte der seker nei sjen!

Learje mear oer de kursus.

Boarne: www.habr.com

Add a comment