Iffranka l-ispejjeż tal-cloud ta' Kubernetes fuq AWS

It-traduzzjoni tal-artiklu tħejjiet lejlet il-bidu tal-kors "Pjattaforma infrastrutturali bbażata fuq Kubernetes".

Iffranka l-ispejjeż tal-cloud ta' Kubernetes fuq AWS

Kif tiffranka l-ispejjeż tal-cloud meta taħdem ma' Kubernetes? M'hemm l-ebda soluzzjoni tajba waħda, iżda dan l-artikolu jiddeskrivi diversi għodod li jistgħu jgħinuk timmaniġġja r-riżorsi tiegħek b'mod aktar effettiv u tnaqqas l-ispejjeż tal-cloud computing tiegħek.

Ktibt dan l-artikolu b'Kubernetes għall-AWS f'moħħu, iżda se japplika (kważi) eżattament bl-istess mod għal fornituri oħra tas-sħab. Qed nassumi l-cluster(s) tiegħek diġà għandhom autoscaling konfigurat (cluster-autoscaler). It-tneħħija tar-riżorsi u t-tnaqqis tal-iskjerament tiegħek se jiffrankaw il-flus biss jekk inaqqas ukoll il-flotta tiegħek ta' nodi tal-ħaddiema (istanzi EC2).

Dan l-artikolu se jkopri:

  • tindif tar-riżorsi mhux użati (kube-janitor)
  • Naqqas l-iskala matul il-ħinijiet mhux tax-xogħol (kube-downscaler)
  • bl-użu ta' awtoscaling orizzontali (HPA),
  • tnaqqis tar-riżerva eċċessiva tar-riżorsi (kube-resource-report, VPA)
  • bl-użu ta' istanzi Spot

Tindif tar-riżorsi mhux użati

Ix-xogħol f'ambjent b'ritmu mgħaġġel huwa kbir. Irridu organizzazzjonijiet tat-teknoloġija aċċellerat. Twassil ta' softwer aktar mgħaġġel ifisser ukoll aktar skjeramenti ta' PR, ambjenti ta' preview, prototipi u soluzzjonijiet analitiċi. Kollox huwa skjerat fuq Kubernetes. Min għandu l-ħin biex inaddaf manwalment l-iskjeramenti tat-test? Huwa faċli li tinsa dwar it-tħassir ta 'esperiment ta' ġimgħa. Il-kont tas-sħab se jispiċċa jogħla minħabba xi ħaġa li insew nagħlqu:

Iffranka l-ispejjeż tal-cloud ta' Kubernetes fuq AWS

(Henning Jacobs:
Zhiza:
(kwotazzjonijiet) Corey Quinn:
Leġġenda: Il-kont AWS tiegħek huwa funzjoni tan-numru ta' utenti li għandek.
Fatt: Il-punteġġ AWS tiegħek huwa funzjoni tan-numru ta' inġiniera li għandek.

Ivan Kurnosov (bi tweġiba):
Fatt reali: Il-punteġġ AWS tiegħek huwa funzjoni tan-numru ta' affarijiet li insejt tiddiżattiva/tħassar.)

Kubernetes Janitor (kube-janitor) jgħin biex tnaddaf il-cluster tiegħek. Il-konfigurazzjoni tal-purtinara hija flessibbli kemm għall-użu globali kif ukoll għall-użu lokali:

  • Ir-regoli tal-cluster kollha jistgħu jiddefinixxu l-ħin massimu għall-ħajja (TTL) għal skjeramenti PR/test.
  • Riżorsi individwali jistgħu jiġu annotati ma janitor/ttl, per eżempju biex awtomatikament tneħħi l-spike/prototip wara 7 ijiem.

Ir-regoli ġenerali huma definiti fil-fajl YAML. It-triq tagħha hija mgħoddija mill-parametru --rules-file fil kube-janitor. Hawnhekk hawn regola eżempju biex tneħħi l-ispazji tal-isem kollha bihom -pr- f'isem wara jumejn:

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

L-eżempju li ġej jirregola l-użu tat-tikketta tal-applikazzjoni fuq il-pods Deployment u StatefulSet għall-Deployments/StatefulSets il-ġodda kollha fl-2020, iżda fl-istess ħin jippermetti l-eżekuzzjoni ta’ testijiet mingħajr din it-tikketta għal ġimgħa:

- 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

Mexxi demo limitata fil-ħin għal 30 minuta fuq cluster li jħaddem kube-janitor:

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

Sors ieħor ta 'żieda fl-ispejjeż huma volumi persistenti (AWS EBS). It-tħassir ta' Kubernetes StatefulSet ma jħassarx il-volumi persistenti tiegħu (PVC - PersistentVolumeClaim). Volumi EBS mhux użati jistgħu faċilment jirriżultaw fi spejjeż ta 'mijiet ta' dollari fix-xahar. Kubernetes Janitor għandu karatteristika biex tnaddaf PVCs mhux użati. Pereżempju, din ir-regola tneħħi l-PVCs kollha li mhumiex immuntati minn modulu u li mhumiex referenzjati minn StatefulSet jew CronJob:

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

Kubernetes Janitor jista’ jgħinek iżżomm il-cluster tiegħek nadif u tevita li l-ispejjeż tal-cloud computing jinġabru bil-mod. Għal struzzjonijiet dwar l-iskjerament u l-konfigurazzjoni, segwi README kube-janitor.

Naqqas l-iskala matul il-ħinijiet mhux tax-xogħol

Is-sistemi tat-test u l-istadji huma tipikament meħtieġa li joperaw biss matul il-ħinijiet tax-xogħol. Xi applikazzjonijiet ta' produzzjoni, bħal back office/għodod ta' amministrazzjoni, jeħtieġu wkoll disponibbiltà limitata biss u jistgħu jiġu diżattivati ​​matul il-lejl.

Kubernetes Downscaler (kube-downscaler) jippermetti lill-utenti u lill-operaturi biex inaqqsu s-sistema matul il-ħinijiet mhux tax-xogħol. L-iskjeramenti u StatefulSets jistgħu skala għal żero repliki. CronJobs jistgħu jiġu sospiżi. Kubernetes Downscaler huwa kkonfigurat għal cluster sħiħ, spazju tal-isem wieħed jew aktar, jew riżorsi individwali. Tista 'tissettja jew "ħin inattiv" jew, bil-maqlub, "ħin tax-xogħol". Pereżempju, biex tnaqqas l-iskala kemm jista' jkun matul iljieli u tmiem il-ġimgħa:

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

Hawnhekk hawn graff għall-iskala tan-nodi tal-ħaddiema tal-cluster fi tmiem il-ġimgħa:

Iffranka l-ispejjeż tal-cloud ta' Kubernetes fuq AWS

It-tnaqqis minn ~ 13 għal 4 nodi tal-ħaddiema ċertament jagħmel differenza notevoli fil-kont tal-AWS tiegħek.

Imma x'jiġri jekk għandi bżonn naħdem waqt il-"perijodi ta' waqfien" tal-cluster? Ċerti skjeramenti jistgħu jiġu esklużi b'mod permanenti mill-iskala billi żżid il-downscaler/exclude: annotation vera. L-iskjeramenti jistgħu jiġu esklużi temporanjament bl-użu tal-annotazzjoni downscaler/exclude-until b'timestamp assoluta fil-format SSSS-MM-JJ HH:MM (UTC). Jekk meħtieġ, il-cluster kollu jista 'jiġi skalat lura billi jiġi skjerat pod bl-annotazzjoni downscaler/force-uptime, pereżempju, billi tniedi 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

Ara README kube-downscaler, jekk inti interessat fl-istruzzjonijiet tal-iskjerament u għażliet addizzjonali.

Uża awtoscaling orizzontali

Ħafna applikazzjonijiet/servizzi jittrattaw mudell dinamiku ta 'tagħbija: xi drabi l-moduli tagħhom huma inattivi, u xi drabi jaħdmu b'kapaċità sħiħa. It-tħaddim ta 'flotta permanenti ta' imżiewed biex ilaħħqu mal-ogħla tagħbija massima mhuwiex ekonomiku. Kubernetes jappoġġja l-iskala awtomatika orizzontali madwar riżorsa HorizontalPodAutoscaler (HPA). L-użu tas-CPU huwa spiss indikatur tajjeb għall-iskala:

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 ħoloq komponent biex jgħaqqad faċilment metriċi personalizzati għall-iskala: Kube Metrics Adapter (kube-metrics-adapter) huwa adapter tal-metriċi ġeneriċi għal Kubernetes li jista 'jiġbor u jservi metriċi personalizzati u esterni għal awtoscaling orizzontali tal-miżwed. Jappoġġa skalar ibbażat fuq metriċi Prometheus, kjuwijiet SQS, u settings oħra. Pereżempju, biex tiskala l-iskjerament tiegħek għal metrika personalizzata rappreżentata mill-applikazzjoni nnifisha bħala JSON f'/metrics użu:

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

Il-konfigurazzjoni ta' awtoskala orizzontali b'HPA għandha tkun waħda mill-azzjonijiet awtomatiċi biex tittejjeb l-effiċjenza għal servizzi mingħajr stat. Spotify għandu preżentazzjoni bl-esperjenza u r-rakkomandazzjonijiet tagħhom għall-HPA: iskala l-iskjeramenti tiegħek, mhux il-kartiera tiegħek.

Naqqas il-prenotazzjoni żejda tar-riżorsi

Il-piżijiet tax-xogħol ta 'Kubernetes jiddeterminaw il-ħtiġijiet tagħhom tas-CPU/memorja permezz ta' "talbiet għar-riżorsi." Ir-riżorsi tas-CPU jitkejlu f'qlub virtwali jew aktar komuni f'"millicores", pereżempju 500m jimplika 50% vCPU. Ir-riżorsi tal-memorja huma mkejla f'bytes, u jistgħu jintużaw suffissi komuni, bħal 500Mi, li jfisser 500 megabytes. Riżorsi jitlob kapaċità ta '"lock" fuq nodi tal-ħaddiema, jiġifieri pod b'talba ta' 1000m CPU fuq node b'4 vCPUs se jħalli biss 3 vCPUs disponibbli għal pods oħra. [1]

Slack (riżerva żejda) hija d-differenza bejn ir-riżorsi mitluba u l-użu attwali. Per eżempju, pod li jitlob 2 GiB ta 'memorja iżda juża biss 200 MiB għandu ~ 1,8 GiB ta' memorja "eċċess". Eċċess jiswa l-flus. Wieħed jista 'bejn wieħed u ieħor jistma li 1 GiB ta' memorja żejda jiswa ~ $10 fix-xahar. [2]

Rapport tar-Riżorsi Kubernetes (kube-resource-report) juri riservi żejda u jista' jgħinek tiddetermina l-potenzjal ta' tfaddil:

Iffranka l-ispejjeż tal-cloud ta' Kubernetes fuq AWS

Rapport tar-Riżorsi Kubernetes juri l-eċċess aggregat bl-applikazzjoni u l-kmand. Dan jippermettilek issib postijiet fejn it-talbiet tar-riżorsi jistgħu jitnaqqsu. Ir-rapport HTML iġġenerat jipprovdi biss stampa tal-użu tar-riżorsi. Għandek tħares lejn l-użu tas-CPU/memorja matul iż-żmien biex tiddetermina talbiet adegwati għar-riżorsi. Hawnhekk hawn tabella ta' Grafana għal servizz "tipiku" ta' CPU tqil: il-miżwed kollha qed jużaw b'mod sinifikanti inqas mit-3 cores tas-CPU mitluba:

Iffranka l-ispejjeż tal-cloud ta' Kubernetes fuq AWS

It-tnaqqis tat-talba tas-CPU minn 3000m għal ~ 400m jillibera r-riżorsi għal xogħolijiet oħra u jippermetti li l-cluster ikun iżgħar.

"L-użu medju tas-CPU ta' istanzi EC2 ħafna drabi jmur fil-medda perċentwali b'ċifra waħda," jikteb Corey Quinn. Filwaqt li għall-EC2 l-istima tad-daqs it-tajjeb tista' tkun deċiżjoni ħażinaIt-tibdil ta' xi mistoqsijiet dwar ir-riżorsi ta' Kubernetes f'fajl YAML huwa faċli u jista' jġib iffrankar kbir.

Imma rridu verament nies ibiddlu l-valuri fil-fajls YAML? Le, il-magni jistgħu jagħmluha ħafna aħjar! Kubernetes Vertikali Pod Autoscaler (VPA) tagħmel dan: tadatta t-talbiet tar-riżorsi u r-restrizzjonijiet skont il-piż tax-xogħol. Hawn grafika eżempju ta’ talbiet għal CPU Prometheus (linja blu rqiqa) adattati minn VPA maż-żmien:

Iffranka l-ispejjeż tal-cloud ta' Kubernetes fuq AWS

Zalando juża VPA fil-clusters kollha tiegħu għall-komponenti tal-infrastruttura. Applikazzjonijiet mhux kritiċi jistgħu wkoll jużaw VPA.

Goldilocks minn Fairwind hija għodda li toħloq VPA għal kull skjerament fi namespace u mbagħad turi rakkomandazzjoni tal-VPA fuq id-dashboard tagħha. Jista' jgħin lill-iżviluppaturi jistabbilixxu t-talbiet korretti tas-CPU/memorja għall-applikazzjonijiet tagħhom:

Iffranka l-ispejjeż tal-cloud ta' Kubernetes fuq AWS

Jien ktibt żgħir blogpost dwar VPA fl-2019, u reċentement fi Il-Komunità tal-Utenti finali tas-CNCF iddiskutiet il-kwistjoni tal-VPA.

Bl-użu ta' Istanza Spot EC2

Fl-aħħar iżda mhux l-inqas, l-ispejjeż tal-AWS EC2 jistgħu jitnaqqsu billi jintużaw istanzi Spot bħala nodi tal-ħaddiema Kubernetes [3]. L-istanzi spot huma disponibbli bi skont sa 90% meta mqabbla mal-prezzijiet On-Demand. It-tħaddim ta 'Kubernetes fuq EC2 Spot hija kombinazzjoni tajba: għandek bżonn tispeċifika diversi tipi ta' istanzi differenti għal disponibbiltà ogħla, li jfisser li tista 'tikseb node akbar għall-istess prezz jew prezz aktar baxx, u l-kapaċità miżjuda tista' tintuża minn xogħolijiet ta 'Kubernetes fil-kontejners.

Kif tħaddem Kubernetes fuq EC2 Spot? Hemm diversi għażliet: uża servizz ta' parti terza bħal SpotInst (issa msejjaħ "Spot", ma tistaqsix għaliex), jew sempliċement żid Spot AutoScalingGroup (ASG) mal-cluster tiegħek. Pereżempju, hawn snippet CloudFormation għal Spot ASG "ottimizzat għall-kapaċità" b'tipi multipli ta' istanzi:

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"

Xi noti dwar l-użu ta' Spot ma' Kubernetes:

  • Għandek bżonn timmaniġġja t-terminazzjonijiet Spot, pereżempju billi tgħaqqad in-nodu meta l-istanza titwaqqaf
  • Zalando juża furketta awtoskala tal-clusters uffiċjali bi prijoritajiet ta' ġabra ta' nodi
  • Spot nodes jistgħu jiġu sfurzati taċċetta "reġistrazzjonijiet" ta 'tagħbija tax-xogħol biex taħdem fi Spot

Sommarju

Nispera li ssib xi wħud mill-għodod ippreżentati utli biex tnaqqas il-kont tal-cloud tiegħek. Tista' ssib ħafna mill-kontenut tal-artiklu wkoll fuq it-taħdita tiegħi f'DevOps Gathering 2019 fuq YouTube u fi slides.

X'inhuma l-aħjar prattiki tiegħek biex tiffranka l-ispejjeż tal-cloud fuq Kubernetes? Jekk jogħġbok għarrafni fuq Twitter (@try_except_).

[1] Fil-fatt, inqas minn 3 vCPUs se jibqgħu użabbli peress li l-fluss tan-node jitnaqqas mir-riżorsi riżervati tas-sistema. Kubernetes jiddistingwi bejn il-kapaċità tan-nodi fiżiku u r-riżorsi "fornuti" (Nodu Allokabbli).

[2] Eżempju ta’ kalkolu: istanza waħda m5.grande bi 8 GiB ta’ memorja hija ta’ ~$84 ​​​​kull xahar (eu-central-1, On-Demand), i.e. l-imblukkar ta '1/8 node huwa ta' madwar ~ $ 10 / xahar.

[3] Hemm ħafna aktar modi kif tnaqqas il-kont EC2 tiegħek, bħal Instanzi Riżervati, Pjan ta' Tfaddil, eċċ. - Mhux se nkopri dawk is-suġġetti hawn, iżda żgur li għandek tħares lejhom!

Tgħallem aktar dwar il-kors.

Sors: www.habr.com

Żid kumment