Kuberneetese pilvekulude kokkuhoid AWS-is

Artikli tÔlge on ettevalmistatud kursuse alguseks Kubernetese pÔhine infrastruktuuri platvorm.

Kuberneetese pilvekulude kokkuhoid AWS-is

Kuidas sÀÀsta pilvekulusid Kubernetese kasutamisel? Ühte Ă”iget lahendust ei ole, kuid selles artiklis on kirjeldatud mitmeid tööriistu, mis aitavad teil tĂ”husamalt hallata ressursse ja vĂ€hendada pilvearvutamise kulusid.

Selle artikli olen kirjutannut silmas pidades Kubernetese AWS-is, kuid see kehtib (peaaegu) samamoodi ka teiste pilveteenuste pakkujate jaoks. Eeldan, et teie kluster(ite)l on juba seadistatud automaatne skaleerimine (cluster-autoscaler). Ressursside eemaldamine ja juurutamise suuruse vÀhendamine aitab sÀÀsta ainult siis, kui see samuti vÀhendab teie töökohti (EC2 instantsid).

Selles artiklis kÀsitletakse:

  • mittetĂ€iendavate ressursside puhastamine (kube-janitor)
  • koormuse vĂ€hendamine mitte tööajal (kube-downscaler)
  • horisontaalse automaatse skaleerimise (HPA) kasutamine,
  • ĂŒleliigse ressursi reservi vĂ€hendamine (kube-resource-report, VPA)
  • Spot instantside kasutamine

Mittekasutatavate ressursside puhastamine

Töötamine kiiresti muutuvas keskkonnas on suurepĂ€rane. Soovime, et tehnilised organisatsioonid kiireneksid.. Kiirelema tarkvara tarnimine tĂ€hendab ka rohkem PR-deploy'e, vaheversioone, prototĂŒĂŒpe ja analĂŒĂŒtilisi lahendusi. KĂ”ik on juurutatud Kuberneteses. Kes tahab aega kulutada, et kĂ€sitsi testijuhtimisi puhastada? On kerge unustada eemaldada nĂ€dalatevanune eksperiment. Pilveteenuse arve hakkab lĂ”puks kasvama, kuna unustame sulgeda:

Kuberneetese pilvekulude kokkuhoid AWS-is

(Henning Jacobs:
Elu:
(tsitaat) Cory Quinn:
MĂŒĂŒt: Teie AWS arve sĂ”ltub teie kasutajate arvust.
TÔde: Teie AWS arve sÔltub teie inseneride arvust.

Ivan Kurnosov (vastuseks):
Reaalne tĂ”de: Teie AWS arve sĂ”ltub asjade arvust, mille unustasite vĂ€lja lĂŒlitada/edeleteerida.)

Kubernetes Janitor (kube-janitor) aitab teie klastrit puhastada. Janitori konfiguratsioon on paindlik nii globaalse kui ka kohaliku kasutuse jaoks:

  • Kogu klastrile kehtivad ĂŒldised reeglid, mis vĂ”ivad mÀÀrata maksimaalse eluea (TTL - time-to-live) PR/testijuhtimiste jaoks.
  • Erinevaid ressursse saab annoteerida janitor/ttl abil, nĂ€iteks spike/prototĂŒĂŒbi automaatseks eemaldamiseks 7 pĂ€eva pĂ€rast.

Üldreeglid mÀÀratakse YAML-failis. Selle teekond edastatakse parameetri kaudu --rules-file kube-janitorile. Siin on nĂ€ide reeglist, et eemaldada kĂ”ik nimed, mis sisaldavad -pr- nimes kahe pĂ€eva pĂ€rast:

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

JÀrgmine nÀide mÀÀratleb application mÀrgi kasutamise Deployment ja StatefulSet pod'ides kÔigi uute Deploymentide/StatefulSet'ide jaoks aastast 2020, kuid samal ajal vÔimaldab testide sooritamist ilma selle mÀrgita nÀdala jooksul:

- id: require-application-label
  # eemaldada deployments ja statefulsets ilma "application" mÀrgita
  resources:
    - deployments
    - statefulsets
  # vt http://jmespath.org/specification.html
  jmespath: "!(spec.template.metadata.labels.application) && metadata.creationTimestamp > '2020-01-01'"
  ttl: 7d

Ajaliselt piiratud demoversioon 30 minutiks kasti, kus töötab kube-janitor:

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

Üks tĂ”usvate kulude allikaid on pĂŒsivolumeid (AWS EBS). Kui Kubernetes StatefulSet'i eemaldatakse, ei eemaldata selle pĂŒsivalt (PVC — PersistentVolumeClaim). Kasutamata EBS mahud vĂ”ivad kergesti pĂ”hjustada sadu dollareid kulusid kuus. Kubernetes Janitoril on funktsioon kasutamata PVC-de puhastamiseks. NĂ€iteks see reegel eemaldab kĂ”ik PVC-d, mis ei ole ĂŒles seatud mooduliga ja millele ei viita StatefulSet vĂ”i CronJob:

# ŃƒĐŽĐ°Đ»ĐžŃ‚ŃŒ ĐČсД PVC, ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐœĐ” ŃĐŒĐŸĐœŃ‚ĐžŃ€ĐŸĐČĐ°ĐœŃ‹ Đž ĐœĐ° ĐșĐŸŃ‚ĐŸŃ€Ń‹Đ” ĐœĐ” ŃŃŃ‹Đ»Đ°ŃŽŃ‚ŃŃ StatefulSets
- id: remove-unused-pvcs
  resources:
  - persistentvolumeclaims
  jmespath: "_context.pvc_is_not_mounted && _context.pvc_is_not_referenced"
  ttl: 24h

Kubernetes Janitor vĂ”ib aidata teil hoida oma klastrit „puhtana” ja vĂ€ltida aeglaselt kogunevaid pilvearvutamise kulusid. Üksikasjade jaoks juurutamise ja seadistamise kohta jĂ€rgige README kube-janitor.

Maha suurendamine mitte tööajal

Testimis- ja vahepealsed sĂŒsteemid vajavad tavaliselt tööd ainult tööajal. MĂ”ned tootmisrakendused, nagu back-office / haldustööriistad, vajavad samuti ainult piiratud kĂ€ttesaadavust ja vĂ”ivad öösel vĂ€lja lĂŒlitada.

Kubernetes Downscaler (kube-downscaler) vĂ”imaldab kasutajatel ja operaatoritel vĂ€hendada sĂŒsteemi suurust mitte tootmisajal. Deployments ja StatefulSets saab skaleerida null-replikaatidele. CronJobs vĂ”ivad olla peatatud. Kubernetes Downscaler seadistatakse kogu klastrile, ĂŒhele vĂ”i mitmele nimekontrollile vĂ”i ĂŒksikutele ressurssidele. Saate seadistada kas „seisakuaja“ vĂ”i vastupidi „töötamise aja“. NĂ€iteks, et maksimaalselt vĂ€hendada skaleerimist öösel ja nĂ€dalavahetustel:

image: hjacobs/kube-downscaler:20.4.3
args:
  - --interval=30
  # Àrge keelake infrastruktuuri komponente
  - --exclude-namespaces=kube-system,infra
  # Àrge keelake kube-downscalerit ja jÀtke Postgres Operator, et vÀlistatud andmebaase saaks hallata
  - --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

Siin on graafik klastrite töötavate sÔlmede skaleerimise kohta nÀdalavahetustel:

Kuberneetese pilvekulude kokkuhoid AWS-is

Skaleerimine ~13-lt 4 töökohtadele annab kindlasti tunda erinevust AWS arvel.

Aga mis siis, kui pean töötama klastris "seisaku ajal"? Teatud juurutamised saab igaveseks mÔÔtmisest vÀlja jÀtta, lisades annotatsiooni downscaler/exclude: true. Juurutamisi saab ajaliselt vÀlja jÀtta annotatsiooni downscaler/exclude-until abil, mille absoluutne ajamÀrk on formaadis AAAA-KK-PP TT:MM (UTC). Vajadusel saab kogu klastri tagasi mÔÔta, juurutades poodi koos annotatsiooniga downscaler/force-uptime, nÀiteks kÀivitades nginx mudeli:

kubectl run scale-up --image=nginx
kubectl annotate deploy scale-up janitor/ttl=1h # kustuta juurutamine tunni pÀrast
kubectl annotate pod $(kubectl get pod -l run=scale-up -o jsonpath="{.items[0].metadata.name}") downscaler/force-uptime=true

Vaata README kube-downscaler, kui teid huvitab juurutamise juhend ja tÀiendavad valikud.

Kasutage horisontaalset automaatskaalumist

Paljud rakendused/teenused tegelevad dĂŒnaamilise koormusgraafikuga: mĂ”nikord on nende moodulid seisakus ja mĂ”nikord töötavad nad tĂ€ievĂ”imsusega. PĂŒsiva podide pargi hoidmine maksimaalse tippkoormuse haldamiseks ei ole majanduslik. Kubernetes toetab horisontaalset automaatset kaalumist lĂ€bi ressursi HorizontalPodAutoscaler (HPA). CPU kasutamine on sageli hea nĂ€itaja skaleerimiseks:

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 on loonud komponendi, mis lihtsustab kasutajamÔÔtmete ĂŒhendamist skaleerimiseks: Kube Metrics Adaptori (kube-metrics-adapter) on universaalne mÔÔtmete adapter Kubernetes jaoks, mis suudab koguda ja teenindada kasutaja- ja vĂ€list mÔÔtmeid pod'ide horisontaalse automaatse skaleerimise jaoks. See toetab skaleerimist Prometheuse, SQS jĂ€rjekordade ja muude seadistuste pĂ”hiselt. NĂ€iteks, et skaleerida rakenduse poolt esitatud kasutajamÔÔdiku pĂ”hjal, mis on JSON kujul aadressil /metrics, kasutage:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: myapp-hpa
  annotations:
    # metric-config.../
    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

Horisontaalse automaasistumise seadistamine HPA abil peaks olema ĂŒks vaikeseade, et suurendada teenuste efektiivsust olekust sĂ”ltumatult. Spotify-l on esitluses oma kogemused ja soovitused HPA kohta: skaalake oma rakendusi, mitte oma rahakotti.

ressursside ĂŒlevarustamise vĂ€hendamine

Kubernetesi töökohustused mÀÀravad oma CPU/mÀlu vajadused "ressursside taotluste" (resource requests) kaudu. CPU ressursid mÔÔdetakse virtuaalsete tuumade vÔi sagedamini "millicores" (millikernad) kaudu, nÀiteks 500m tÀhendab 50% vCPU-st. MÀlu ressursid mÔÔdetakse baitides ning saab kasutada tavalisi sufikseid, nÀiteks 500Mi, mis tÀhendab 500 MB. Ressursside taotlused "broneerivad" mahtu töötlusÔlmedes, see tÀhendab, et moodul, mille CPU taotlus on 1000m, jÀÀb 4 virtuaalse CPU-ga sÔlmes, jÀtab ainult 3 virtuaalset CPU-d teistele moodulitele. [1]

Slack (ĂŒlejÀÀk) — on vahe taotletud ressursside ja tegeliku kasutamise vahel. NĂ€iteks pod, mis taotleb 2 GiB mĂ€lu, kuid kasutab ainult 200 MiB, omab ~ 1,8 GiB "ĂŒlejÀÀki" mĂ€lu. ÜlejÀÀk maksab raha. Üks pelgalt hinnang on, et 1 GiB ĂŒleliigset mĂ€lu maksab ~ 10 dollarit kuus. [2]

Kubernetesi ressursside aruanne (kube-resource-report) kuvab liigsed varud ja vÔib aidata teil mÀÀrata vÔimalikku kokkuhoidu:

Kuberneetese pilvekulude kokkuhoid AWS-is

Kubernetesi ressursside aruanne nĂ€itab ĂŒlemÀÀrasid, mille rakendus ja meeskond on kokku kogunud. See aitab leida kohti, kus ressursipĂ€ringut saab vĂ€hendada. Generitud HTML-raport annab ainult hetkepildi ressursi kasutamisest. Peaksite vaatama protsessori/mĂ€lu kasutamist ajas, et mÀÀrata sobivad ressursipĂ€ringud. Siin on Grafana diagramm „tĂŒĂŒpilise” kĂ”rgelt koormatud teenuse jaoks: kĂ”ik podid kasutavad oluliselt vĂ€hem kui 3 nĂ”utud protsessorituuma.

Kuberneetese pilvekulude kokkuhoid AWS-is

ProtsessoripÀringu vÀhendamine 3000m-lt ~400m-le vabastab ressursse teiste töökoormuste jaoks ja vÔimaldab klastrit vÀhendada.

„EC2 instantside keskmine protsessorikasutus kĂ”igub sageli ĂŒhesigitistes protsentides,” kirjutab Cory Quinn. Samal ajal kui EC2 Ă”ige suuruse mÀÀramine vĂ”ib olla halb otsus, muudatused mĂ”nedes Kubernetes'e ressursipĂ€ringutes YAML-failis on lihtsad ja vĂ”ivad tuua tohutu kokkuhoiu.

Aga kas me tÔeliselt tahame, et inimesed muudaksid vÀÀrtusi YAML-failides? Ei, masinad saavad seda palju paremini teha! Kubernetes Vertikaalne Pod Autoscaler (VPA) tegeleb just sellega: kohandab ressursipÀringuid ja piiranguid vastavalt töökoormusele. Siin on nÀide Prometheuse CPU pÀringute graafikust (peen sinine joon), mida on kohandatud VPA aja jooksul:

Kuberneetese pilvekulude kokkuhoid AWS-is

Zalando kasutab VPA kÔigis oma klastrites infrastruktuuri komponente jaoks. Mitte-kriitilised rakendused saavad samuti VPA-d kasutada.

Goldilocks Fairwindilt — see on tööriist, mis loob VPA iga nimede ruumi juuresoleku jaoks ja seejĂ€rel kuvab VPA soovituse oma juhtpaneelil. See aitab arendajatel seada Ă”iged CPU/mĂ€lu pĂ€ringud oma rakendustele:

Kuberneetese pilvekulude kokkuhoid AWS-is

Kirjutasin vĂ€ikesest blogipostitusest VPA-st 2019. aastal ja hiljuti arutati CNCF lĂ”ppkasutaja komitees VPA kĂŒsimust.

EC2 Spot instantside kasutamine

LĂ”puks, mis ei ole vĂ€hem oluline, saab AWS EC2 kulusid vĂ€hendada, kasutades Spot instantside kui Kubernetes tööÔliseid [3]. Spot instantsi on saadaval kuni 90% soodsamalt vĂ”rreldes nĂ”udmisest tulenevate hindadega. Kubernetes kĂ€ivitamine EC2 Spotil on hea kombinatsioon: peate mÀÀrama mitu erinevat instantsitĂŒĂŒpi kĂ”rgema saadavuse tagamiseks, st saate sama vĂ”i madalama hinna eest suurema sĂ”lme ning suurenenud mahtu saab kasutada Kubernetes'i konteineritöökoormustes.

Kuidas kĂ€ivitada Kubernetes EC2 Spotal? On mitmeid vĂ”imalusi: kasutada kolmanda osapoole teenust, nagu SpotInst (nĂŒĂŒd tuntud kui „Spot”, Ă€ra kĂŒsi, miks), vĂ”i lihtsalt lisada Spot AutoScalingGroup (ASG) oma klastrisse. NĂ€iteks siin on CloudFormation'i fragment „mahtude optimeeritud” Spot ASG jaoks mitme eksemplari tĂŒĂŒbiga:

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"

MÔned mÀrkmed Spot'i kasutamise kohta Kubernetes'ega:

  • peate haldama Spot'i lĂ”petamisi, nĂ€iteks sĂ”lme massimise kaudu instantsi seiskamisel
  • Zalando kasutab forki ametlikku klastrite automaatset skaleerimist sĂ”lmede basseinide prioriteetidega
  • Spot'i sĂ”lmed vĂ”ib nĂ”uda töötavate koormuste "registreeringute" vastuvĂ”tmist Spot'is

KokkuvÔte

Loodan, et leiate mÔned esitatud tööriistad kasulikuks oma pilvearvutuse arve vÀhendamiseks. Suurema osa artikli sisust leiate ka minu esitlusest DevOps Gathering 2019 YouTube'is ja slaidide kujul.

Millised on teie parimad praktikud Kubernetes'e pilvekulude kokkuhoiuks? Andke kindlasti teada Twitter (@try_except_).

[1] Tegelikult jÀÀb vĂ€hem kui 3 virtuaalset CPU-d kasutamiseks sobivaks, kuna sĂ”lme lĂ€bilaskevĂ”ime vĂ€heneb reserveeritud sĂŒsteemressursside tĂ”ttu. Kubernetes eristab fĂŒĂŒsilist sĂ”lme suutlikkust ja "eraldatud" ressursse (Node Allocatable).

[2] NĂ€ide arvutusest: ĂŒks m5.large instants 8 GiB mĂ€luga maksab umbes 84 USA dollarit kuus (eu-central-1, On-Demand), st 1/8 sĂ”lme lukustamine maksab umbes 10 USA dollarit kuus.

[3] On veel palju viise, kuidas oma EC2 arvet vĂ€hendada, nĂ€iteks reserveeritud instantsid, sÀÀstuplaan jne — ma ei kavatse neid teemasid siin kĂ€sitleda, kuid peaksite kindlasti uurima!

Uuri kursuse kohta lÀhemalt.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster