Arbedwch ar gostau cwmwl Kubernetes ar AWS

Paratowyd y cyfieithiad o'r erthygl ar y noson cyn dechrau'r cwrs "Llwyfan seilwaith yn seiliedig ar Kubernetes".

Arbedwch ar gostau cwmwl Kubernetes ar AWS

Sut i arbed costau cwmwl wrth weithio gyda Kubernetes? Nid oes un ateb cywir, ond mae'r erthygl hon yn disgrifio nifer o offer a all eich helpu i reoli'ch adnoddau'n fwy effeithiol a lleihau eich costau cyfrifiadura cwmwl.

Ysgrifennais yr erthygl hon gyda Kubernetes ar gyfer AWS mewn golwg, ond bydd yn berthnasol (bron) yn union yr un ffordd i ddarparwyr cwmwl eraill. Rwy'n cymryd bod eich clwstwr(iau) eisoes wedi ffurfweddu graddfeydd awtomatig (clwstwr-awtoscaler). Bydd dileu adnoddau a lleihau eich defnydd ond yn arbed arian i chi os bydd hefyd yn lleihau eich fflyd o nodau gweithwyr (achosion EC2).

Bydd yr erthygl hon yn ymdrin â:

  • glanhau adnoddau nad ydynt yn cael eu defnyddio (ciwb-janitor)
  • Lleihau graddio yn ystod oriau nad ydynt yn gweithio (ciwb-downscaler)
  • defnyddio graddoli awtomatig llorweddol (HPA),
  • lleihau'r archeb adnoddau gormodol (kube-adnodd-adroddiad, VPA)
  • defnyddio enghreifftiau Sbot

Glanhau adnoddau nad ydynt yn cael eu defnyddio

Mae gweithio mewn amgylchedd cyflym yn wych. Rydym eisiau sefydliadau technoleg cyflymu. Mae cyflwyno meddalwedd cyflymach hefyd yn golygu mwy o leoliadau cysylltiadau cyhoeddus, amgylcheddau rhagolwg, prototeipiau, ac atebion dadansoddeg. Mae popeth yn cael ei ddefnyddio ar Kubernetes. Pwy sydd â'r amser i lanhau gosodiadau prawf â llaw? Mae'n hawdd anghofio am ddileu arbrawf wythnos oed. Bydd bil y cwmwl yn codi yn y pen draw oherwydd rhywbeth yr ydym wedi anghofio ei gau:

Arbedwch ar gostau cwmwl Kubernetes ar AWS

(Henning Jacobs:
Zhiza:
(dyfyniadau) Corey Quinn:
Myth: Mae eich cyfrif AWS yn swyddogaeth o nifer y defnyddwyr sydd gennych.
Ffaith: Mae eich sgôr AWS yn swyddogaeth o nifer y peirianwyr sydd gennych.

Ivan Kurnosov (mewn ymateb):
Ffaith go iawn: Mae eich sgôr AWS yn swyddogaeth o'r nifer o bethau yr ydych wedi anghofio eu hanalluogi / eu dileu.)

Kubernetes Janitor (ciwb-janitor) yn helpu i lanhau eich clwstwr. Mae cyfluniad y porthor yn hyblyg ar gyfer defnydd byd-eang a lleol:

  • Gall rheolau clwstwr cyfan ddiffinio'r uchafswm amser i fyw (TTL) ar gyfer lleoliadau cysylltiadau cyhoeddus/profion.
  • Gellir anodi adnoddau unigol gyda janitor/ttl, er enghraifft i gael gwared ar y pigyn/prototeip yn awtomatig ar ôl 7 diwrnod.

Diffinnir rheolau cyffredinol yn y ffeil YAML. Mae ei lwybr yn mynd trwy'r paramedr --rules-file yn ciwb-janitor. Dyma reol enghreifftiol i ddileu pob gofod enw gyda -pr- yn yr enw ar ôl dau ddiwrnod:

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

Mae'r enghraifft ganlynol yn rheoleiddio'r defnydd o'r label cymhwysiad ar y codennau Defnyddio a StatefulSet ar gyfer yr holl Gosodiadau/Setau Gwladol newydd yn 2020, ond ar yr un pryd yn caniatáu cynnal profion heb y label hwn am wythnos:

- 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

Rhedeg demo â therfyn amser am 30 munud ar glwstwr sy'n rhedeg kube-janitor:

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

Ffynhonnell arall o gostau cynyddol yw cyfeintiau cyson (AWS EBS). Nid yw dileu Kubernetes StatefulSet yn dileu ei gyfrolau parhaus (PVC - PersistentVolumeClaim). Gall cyfeintiau EBS nas defnyddiwyd arwain yn hawdd at gostau cannoedd o ddoleri y mis. Mae gan Kubernetes Janitor nodwedd i lanhau PVCs nas defnyddiwyd. Er enghraifft, bydd y rheol hon yn dileu pob PVC nad yw wedi'i osod gan fodiwl ac nad yw StatefulSet neu CronJob yn cyfeirio ato:

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

Gall Kubernetes Janitor eich helpu i gadw'ch clwstwr yn lân ac atal costau cyfrifiadura cwmwl rhag pentyrru'n araf. Ar gyfer cyfarwyddiadau defnyddio a ffurfweddu, dilynwch README ciwb-janitor.

Lleihau graddio yn ystod oriau nad ydynt yn gweithio

Fel arfer, dim ond yn ystod oriau busnes y mae'n ofynnol i systemau profi a llwyfannu weithredu. Mae rhai cymwysiadau cynhyrchu, fel offer swyddfa gefn / gweinyddol, hefyd yn gofyn am argaeledd cyfyngedig yn unig a gallant gael eu hanalluogi dros nos.

Kubernetes Downscaler (kube-downscaler) yn caniatáu defnyddwyr a gweithredwyr i raddfa i lawr y system yn ystod oriau nad ydynt yn gweithio. Gall Deployments a StatefulSets raddfa i ddim atgynhyrchiadau. Gellir atal CronJobs. Mae Kubernetes Downscaler wedi'i ffurfweddu ar gyfer clwstwr cyfan, un gofod enw neu fwy, neu adnoddau unigol. Gallwch chi osod naill ai “amser segur” neu, i'r gwrthwyneb, “amser gwaith”. Er enghraifft, i leihau graddio cymaint â phosibl yn ystod nosweithiau a phenwythnosau:

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

Dyma graff ar gyfer graddio nodau gweithwyr clwstwr ar benwythnosau:

Arbedwch ar gostau cwmwl Kubernetes ar AWS

Mae lleihau o ~13 i 4 nod gweithiwr yn sicr yn gwneud gwahaniaeth amlwg yn eich bil AWS.

Ond beth os oes angen i mi weithio yn ystod "amser segur" clwstwr? Gall rhai gosodiadau gael eu heithrio'n barhaol rhag graddio trwy ychwanegu'r graddfa i lawr/eithrio: gwir anodi. Gall gosodiadau gael eu gwahardd dros dro gan ddefnyddio'r downscaler/exclude-tan anodiad gyda stamp amser absoliwt yn y fformat BBBB-MM-DD HH:MM (UTC). Os oes angen, gellir lleihau'r clwstwr cyfan trwy ddefnyddio pod gyda'r anodiad downscaler/force-uptime, er enghraifft, trwy lansio nginx yn wag:

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

Gweler README ciwb-downscaler, os oes gennych ddiddordeb mewn cyfarwyddiadau lleoli ac opsiynau ychwanegol.

Defnyddiwch raddio awtomatig llorweddol

Mae llawer o gymwysiadau/gwasanaethau yn delio â phatrwm llwytho deinamig: weithiau mae eu modiwlau yn segur, ac weithiau maent yn gweithio hyd eithaf eu gallu. Nid yw'n ddarbodus gweithredu fflyd barhaol o godennau i ymdopi â'r llwyth brig uchaf. Mae Kubernetes yn cefnogi graddio auto llorweddol ar draws adnodd Llorweddol PodAutoscaler (HPA). Mae defnydd CPU yn aml yn ddangosydd da ar gyfer graddio:

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

Mae Zalando wedi creu cydran i gysylltu metrigau arferiad yn hawdd ar gyfer graddio: Addasydd Kube Metrics (kube-metrics-adapter) yn addasydd metrigau generig ar gyfer Kubernetes sy'n gallu casglu a gwasanaethu metrigau arferol ac allanol ar gyfer graddio codennau'n awtomatig yn llorweddol. Mae'n cefnogi graddio yn seiliedig ar fetrigau Prometheus, ciwiau SQS, a gosodiadau eraill. Er enghraifft, i raddio'ch defnydd i fetrig wedi'i deilwra a gynrychiolir gan y cais ei hun fel JSON mewn defnydd / metrigau:

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

Dylai ffurfweddu graddoli awtomatig llorweddol gyda HPA fod yn un o'r camau rhagosodedig i wella effeithlonrwydd ar gyfer gwasanaethau heb wladwriaeth. Mae gan Spotify gyflwyniad gyda'u profiad a'u hargymhellion ar gyfer HPA: graddfa eich gosodiadau, nid eich waled.

Lleihau gorarchebu adnoddau

Mae llwythi gwaith Kubernetes yn pennu eu hanghenion CPU / cof trwy “geisiadau adnoddau.” Mae adnoddau CPU yn cael eu mesur mewn creiddiau rhithwir neu'n fwy cyffredin mewn “milicores”, er enghraifft mae 500m yn awgrymu 50% vCPU. Mae adnoddau cof yn cael eu mesur mewn beit, a gellir defnyddio ôl-ddodiaid cyffredin, fel 500Mi, sy'n golygu 500 megabeit. Ceisiadau adnoddau "cloi" capasiti ar nodau gweithwyr, sy'n golygu y bydd pod gyda chais CPU 1000m ar nod gyda 4 vCPU yn gadael dim ond 3 vCPU ar gael i godennau eraill. [1]

Slac (cronfa wrth gefn) yw'r gwahaniaeth rhwng yr adnoddau y gofynnir amdanynt a'r defnydd gwirioneddol. Er enghraifft, mae gan god sy'n gofyn am 2 GiB o gof ond sy'n defnyddio 200 MiB yn unig ~1,8 GiB o gof “dros ben”. Mae gormodedd yn costio arian. Gellir amcangyfrif yn fras bod 1 GiB o gof segur yn costio ~$10 y mis. [2]

Adroddiad Adnoddau Kubernetes (kube-resource-report) yn dangos cronfeydd wrth gefn gormodol a gall eich helpu i bennu potensial arbedion:

Arbedwch ar gostau cwmwl Kubernetes ar AWS

Adroddiad Adnoddau Kubernetes yn dangos y gormodedd wedi'i agregu yn ôl cais a gorchymyn. Mae hyn yn eich galluogi i ddod o hyd i leoedd lle gellir lleihau'r galw am adnoddau. Dim ond ciplun o'r defnydd o adnoddau y mae'r adroddiad HTML a gynhyrchir yn ei ddarparu. Dylech edrych ar y defnydd o CPU/cof dros amser i benderfynu ar geisiadau adnoddau digonol. Dyma siart Grafana ar gyfer gwasanaeth CPU-trwm "nodweddiadol": mae pob cod yn defnyddio llawer llai na'r 3 craidd CPU y gofynnwyd amdanynt:

Arbedwch ar gostau cwmwl Kubernetes ar AWS

Mae lleihau'r cais CPU o 3000m i ~400m yn rhyddhau adnoddau ar gyfer llwythi gwaith eraill ac yn caniatáu i'r clwstwr fod yn llai.

“Mae defnydd CPU cyfartalog o achosion EC2 yn aml yn hofran yn yr ystod ganrannol un digid,” yn ysgrifennu Corey Quinn. Tra ar gyfer EC2 gall amcangyfrif y maint cywir fod yn benderfyniad gwaelMae'n hawdd newid rhai ymholiadau adnoddau Kubernetes mewn ffeil YAML a gall ddod ag arbedion enfawr.

Ond ydyn ni wir eisiau i bobl newid gwerthoedd mewn ffeiliau YAML? Na, gall peiriannau ei wneud yn llawer gwell! Kubernetes Autoscaler pod fertigol (VPA) yn union fel: addasu ceisiadau a chyfyngiadau adnoddau yn unol â'r llwyth gwaith. Dyma graff enghreifftiol o geisiadau CPU Prometheus (llinell las denau) wedi'u haddasu gan VPA dros amser:

Arbedwch ar gostau cwmwl Kubernetes ar AWS

Mae Zalando yn defnyddio VPA yn ei holl glystyrau ar gyfer cydrannau seilwaith. Gall cymwysiadau nad ydynt yn hanfodol hefyd ddefnyddio VPA.

Elen Benfelen gan Fairwind yn offeryn sy'n creu VPA ar gyfer pob defnydd mewn gofod enw ac yna'n dangos argymhelliad VPA ar ei ddangosfwrdd. Gall helpu datblygwyr i osod y ceisiadau CPU / cof cywir ar gyfer eu cymwysiadau:

Arbedwch ar gostau cwmwl Kubernetes ar AWS

Ysgrifennais fach blogbost am VPA yn 2019, ac yn ddiweddar yn Trafododd Cymuned Defnyddiwr Terfynol CNCF y mater VPA.

Defnyddio EC2 Sbot-achosion

Yn olaf ond nid lleiaf, gellir lleihau costau AWS EC2 trwy ddefnyddio enghreifftiau Spot fel nodau gweithiwr Kubernetes [3]. Mae achosion yn y fan a'r lle ar gael am ddisgownt o hyd at 90% o gymharu â phrisiau Ar-alwad. Mae rhedeg Kubernetes ar EC2 Spot yn gyfuniad da: mae angen i chi nodi sawl math gwahanol o achosion ar gyfer argaeledd uwch, sy'n golygu y gallwch chi gael nod mwy am yr un pris neu bris is, a gellir defnyddio'r gallu cynyddol gan lwythi gwaith Kubernetes mewn cynhwysydd.

Sut i redeg Kubernetes ar EC2 Spot? Mae yna sawl opsiwn: defnyddiwch wasanaeth trydydd parti fel SpotInst (a elwir bellach yn "Spot", peidiwch â gofyn i mi pam), neu dim ond ychwanegu Spot AutoScalingGroup (ASG) i'ch clwstwr. Er enghraifft, dyma ddarn CloudFormation ar gyfer ASG Spot "optimized-capasiti" gyda mathau lluosog o enghreifftiau:

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"

Rhai nodiadau ar ddefnyddio Spot gyda Kubernetes:

  • Mae angen i chi drin terfyniadau Spot, er enghraifft trwy uno'r nod pan fydd yr enghraifft yn cael ei stopio
  • Zalando yn defnyddio fforch awtoraddio clystyrau swyddogol gyda blaenoriaethau cronfa nodau
  • Nodau sbot gellir ei orfodi derbyn “cofrestriadau” o lwythi gwaith i redeg yn Spot

Crynodeb

Rwy'n gobeithio y bydd rhai o'r offer a gyflwynir yn ddefnyddiol i chi i leihau eich bil cwmwl. Gallwch ddod o hyd i'r rhan fwyaf o gynnwys yr erthygl hefyd yn fy sgwrs yn DevOps Gathering 2019 ar YouTube ac mewn sleidiau.

Beth yw eich arferion gorau ar gyfer arbed costau cwmwl ar Kubernetes? Rhowch wybod i mi yn Twitter (@try_except_).

[1] Mewn gwirionedd, bydd llai na 3 vCPU yn parhau i fod yn ddefnyddiadwy gan fod trwybwn y nod yn cael ei leihau gan adnoddau system neilltuedig. Mae Kubernetes yn gwahaniaethu rhwng gallu nodau ffisegol ac adnoddau "a ddarperir" (Nodau Dyranadwy).

[2] Enghraifft o gyfrifiad: mae un enghraifft m5.large gyda 8 GiB o gof yn ~$84 ​​y mis (eu-central-1, On-Demand), h.y. mae blocio nod 1/8 tua ~$10/mis.

[3] Mae llawer mwy o ffyrdd o leihau eich bil EC2, megis Achosion Neilltuedig, Cynllun Arbedion, ac ati - ni fyddaf yn ymdrin â'r pynciau hynny yma, ond dylech yn bendant edrych i mewn iddynt!

Dysgwch fwy am y cwrs.

Ffynhonnell: hab.com

Ychwanegu sylw