Risparmiate i costi di Kubernetes cloud su AWS

A traduzzione di l'articulu hè stata preparata à a vigilia di l'iniziu di u corsu "Piattaforma di l'infrastruttura basata nantu à Kubernetes".

Risparmiate i costi di Kubernetes cloud su AWS

Cumu risparmià i costi di nuvola quandu travaglia cù Kubernetes? Ùn ci hè micca una solu suluzione ghjusta, ma questu articulu descrive parechje strumenti chì ponu aiutà à gestisce e vostre risorse in modu più efficau è riduce i vostri costi di cloud computing.

Aghju scrittu questu articulu cù Kubernetes per AWS in mente, ma s'applicà (quasi) esattamente u listessu modu à l'altri fornituri di nuvola. Pensu chì u vostru cluster (s) hà digià cunfiguratu autoscaling (cluster-autoscaler). L'eliminazione di risorse è a scala di a vostra implementazione vi risparmiarà solu soldi s'ellu riduce ancu a vostra flotta di nodi di u travagliu (istanze EC2).

Questu articulu coprerà:

  • pulisce e risorse inutilizate (kube-janitor)
  • Riduce a scala durante l'ore di travagliu (kube-downscaler)
  • utilizendu l'autoscaling horizontale (HPA),
  • riduzzione di riservazione eccessiva di risorse (kube-resource-report, VPA)
  • utilizendu istanze Spot

Pulizia di e risorse inutilizate

U travagliu in un ambiente veloce hè grande. Vulemu urganisazioni tecnulugiche acceleratu. Una consegna di software più veloce significa ancu più implementazioni di PR, ambienti di anteprima, prototipi è soluzioni analitiche. Tuttu hè implementatu nantu à Kubernetes. Quale hà u tempu di pulisce manualmente e implementazioni di prova? Hè facilitu di scurdà di sguassà un esperimentu di una settimana. A fattura di u nuvulu finirà per cresce per qualcosa chì avemu scurdatu di chjude:

Risparmiate i costi di Kubernetes cloud su AWS

(Henning Jacobs:
Ziza:
(citazioni) Corey Quinn:
Mitu: U vostru contu AWS hè una funzione di u numeru di utilizatori chì avete.
Fattu: U vostru puntu AWS hè una funzione di u numeru di ingegneri chì avete.

Ivan Kurnosov (in risposta):
Fattu veru: U vostru puntuazione AWS hè una funzione di u numeru di cose chì avete scurdatu di disattivà / sguassate.)

Kubernetes Janitor (kube-janitor) aiuta à pulizziari u vostru cluster. A cunfigurazione di u guardianu hè flessibile per l'usu globale è lucale:

  • E regule in u cluster-wide ponu definisce u tempu massimu di vita (TTL) per implementazioni di PR/test.
  • E risorse individuali ponu esse annotate cù janitor / ttl, per esempiu per sguassà automaticamente u spike / prototipu dopu à 7 ghjorni.

E regule generale sò definite in u schedariu YAML. U so percorsu hè passatu per u paràmetru --rules-file in kube-janitor. Eccu un esempiu di regula per sguassà tutti i spazii di nomi -pr- in u nome dopu à dui ghjorni:

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

L'esempiu seguente regula l'usu di l'etichetta di l'applicazione nantu à i pods Deployment and StatefulSet per tutti i novi Deployments/StatefulSets in 2020, ma à u stessu tempu permette l'esekzione di teste senza sta etichetta per una settimana:

- 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

Eseguite una demo limitata in u tempu per 30 minuti nantu à un cluster chì esegue kube-janitor:

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

Un'altra fonte di crescita di i costi sò i volumi persistenti (AWS EBS). L'eliminazione di un Kubernetes StatefulSet ùn elimina micca i so volumi persistenti (PVC - PersistentVolumeClaim). I volumi EBS inutilizati ponu facilmente risultà in costi di centinaie di dollari per mese. Kubernetes Janitor hà una funzione per pulizziari PVC inutilizati. Per esempiu, sta regula eliminerà tutti i PVC chì ùn sò micca muntati da un modulu è chì ùn sò micca riferiti da un StatefulSet o CronJob:

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

Kubernetes Janitor pò aiutà vi à mantene u vostru cluster pulito è impedisce chì i costi di cloud computing si accumulanu lentamente. Per l'istruzzioni di implementazione è cunfigurazione, seguitate README kube-janitor.

Riduce a scala durante l'ora di travagliu

I sistemi di prova è di staging sò tipicamente necessarii per u funziunamentu solu durante l'ore di l'affari. Alcune applicazioni di produzzione, cum'è strumenti di back office/admin, necessitanu ancu solu dispunibilità limitata è ponu esse disattivate durante a notte.

Kubernetes Downscaler (kube-downscaler) permette à l'utilizatori è à l'operatori di scalà u sistema durante l'ora di travagliu. Implementazioni è StatefulSets ponu scala à zero repliche. CronJobs pò esse sospesu. Kubernetes Downscaler hè cunfiguratu per un cluster sanu, unu o più spazii di nomi, o risorse individuali. Pudete stabilisce "tempu inattivu" o, à u cuntrariu, "tempu di travagliu". Per esempiu, per riduce u scaling quantu pussibule durante a notte è a fine di settimana:

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

Eccu un graficu per a scala di i nodi di u travagliu di u cluster in u weekend:

Risparmiate i costi di Kubernetes cloud su AWS

Scaling down from ~ 13 to 4 worker nodes certamente fa una differenza notevole in a vostra fattura AWS.

Ma chì s'ellu ci vole à travaglià durante u cluster "downtime"? Certi implementazioni ponu esse escluse permanentemente da a scala aghjunghjendu u downscaler / exclude: true annotation. E implementazioni ponu esse temporaneamente escluse usendu l'annotazione downscaler/exclude-finu cù un timestamp assolutu in u formatu AAAA-MM-DD HH:MM (UTC). In casu di necessariu, u cluster sanu pò esse scalatu da implementà un pod cù l'annotazione downscaler/force-uptime, per esempiu, lanciandu 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

Vede README kube-downscaler, se site interessatu in l'istruzzioni di implementazione è l'opzioni supplementari.

Aduprà l'autoscaling horizontale

Parechje applicazioni / servizii trattanu cù un mudellu di carica dinamica: qualchì volta i so moduli sò inattivi, è qualchì volta travaglianu à piena capacità. Operazione di una flotta permanente di pods per affruntà a carica massima massima ùn hè micca ecunomica. Kubernetes supporta l'autoscaling horizontale in una risorsa HorizontalPodAutoscaler (HPA). L'usu di CPU hè spessu un bon indicatore per a scala:

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 hà creatu un cumpunente per cunnette facilmente metriche persunalizati per a scala: Adattatore di metrica Kube (kube-metrics-adapter) hè un adattatore di metrica generica per Kubernetes chì pò cullà è serve metriche persunalizati è esterni per l'autoscaling horizontale di pods. Supporta a scala basata nantu à e metriche Prometheus, file SQS, è altre paràmetri. Per esempiu, per scala a vostra implementazione à una metrica persunalizata rapprisentata da l'applicazione stessa cum'è JSON in /metrics use:

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

A cunfigurazione di l'autoscaling horizontale cù HPA deve esse una di l'azzioni predeterminate per migliurà l'efficienza per i servizii senza statu. Spotify hà una presentazione cù a so sperienza è cunsiglii per HPA: scala e vostre implementazioni, micca u vostru portafoglio.

Riduce l'overbooking di risorse

I carichi di travagliu Kubernetes determinanu i so bisogni di CPU / memoria attraversu "richieste di risorse". I risorse di CPU sò misurati in core virtuali o più cumunimenti in "millicores", per esempiu 500m implica 50% vCPU. I risorsi di memoria sò misurati in byte, è i suffissi cumuni ponu esse usatu, cum'è 500Mi, chì significa 500 megabytes. A risorsa dumanda a capacità di "bloccare" nantu à i nodi di u travagliu, vale à dì un pod cù una dumanda di CPU 1000m nantu à un node cù 4 vCPU lascerà solu 3 vCPU dispunibuli à altri pods. [1]

Slack (riserva eccessiva) hè a diffarenza trà e risorse richieste è l'usu attuale. Per esempiu, un pod chì dumanda 2 GiB di memoria ma usa solu 200 MiB hà ~ 1,8 GiB di memoria "excess". L'eccessu costa soldi. Si pò estimà approssimativamente chì 1 GiB di memoria redundante costa ~ $ 10 per mese. [2]

Rapportu di risorse Kubernetes (kube-resource-report) mostra riserve eccessivi è ponu aiutà à determinà u potenziale di risparmiu:

Risparmiate i costi di Kubernetes cloud su AWS

Rapportu di risorse Kubernetes mostra l'eccessu aggregatu per l'applicazione è u cumandamentu. Questu permette di truvà posti induve e dumande di risorse ponu esse ridutte. U rapportu HTML generatu furnisce solu una snapshot di l'usu di risorse. Duvete guardà l'usu di CPU / memoria cù u tempu per determinà e dumande di risorse adatte. Eccu un graficu Grafana per un serviziu "tipicu" di CPU pesante: tutti i pods usanu significativamente menu di i 3 core CPU richiesti:

Risparmiate i costi di Kubernetes cloud su AWS

A riduzione di a dumanda di CPU da 3000m à ~ 400m libera risorse per altri carichi di travagliu è permette chì u cluster sia più chjucu.

"L'usu mediu di CPU di l'istanze EC2 hè spessu in u intervallu percentuale di un cifru", scrive Corey Quinn. Mentre per EC2 stima di a taglia ghjustu pò esse una mala decisioneCambià alcune dumande di risorse Kubernetes in un schedariu YAML hè faciule è pò purtà un grande risparmiu.

Ma vulemu veramente chì e persone cambienu i valori in i fugliali YAML? Innò, i machini ponu fà assai megliu! Kubernetes Autoscaler à pod verticale (VPA) face cusì: adatta e dumande di risorse è e restrizioni secondu a carica di travagliu. Eccu un esempiu graficu di e richieste di CPU Prometheus (linea blu fina) adattate da VPA cù u tempu:

Risparmiate i costi di Kubernetes cloud su AWS

Zalando usa VPA in tutti i so clusters per i cumpunenti di l'infrastruttura. L'applicazioni non critiche ponu ancu aduprà VPA.

Goldilocks da Fairwind hè un strumentu chì crea un VPA per ogni implementazione in un spaziu di nomi è poi mostra una raccomandazione VPA in u so dashboard. Pò aiutà i sviluppatori à stabilisce e richieste di CPU / memoria curretta per e so applicazioni:

Risparmiate i costi di Kubernetes cloud su AWS

Aghju scrittu un picculu blog post nantu à VPA in 2019, è recentemente in A Comunità d'Utilizatori Finali CNCF hà discututu u prublema VPA.

Utilizà l'istanze Spot EC2

Infine, ma micca menu, i costi AWS EC2 ponu esse ridotti usendu istanze Spot cum'è nodi di travagliu Kubernetes [3]. L'istanze spot sò dispunibuli finu à u 90% di scontu cumparatu cù i prezzi On-Demand. L'esecuzione di Kubernetes in EC2 Spot hè una bona cumminazione: avete bisognu di specificà parechji tippi di istanze differenti per una dispunibilità più altu, chì significa chì pudete ottene un node più grande per u listessu prezzu o più bassu, è a capacità aumentata pò esse aduprata da carichi di travagliu di Kubernetes cuntainerizzati.

Cumu eseguisce Kubernetes nantu à EC2 Spot? Ci hè parechje opzioni: utilizate un serviziu di terzu cum'è SpotInst (oghji chjamatu "Spot", ùn mi dumandate micca perchè), o solu aghjunghje un Spot AutoScalingGroup (ASG) à u vostru cluster. Per esempiu, quì hè un snippet di CloudFormation per un Spot ASG "optimizatu per capacità" cù parechji tippi di istanza:

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"

Alcune note nantu à l'usu di Spot cù Kubernetes:

  • Avete bisognu di trattà e terminazioni Spot, per esempiu unendu u node quandu l'istanza hè fermata
  • Zalando usa forchetta autoscaling di cluster ufficiale cù priorità di pool di nodi
  • Spot nodes pò esse furzatu accettà "registrazioni" di carichi di travagliu per eseguisce in Spot

Resumen

Spergu chì truvate alcuni di l'arnesi presentati utili per riduce a vostra fattura di nuvola. Pudete truvà a maiò parte di u cuntenutu di l'articulu ancu à a mo discussione à DevOps Gathering 2019 in YouTube è in slides.

Chì sò e vostre migliori pratiche per risparmià i costi di nuvola in Kubernetes? Per piacè fatemi sapè à Twitter (@try_except_).

[1] In fattu, menu di 3 vCPU resteranu utilizable cum'è u throughput di u node hè ridutta da risorse di sistema riservate. Kubernetes distingue tra capacità di nodu fisicu è risorse "provisioned" (Node Allocabile).

[2] Esempiu di calculu: una istanza m5.large cù 8 GiB di memoria hè ~ $ 84 ​​per mese (eu-central-1, On-Demand), i.e. bluccatu 1/8 node hè circa ~ $ 10 / mese.

[3] Ci hè parechje altre manere di riduce a vostra fattura EC2, cum'è Instanze Riservate, Pianu di Risparmia, etc. - Ùn aghju micca copre quelli sughjetti quì, ma duvete certamente guardà in elli!

Sapete più nantu à u corsu.

Source: www.habr.com

Add a comment