Ietaupiet uz Kubernetes mākoņa izmaksām AWS

Raksta tulkojums tika sagatavots kursu sākuma priekŔvakarā "Infrastruktūras platforma, kuras pamatā ir Kubernetes".

Ietaupiet uz Kubernetes mākoņa izmaksām AWS

Kā ietaupÄ«t uz mākoņa izmaksām, strādājot ar Kubernetes? Nav viena pareizā risinājuma, taču Å”ajā rakstā ir aprakstÄ«ti vairāki rÄ«ki, kas var palÄ«dzēt efektÄ«vāk pārvaldÄ«t resursus un samazināt mākoņdatoÅ”anas izmaksas.

Es uzrakstÄ«ju Å”o rakstu, paturot prātā Kubernetes for AWS, taču tas (gandrÄ«z) tieÅ”i tāpat attieksies uz citiem mākoņa pakalpojumu sniedzējiem. Es pieņemu, ka jÅ«su klasterim(-iem) jau ir konfigurēta automātiskā mērogoÅ”ana (klasteris-autoscaler). Resursu noņemÅ”ana un izvietoÅ”anas samazināŔana ietaupÄ«s naudu tikai tad, ja samazināsies arÄ« darbinieku mezglu parks (EC2 gadÄ«jumi).

Å is raksts aptvers:

  • iztÄ«rÄ«t neizmantotos resursus (kube-sētnieks)
  • Samaziniet mērogoÅ”anu ārpus darba laika (kube-downscaler)
  • izmantojot horizontālo automātisko mērogoÅ”anu (HPA),
  • pārmērÄ«gas resursu rezervÄ“Å”anas samazināŔana (kube-resursa ziņojums, VPA)
  • izmantojot Spot gadÄ«jumus

Neizmantoto resursu tīrīŔana

Strādāt straujā vidē ir lieliski. Mēs vēlamies tehnoloÄ£iju organizācijas paātrināta. Ātrāka programmatÅ«ras piegāde nozÄ«mē arÄ« vairāk PR izvietoÅ”anas, priekÅ”skatÄ«juma vides, prototipu un analÄ«tikas risinājumu. Viss ir izvietots Kubernetes. Kam ir laiks manuāli notÄ«rÄ«t testa izvietojumus? Ir viegli aizmirst par nedēļu veca eksperimenta dzÄ“Å”anu. Mākoņa rēķins pieaugs, jo aizmirsām aizvērt:

Ietaupiet uz Kubernetes mākoņa izmaksām AWS

(Henings Džeikobss:
Žiza:
(pēdas) Korijs Kvins:
Mīts: jūsu AWS konts ir atkarīgs no jūsu lietotāju skaita.
Fakts: jūsu AWS rezultāts ir atkarīgs no jūsu inženieru skaita.

Ivans Kurnosovs (atbildē):
Patiess fakts: jūsu AWS rezultāts ir atkarīgs no to lietu skaita, kuras esat aizmirsis atspējot/dzēst.)

Kubernetes sētniece (kube-janitor) palÄ«dz iztÄ«rÄ«t jÅ«su kopu. Sētnieka konfigurācija ir elastÄ«ga gan globālai, gan vietējai lietoÅ”anai:

  • Klastera mēroga noteikumi var definēt maksimālo darbÄ«bas laiku (TTL) PR/testa izvietoÅ”anai.
  • AtseviŔķus resursus var anotēt ar janitor/ttl, piemēram, lai pēc 7 dienām automātiski noņemtu smaili/prototipu.

VispārÄ«gi noteikumi ir definēti YAML failā. Tās ceļŔ tiek izvadÄ«ts caur parametru --rules-file in kube-sētnieks. Å eit ir kārtulas piemērs, lai noņemtu visas nosaukumvietas -pr- vārdā pēc divām dienām:

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

Å is piemērs regulē lietojumprogrammas etiÄ·etes izmantoÅ”anu izvietoÅ”anas un StatefulSet blokos visiem jaunajiem izvietojumiem/StatefulSets 2020. gadā, taču tajā paŔā laikā atļauj nedēļu veikt testus bez Ŕīs etiÄ·etes.

- 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

Palaidiet ierobežotu laika demonstrāciju 30 minÅ«tes klasterÄ«, kurā darbojas kube-janitor:

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

Vēl viens izmaksu pieauguma avots ir pastāvÄ«gie apjomi (AWS EBS). DzÄ“Å”ot Kubernetes StatefulSet, netiek dzēsti tā pastāvÄ«gie sējumi (PVC ā€” PersistentVolumeClaim). Neizmantotie EBS apjomi var viegli radÄ«t izmaksas simtiem dolāru mēnesÄ«. Kubernetes Janitor ir funkcija, lai notÄ«rÄ«tu neizmantotos PVC. Piemēram, Å”is noteikums noņems visus PVC, kas nav uzstādÄ«ti ar moduli un uz kuriem nav atsauces StatefulSet vai CronJob:

# уŠ“Š°Š»Šøть Š²ŃŠµ PVC, ŠŗŠ¾Ń‚Š¾Ń€Ń‹Šµ Š½Šµ сŠ¼Š¾Š½Ń‚ŠøрŠ¾Š²Š°Š½Ń‹ Šø Š½Š° ŠŗŠ¾Ń‚Š¾Ń€Ń‹Šµ Š½Šµ ссыŠ»Š°ŃŽŃ‚ся StatefulSets
- id: remove-unused-pvcs
  resources:
  - persistentvolumeclaims
  jmespath: "_context.pvc_is_not_mounted && _context.pvc_is_not_referenced"
  ttl: 24h

Kubernetes Janitor var palÄ«dzēt jums uzturēt kopu tÄ«ru un novērst mākoņdatoÅ”anas izmaksu lēnu uzkrāŔanos. IzvērÅ”anas un konfigurācijas norādÄ«jumus skatiet tālāk README kube-sētnieks.

Samaziniet mērogoÅ”anu ārpus darba laika

TestÄ“Å”anas un inscenÄ“Å”anas sistēmas parasti ir nepiecieÅ”amas darbÄ«bai tikai darba laikā. Dažām ražoÅ”anas lietojumprogrammām, piemēram, biroja/administratora rÄ«kiem, ir nepiecieÅ”ama tikai ierobežota pieejamÄ«ba, un tās var atspējot vienas nakts laikā.

Kubernetes Downscaler (kube-downscaler) ļauj lietotājiem un operatoriem samazināt sistēmas apjomu ārpus darba laika. Izvietojumi un StatefulSets var tikt mērogoti lÄ«dz nullei replikām. CronJobs var tikt apturēts. Kubernetes Downscaler ir konfigurēts visam klasterim, vienai vai vairākām nosaukumvietām vai atseviŔķiem resursiem. Varat iestatÄ«t ā€œdÄ«kstāves laikuā€ vai, gluži pretēji, ā€œdarba laikuā€. Piemēram, lai pēc iespējas samazinātu mērogoÅ”anu naktÄ«s un brÄ«vdienās:

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

Å eit ir grafiks klasteru darbinieku mezglu mērogoÅ”anai nedēļas nogalēs:

Ietaupiet uz Kubernetes mākoņa izmaksām AWS

Samazinot no ~13 lÄ«dz 4 darbinieku mezgliem, noteikti ir ievērojama atŔķirÄ«ba jÅ«su AWS rēķinā.

Bet ko darÄ«t, ja man ir jāstrādā klastera "dÄ«kstāves" laikā? Dažus izvietojumus var neatgriezeniski izslēgt no mērogoÅ”anas, pievienojot samazināŔanas/izslēgÅ”anas: patieso anotāciju. Izvietojumus var Ä«slaicÄ«gi izslēgt, izmantojot samazināŔanas/izslēgÅ”anas lÄ«dz anotāciju ar absolÅ«tu laikspiedolu formātā GGGG-MM-DD HH:MM (UTC). Ja nepiecieÅ”ams, visu kopu var samazināt, izvietojot podziņu ar anotāciju downscaler/force-uptime, piemēram, palaižot 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

redzēt README kube-downscaler, ja jÅ«s interesē izvietoÅ”anas instrukcijas un papildu iespējas.

Izmantojiet horizontālo automātisko mērogoÅ”anu

Daudzas lietojumprogrammas/pakalpojumi nodarbojas ar dinamisku ielādes modeli: dažreiz to moduļi ir dÄ«kstāvē, un dažreiz tie darbojas ar pilnu jaudu. PastāvÄ«ga pākstu parka darbÄ«ba, lai tiktu galā ar maksimālo maksimālo slodzi, nav ekonomiska. Kubernetes atbalsta horizontālo automātisko mērogoÅ”anu visā resursā HorizontalPodAutoscaler (HPA). CPU lietojums bieži ir labs mērogoÅ”anas rādÄ«tājs:

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 ir izveidojis komponentu, lai viegli savienotu pielāgotus mērogoÅ”anas rādÄ«tājus: Kube metrikas adapteris (kube-metrics-adapter) ir vispārējs Kubernetes metrikas adapteris, kas var apkopot un apkalpot pielāgotas un ārējas metrikas aplikumu horizontālai automātiskai mērogoÅ”ana. Tā atbalsta mērogoÅ”anu, pamatojoties uz Prometheus metriku, SQS rindām un citiem iestatÄ«jumiem. Piemēram, lai mērogotu izvietoÅ”anu uz pielāgotu metriku, ko pati lietojumprogramma attēlo kā JSON mapē /metrics, izmantojiet:

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

Horizontālās automātiskās mērogoÅ”anas konfigurÄ“Å”anai ar HPA vajadzētu bÅ«t vienai no noklusējuma darbÄ«bām, lai uzlabotu bezvalsts pakalpojumu efektivitāti. Spotify ir prezentācija ar savu pieredzi un ieteikumiem HPA: mērogojiet savu izvietoÅ”anu, nevis savu maku.

Samaziniet resursu pārsniegŔanu

Kubernetes darba slodzes nosaka viņu CPU/atmiņas vajadzÄ«bas, izmantojot ā€œresursu pieprasÄ«jumusā€. Centrālā procesora resursi tiek mērÄ«ti virtuālajos kodolos vai biežāk ā€œmilikodosā€, piemēram, 500 m nozÄ«mē 50% vCPU. Atmiņas resursi tiek mērÄ«ti baitos, un var izmantot parastos sufiksus, piemēram, 500Mi, kas nozÄ«mē 500 megabaitus. Resursu pieprasÄ«jumi "bloķē" darbinieku mezglu jaudu, kas nozÄ«mē, ka pods ar 1000 m CPU pieprasÄ«jumu mezglā ar 4 vCPU atstās tikai 3 vCPU pieejamus citiem podiem. [1]

Atslābums (liekā rezerve) ir atŔķirÄ«ba starp pieprasÄ«tajiem resursiem un faktisko izmantoÅ”anu. Piemēram, podam, kas pieprasa 2 GiB atmiņu, bet izmanto tikai 200 MiB, ir ~1,8 GiB ā€œliekāsā€ atmiņas. PārmērÄ«ba maksā naudu. Var aptuveni aprēķināt, ka 1 GiB liekas atmiņas maksā ~10 USD mēnesÄ«. [2]

Kubernetes resursu pārskats (kube-resource-report) parāda liekās rezerves un var palīdzēt noteikt ietaupījumu potenciālu:

Ietaupiet uz Kubernetes mākoņa izmaksām AWS

Kubernetes resursu pārskats parāda pārpalikumu, kas apkopots pēc lietojumprogrammas un komandas. Tas ļauj jums atrast vietas, kur var samazināt resursu pieprasÄ«jumu. Ä¢enerētais HTML pārskats sniedz tikai resursu izmantoÅ”anas momentuzņēmumu. Lai noteiktu atbilstoÅ”us resursu pieprasÄ«jumus, jums vajadzētu apskatÄ«t CPU/atmiņas lietojumu laika gaitā. Å eit ir Grafana diagramma par "tipisku" CPU intensÄ«vu pakalpojumu: visi podi izmanto ievērojami mazāk nekā 3 pieprasÄ«tie CPU kodoli:

Ietaupiet uz Kubernetes mākoņa izmaksām AWS

CPU pieprasÄ«juma samazināŔana no 3000 m lÄ«dz ~ 400 m atbrÄ«vo resursus citām darba slodzēm un ļauj klasterim bÅ«t mazākam.

"EC2 gadÄ«jumu vidējais CPU lietojums bieži vien svārstās viencipara procentu diapazonā." raksta Korijs Kvins. Kamēr par EC2 pareizā izmēra noteikÅ”ana var bÅ«t slikts lēmumsDažu Kubernetes resursu vaicājumu mainÄ«Å”ana YAML failā ir vienkārÅ”a un var radÄ«t milzÄ«gus ietaupÄ«jumus.

Bet vai mēs tieŔām vēlamies, lai cilvēki mainÄ«tu vērtÄ«bas YAML failos? Nē, maŔīnas to var izdarÄ«t daudz labāk! Kubernetes Vertikālais pods Autoscaler (VPA) dara tieÅ”i to: pielāgo resursu pieprasÄ«jumus un ierobežojumus atbilstoÅ”i darba slodzei. Tālāk ir sniegts Prometheus CPU pieprasÄ«jumu diagrammas paraugs (plāna zila lÄ«nija), ko laika gaitā pielāgojis VPA:

Ietaupiet uz Kubernetes mākoņa izmaksām AWS

Zalando izmanto VPA visās savās kopās infrastruktūras komponentiem. VPA var izmantot arī nekritiskās lietojumprogrammas.

Goldilocks no Fairwind ir rÄ«ks, kas izveido VPA katrai izvietoÅ”anai nosaukumvietā un pēc tam savā informācijas panelÄ« parāda VPA ieteikumu. Tas var palÄ«dzēt izstrādātājiem iestatÄ«t pareizos CPU/atmiņas pieprasÄ«jumus savām lietojumprogrammām:

Ietaupiet uz Kubernetes mākoņa izmaksām AWS

Es uzrakstÄ«ju mazu emuāra ieraksts par VPA 2019. gadā un nesen CNCF galalietotāju kopiena apsprieda VPA problēmu.

Izmantojot EC2 vietas gadījumus

Visbeidzot, AWS EC2 izmaksas var samazināt, izmantojot Spot gadÄ«jumus kā Kubernetes darbinieku mezglus [3]. Vietējie gadÄ«jumi ir pieejami ar atlaidi lÄ«dz pat 90%, salÄ«dzinot ar cenām pēc pieprasÄ«juma. Kubernetes palaiÅ”ana EC2 Spot ir laba kombinācija: jums ir jānorāda vairāki dažādi gadÄ«jumu veidi, lai nodroÅ”inātu augstāku pieejamÄ«bu, kas nozÄ«mē, ka varat iegÅ«t lielāku mezglu par tādu paÅ”u vai zemāku cenu, un palielināto jaudu var izmantot konteinerizētās Kubernetes darba slodzes.

Kā palaist Kubernetes vietnē EC2 Spot? Ir vairākas iespējas: izmantojiet treŔās puses pakalpojumu, piemēram, SpotInst (tagad to sauc par "Spot", nejautājiet man, kāpēc) vai vienkārÅ”i pievienojiet savai klasterim Spot AutoScalingGroup (ASG). Piemēram, Å”eit ir CloudFormation fragments ā€œoptimizētai kapacitāteiā€ Spot ASG ar vairākiem gadÄ«jumu tipiem:

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"

Dažas piezīmes par Spot lietoŔanu ar Kubernetes:

  • Jums ir jārÄ«kojas ar Spot izbeigÅ”anu, piemēram, apvienojot mezglu, kad instance tiek apturēta
  • Zalando izmanto dakÅ”a oficiālā klasteru automātiskā mērogoÅ”ana ar mezglu kopas prioritātēm
  • Vietas mezgli var piespiest pieņemt darba slodžu ā€œreÄ£istrācijasā€, lai tās darbotos Spotā

Kopsavilkums

Ceru, ka daži no piedāvātajiem rÄ«kiem noderēs mākoņa rēķina samazināŔanai. Lielāko daļu raksta satura varat atrast arÄ« vietnē mana runa DevOps Gathering 2019 vietnē YouTube un slaidos.

Kāda ir jÅ«su labākā prakse mākoņa izmaksu ietaupÄ«Å”anai vietnē Kubernetes? LÅ«dzu, dariet man zināmu plkst Twitter (@try_except_).

[1] Faktiski mazāk nekā 3 vCPU paliks izmantojami, jo mezgla caurlaidspēju samazina rezervētie sistēmas resursi. Kubernetes izŔķir fizisko mezglu jaudu un "nodroÅ”inātos" resursus (PieŔķirams mezgls).

[2] Aprēķina piemērs: viena m5.liela instance ar 8 GiB atmiņu ir ~84 $ mēnesÄ« (eu-central-1, On-Demand), t.i. 1/8 mezgla bloÄ·Ä“Å”ana ir aptuveni USD 10 mēnesÄ«.

[3] Ir vēl daudzi veidi, kā samazināt EC2 rēķinu, piemēram, rezervētie gadÄ«jumi, taupÄ«Å”anas plāns u.c. ā€“ Ŕīs tēmas es Å”eit neapskatÄ«Å”u, taču jums tās noteikti vajadzētu izpētÄ«t!

Uzziniet vairāk par kursu.

Avots: www.habr.com

Pievieno komentāru