Kuidas sÀÀsta pilvekuludelt Kubernetesel AWS-is

Artikli tÔlge on koostatud kursuse alguse eelÔhtul Kubernetesi baasil olev infrastruktuuri platvorm.

Kuidas sÀÀsta pilvekuludelt Kubernetesel AWS-is

Kuidas vĂ€hendada pilvekasutuse kulusid Kubernetesega töötades? Ühte Ă”iget lahendust ei eksisteeri, kuid kĂ€esolevas artiklis on kirjeldatud mitmeid tööriistu, mis aitavad teil tĂ”husamalt hallata ressursse ja vĂ€hendada pilvearvutamise kulusid.

Kirjutasin selle artikli pilguga AWS-i Kubernetesile, kuid see kehtib (peaaegu) tÀpselt ka teiste pilveteenuse pakkujate puhul. Eeldan, et teie klastril(on) juba mÀÀratud automaatne skaleerimine (cluster-autoscaler). Ressursside eemaldamine ja juurutamise skaleerimise vÀhendamine aitab kokku hoida ainult siis, kui see vÀhendab ka teie töösÔlmede (EC2 instantside) arvu.

KÀesolevas artiklis kÀsitletakse:

, VPA)

Spot instantside kasutamine Kasutamata ressursside puhastamineTöötamine kiiresti muutuvas keskkonnas on suurepÀrane. Soovime, et tehnilised organisatsioonid

Kuidas sÀÀsta pilvekuludelt Kubernetesel AWS-is

kiireneksid
. Kiirem tarkvara Edastamine tĂ€hendab ka rohkem PR-i juurutusi, eelvaate keskkondi, prototĂŒĂŒpe ja analĂŒĂŒtilisi lahendusi. KĂ”ik juurutatakse Kuberneteses. Kes suudab leida aega kĂ€sitsi testimist vĂ€lja puhtaks teha? Eksperimendi eemaldamine nĂ€dal tagasi vĂ”ib lihtsalt ununeda. Pilvekulu tĂ”useb lĂ”puks, kuna unustame sulgeda:
(Henning Jacobs:
TÔde:
(tsitaat) Corey Quinn:

MĂŒĂŒt: Teie AWS arve sĂ”ltub teie kasutajate arvust.
TÔde: Teie AWS arve sÔltub teie inseneride arvust.

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

  • Kubernetes Janitor (kube-janitor) aitab teie klastrit puhastada. Janitori konfiguratsioon on paindlik nii globaalseteks kui ka lokaalseks kasutamiseks:
  • Eri ressursid vĂ”ivad olla mĂ€rgitud janitor/ttl abil, nĂ€iteks spike/prototĂŒĂŒbi automaatseks eemaldamiseks 7 pĂ€eva pĂ€rast.

Üldreeglid on mÀÀratletud YAML failis. Selle tee edastatakse parameetri kaudu --rules-file kube-janitorisse. Siin on nĂ€ide reeglist, mis eemaldab kĂ”ik nimesed, millel on -pr- kahe pĂ€eva pĂ€rast:

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

JÀrgmine nÀide reguleerib rakenduse sildi kasutamist Deployment ja StatefulSet podides kÔigi uute Deployments/StatefulSet jaoks 2020. aastal, kuid samas vÔimaldab nÀdalase testimise ilma selle sildita:

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

Kube-janitoriga töötavas klastris aja piiramine demode kÀivitamine 30 minutiks:

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

Teine kasvavate kulude allikas on pĂŒsivolĂŒĂŒmid (AWS EBS). Kubernetesi StatefulSet'i kustutamisel ei kustutata selle pĂŒsivolumeid (PVC — PersistentVolumeClaim). Kasutamata EBS-i mahutid vĂ”ivad kergesti pĂ”hjustada sadu dollareid kuus. Kubernetesi Janitoril on funktsioon, mis puhastab kasutamata PVC-sid. NĂ€iteks see reegel eemaldab kĂ”ik PVC-d, mida moodul ei ole mountinud ja millega StatefulSet vĂ”i CronJob ei viita:

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

Kubernetesi Janitor aitab teil hoida oma klastrit 'puhtana' ja vÀltida aeglaselt kumulatiivsete pilvandmete kulude tekkimist. Juhiste saamiseks juurutamise ja seadistamise kohta jÀrgige README kube-janitor.

Mastaabi vÀhendamine mitte-tööaegadel

Testimis- ja arendusĂŒsteemid on tavaliselt vajalikud ainult tööaegadel. MĂ”ned tootmisrakendused, nagu back-office/admin tööriistad, vajavad samuti vaid piiratud kĂ€ttesaadavust ja vĂ”ivad öösel vĂ€lja lĂŒlitada.

Kubernetes Downscaler (kube-downscaler) vĂ”imaldab kasutajatel ja operaatoritel vĂ€hendada sĂŒsteemi mahtu mitteaktiivsete perioodide jooksul. Deployments ja StatefulSets saab skaleerida null replikani. CronJobs saab peatada. Kubernetes Downscaler seadistatakse kogu klastrile, ĂŒhele vĂ”i mitmele nimeruumi vĂ”i eraldi ressursside jaoks. Saab seadistada kas „seisakuaja” vĂ”i vastupidi „tööaja”. NĂ€iteks, et minimeerida skaleerimist öösel ja nĂ€dalavahetustel:

image: hjacobs/kube-downscaler:20.4.3
args:
  - --interval=30
  # ei keelata infrastruktuuri komponente
  - --exclude-namespaces=kube-system,infra
  # jÀtab keelamata kube-downscaleri ning jÀtab Postgres operaatori, et haldada vÀlistatud andmebaase
  - --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 klastrite töövÔrkude skaleerimise graafik nÀdalavahetustel:

Kuidas sÀÀsta pilvekuludelt Kubernetesel AWS-is

Skaalate vÀhendamine ~13-lt 4-le töövÔrgule toob kindlasti suured erinevused AWS arvel.

Aga mida teha, kui mul on vaja töötada klastrite „seisakuajal”? Teatud deploymente saab igaveseks vĂ€lja jĂ€tta skaleerimisest, lisades annotatsiooni downscaler/exclude: true. Deploymente saab ajaliselt vĂ€lja jĂ€tta annotatsiooniga downscaler/exclude-until, kusjuures kuupĂ€ev ja kellaaeg peavad olema absoluutsetes ajatempos formadis YYYY-MM-DD HH:MM (UTC). Kui vajalik, saab kogu klastrit uuesti skaleerida, kĂ€ivitades puu annotatsiooniga downscaler/force-uptime, nĂ€iteks Nginx'i malliga:

kubectl run scale-up --image=nginx
kubectl annotate deploy scale-up janitor/ttl=1h # kustuta deployment 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 sind huvitab, kuidas rakendada ning lisavÔimalusi.

Kasutage horisontaalset automaatskalaarimist

Paljud rakendused/teenused tegelevad dĂŒnaamilise koormuse mustriga: mĂ”nikord nende moodulid seisavad ning mĂ”nikord töötavad nad tĂ€isvĂ”imsusel. Pideva puudepargi haldamine maksimumkoormuse korral ei ole majanduslik. Kubernetes toetab horisontaalset automaatset skaleerimist 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 lÔi komponente, et lihtsustada kohandatud mÔÔdikute integreerimist skaleerimise jaoks: Kube Metrics Adapter (kube-metrics-adapter) on universaalne mÔÔdikuadapter Kubernetes'e jaoks, mis suudab koguda ja teenindada kohandatud ja vÀliseid mÔÔdikuid horisontaalsete podide automaatseks skaleerimiseks. See toetab skaleerimist Prometheuse, SQS jÀrjekordade ja teiste seadistuste alusel. NÀiteks, et skaleerida rakenduse poolt esitatud kohandatud mÔÔdikut JSON formaadis /metrics, kasutage:

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

HPA kaudu horisontaalse automaatse skaleerimise seadistamine peaks olema ĂŒks vaikimisi toimingutest teenuste tĂ”hususe suurendamiseks oleku arvestamata. Spotify'l on esitluses nende kogemus ja soovitused HPA jaoks: skaalige oma rakendusi, mitte oma rahakotti.

ÜlemÀÀrase ressursireservi vĂ€henemine

Kubernetes'e töökoormused mÀÀravad nende vajadused CPU/mĂ€lu osas "ressursi taotlemise" kaudu. CPU ressursse mÔÔdetakse virtuaalsete tuumade vĂ”i sagedamini "millicores"'ides, nĂ€iteks 500m tĂ€hendab 50% vCPU-d. MĂ€luresursse mÔÔdetakse baitides ja tavapĂ€raseid suffikseid saab kasutada, nĂ€iteks 500Mi, mis tĂ€hendab 500 megabaiti. Ressursi taotlused „lukustavad“ mahu tööjaamadele, st 1000m CPU taotlusega moodul 4 virtuaalse CPU-ga sĂ”lmes jĂ€tab ainult 3 virtuaalset CPU-d teistele moodulitele. [1]

Slack (ĂŒlemÀÀrane reserveerimine) — see on erinevus nĂ”utud ressursside ja tegeliku kasutamise vahel. NĂ€iteks pood, mis nĂ”uab 2 GiB mĂ€lu, kuid kasutab ainult 200 MiB, omab ~ 1,8 GiB "ĂŒlejÀÀki". ÜlejÀÀk maksab raha. Ligikaudne hinnang on, et 1 GiB ĂŒlejÀÀgi hind on ~ 10 dollarit kuus. [2]

Kubernetes'i Ressursside Aruanne (kube-resource-report) kuvab liigsed reservid ja vÔib aidata teil leida sÀÀstmise potentsiaali:

Kuidas sÀÀsta pilvekuludelt Kubernetesel AWS-is

Kubernetes'i Ressursside Aruanne nĂ€itab ĂŒlejÀÀki, mille on agreggeerinud rakendus ja meeskond. See aitab leida kohti, kus ressursi nĂ”udmisi vĂ”ib vĂ€hendada. Genereeritud HTML aruanne pakub ainult ressursi kasutamise hetkeseisu. Te peaksid vaatama protsessori/mĂ€lu kasutamist ajas, et mÀÀrata adekvaatsed ressursi nĂ”udmised. Siin on Grafana diagramm "tĂŒĂŒpilise" teenuse jaoks, millel on suur koormus protsessorile: kĂ”ik podid kasutavad oluliselt vĂ€hem kui 3 nĂ”utud tuuma:

Kuidas sÀÀsta pilvekuludelt Kubernetesel AWS-is

Protsessori nÔudmise vÀhendamine 3000m kuni ~400m vabastab ressursid teiste koormuste jaoks ja vÔimaldab klastrit vÀhendada.

"Keskmine EC2 instantside protsessori kasutamine kĂ”igub sageli ĂŒhesĂ”nalistes protsentides," kirjutab Cory Quinn.. Kuigi EC2 Ă”ige suuruse hindamine vĂ”ib olla kehv otsus, siis mĂ”ned Kubernetes'e ressursi nĂ”udmiste muutmine YAML failis toimub lihtsalt ja vĂ”ib tuua tohutut kokkuhoidu.

Aga kas me tÔeliselt tahame, et inimesed muudaksid vÀÀrtusi YAML failides? Ei, masinad saavad seda palju paremini teha! Kubernetes Vertical Pod Autoscaler (VPA) tegeleb sellega: kohandab ressursi nÔudmisi ja piiranguid vastavalt koormusele. Siin on nÀide Prometheuse protsessori nÔudmiste graafikust (Ôhuke sinine joon), mille VPA on kohandanud ajas:

Kuidas sÀÀsta pilvekuludelt Kubernetesel AWS-is

Zalando kasutab VPA kÔigis oma klastrites infrastruktuuri komponente. Mitte-kriitilised rakendused vÔivad samuti kasutada VPA.

Goldilocks Fairwindilt on tööriist, mis loob iga juurutamise jaoks VPA nimetusruumis ja seejÀrel kuvab soovituse VPA oma armatuurlaud.

Kuidas sÀÀsta pilvekuludelt Kubernetesel AWS-is

Olen kirjutanud vÀikese blogipostituse VPA-st 2019. aastal ja hiljuti CNCF lÔppkasutaja kogukonnas arutati VPA teemat.

EC2 Spot instantside kasutamine.

LĂ”puks, mis ei ole vĂ€hem oluline, on AWS EC2 kulusid vĂ”imalik vĂ€hendada, kasutades Spot-instance'e Kubernetes'i töövĂ”rkudena. [3]. Spot-instance'id on saadaval kuni 90% soodsamalt vĂ”rreldes nĂ”udmise hindadega. Kubernetes'i kĂ€ivitamine EC2 Spot'il on hea kombinatsioon: peate mÀÀrama mitu erinevat instance'i tĂŒĂŒpi kĂ”rgema saadavuse tagamiseks, see tĂ€hendab, et saate suurema node'i sama vĂ”i madalama hinna eest ning suurenenud mahtu saab kasutada Kubernetes'i konteineritöökoormuste jaoks.

Kuidas kĂ€ivitada Kubernetes EC2 Spot'il? On mitu vĂ”imalust: kasutada kolmanda osapoole teenust nagu SpotInst (nĂŒĂŒd nimetatakse lihtsalt 'Spot', mitte kĂŒsi, miks), vĂ”i lihtsalt lisada Spot AutoScalingGroup (ASG) oma klastrisse. NĂ€iteks siin on CloudFormation'i fragment 'kapatsiteed optimeeritud' Spot ASG jaoks mitme instance'i 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Àrkused Spot'i kasutamise kohta Kubernetes'ega:

  • Peate tegelema Spot'i lĂ”petamistega, nĂ€iteks node'i mahapanemise kaudu, kui instance'i peatatakse.
  • Zalando kasutab fork ametlikku klastrite automaatset skaleerimist, kus on node'i basseinide prioriteedid.
  • Spot node'id saab sundida aktsepteerima töökoormuste 'registreerimisi' Spot'is kĂ€ivitamiseks.

Elulookirjeldus

Loodan, et leiate mÔned esitatud tööriistad kasulikuks oma pilveteenuste arve vÀhendamiseks. Enamik artikli sisust on saadaval ka minu esitluses DevOps Gathering 2019 YouTube'is ja slaidide kujul. Millised on teie parimad praktikad pilvekulude kokkuhoiuks Kubernetes'es? Andke teada.

Twitteris (@try_except_) Twitter (@try_except_).

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

[2] NĂ€ide arvutusest: ĂŒks m5.large eksemplar, millel on 8 GiB mĂ€lu, maksab ~84 USA dollarit kuus (eu-central-1, On-Demand), st 1/8 sĂ”lme kinni hoidmine maksab umbes ~10 USA dollarit kuus.

[3] On veel palju vĂ”imalusi oma EC2 arvet vĂ€hendada, nĂ€iteks reserveeritud eksemplarid, sÀÀstuplaanid jt – ma ei hakka neid teemasid siin kĂ€sitlema, kuid kindlasti peaksite neist uurima!

Tutvu kursusega lÀhemalt.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster