Spuert op Kubernetes Cloud Käschten op AWS

D'Iwwersetzung vum Artikel gouf um Virowend vum Start vum Cours virbereet "Infrastruktur Plattform baséiert op Kubernetes".

Spuert op Kubernetes Cloud Käschten op AWS

Wéi spueren ech op Cloud Käschten wann Dir mat Kubernetes schafft? Et gëtt keng eenzeg richteg Léisung, awer dësen Artikel beschreift verschidden Tools déi Iech hëllefe kënnen Är Ressourcen méi effektiv ze managen an Är Cloud Computing Käschten ze reduzéieren.

Ech hunn dësen Artikel mat Kubernetes fir AWS am Kapp geschriwwen, awer et gëlt (bal) genau déiselwecht Manéier fir aner Cloud Provider. Ech huelen un datt Äre Stärekoup scho Autoskaléierung konfiguréiert ass (Cluster-Autoscaler). Ressourcen ewechzehuelen an Är Détachement erofzebauen wäert Iech nëmme Sue spueren wann et och Är Flott vun Aarbechternoden (EC2 Instanzen) reduzéiert.

Dësen Artikel wäert decken:

  • net benotzte Ressourcen botzen (kube-Junior)
  • Reduzéieren Skala während Net-Aarbechtszäiten (kube-downscaler)
  • benotzt horizontal Autoscaling (HPA),
  • Reduktioun vun exzessive Ressource Reservatioun (kube-resource-report, VPA)
  • benotzt Spot Instanzen

Onbenotzt Ressourcen botzen

An engem séieren Ëmfeld ze schaffen ass super. Mir wëllen Tech Organisatiounen beschleunegt. Méi séier Software Liwwerung bedeit och méi PR-Deployment, Virschau-Ëmfeld, Prototypen an Analyseléisungen. Alles gëtt op Kubernetes ofgesat. Wien huet d'Zäit fir manuell Testdeployementer ze botzen? Et ass einfach ze vergiessen e Woch-al Experiment ze läschen. D'Wollekenrechnung wäert schlussendlech eropgoen wéinst eppes wat mir vergiess hunn zouzemaachen:

Spuert op Kubernetes Cloud Käschten op AWS

(Henning Jacobs:
Zhiza:
(Zitater) Corey Quinn:
Mythos: Ären AWS Kont ass eng Funktioun vun der Unzuel vun de Benotzer déi Dir hutt.
Tatsaach: Ären AWS Score ass eng Funktioun vun der Unzuel vun den Ingenieuren déi Dir hutt.

Ivan Kurnosov (an Äntwert):
Real Tatsaach: Ären AWS Score ass eng Funktioun vun der Unzuel u Saachen déi Dir vergiess hutt ze deaktivéieren / ze läschen.)

Kubernetes Janitor (kube-janitor) hëlleft Äre Stärekoup ze botzen. D'Janitor Konfiguratioun ass flexibel fir béid global a lokal Benotzung:

  • Cluster-breet Regele kënnen déi maximal Zäit-ze-Liewe (TTL) fir PR / Test-Deployment definéieren.
  • Eenzel Ressourcen kënne mat Janitor / ttl annotéiert ginn, zum Beispill fir automatesch de Spike / Prototyp no 7 Deeg ze läschen.

Allgemeng Regele sinn an der YAML Datei definéiert. Säi Wee gëtt duerch de Parameter passéiert --rules-file an kube-Junior. Hei ass eng Beispill Regel fir all Nummraim ze läschen mat -pr- am Numm no zwee Deeg:

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

Dat folgend Beispill reguléiert d'Benotzung vum Applikatiounslabel op den Deployment a StatefulSet Pods fir all nei Deployments / StatefulSets am Joer 2020, awer erlaabt gläichzäiteg d'Ausféierung vun Tester ouni dëse Label fir eng Woch:

- 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

Laf eng Zäitlimitéiert Demo fir 30 Minutten op engem Cluster deen kube-janitor leeft:

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

Eng aner Quell fir d'Erhéijung vun de Käschten ass persistent Volumen (AWS EBS). E Kubernetes StatefulSet läschen läscht seng persistent Bänn net (PVC - PersistentVolumeClaim). Onbenotzt EBS Bänn kënne ganz einfach zu Käschte vun Honnerte vun Dollar pro Mount resultéieren. Kubernetes Janitor huet eng Feature fir onbenotzt PVCs ze botzen. Zum Beispill wäert dës Regel all PVCen ewechhuelen déi net vun engem Modul montéiert sinn an déi net vun engem StatefulSet oder CronJob referenzéiert sinn:

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

Kubernetes Janitor kann Iech hëllefen Äre Stärekoup propper ze halen an ze verhënneren datt d'Cloud Computing Käschten lues opstapelen. Fir Installatiouns- a Konfiguratiounsinstruktiounen, befollegt VIRLIESEN kube-Junior.

Reduzéieren Skala während Net-Aarbechtszäiten

Test- an Inszenéierungssystemer sinn typesch erfuerderlech nëmme während der Aarbechtszäit ze bedreiwen. E puer Produktiounsapplikatiounen, wéi Backoffice / Admin Tools, erfuerderen och nëmme limitéiert Disponibilitéit a kënnen iwwer Nuecht behënnert ginn.

Kubernetes Downscaler (kube-downscaler) erlaabt d'Benotzer an d'Operateuren de System während net-Aarbechtszäiten ze reduzéieren. Deployments a StatefulSets kënnen op Null Repliken skaléieren. CronJobs kënne suspendéiert ginn. Kubernetes Downscaler ass fir e ganze Cluster konfiguréiert, een oder méi Nummraim oder individuell Ressourcen. Dir kënnt entweder "Idle Zäit" oder, am Géigendeel, "Aarbechtszäit" astellen. Zum Beispill, fir d'Skaléierung sou vill wéi méiglech während Nuechten a Weekender ze reduzéieren:

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

Hei ass eng Grafik fir d'Skaléierung vun Cluster Aarbechter Node um Weekend:

Spuert op Kubernetes Cloud Käschten op AWS

Ofbau vun ~ 13 op 4 Aarbechter Node mécht sécher e merkbare Ënnerscheed an Ärer AWS Rechnung.

Awer wat wann ech muss während Cluster "Downtime" schaffen? Verschidden Deployementer kënne permanent aus der Skaléierung ausgeschloss ginn andeems Dir den Downscaler / Exclude: richteg Annotatioun bäidréit. Deployementer kënnen temporär ausgeschloss ginn andeems Dir den Downscaler/Exclude-Bis Annotatioun mat engem absoluten Zäitstempel am Format JJJJ-MM-DD HH:MM (UTC) benotzt. Wann néideg, kann de ganze Stärekoup zréckgeschalt ginn andeems Dir e Pod mat der Annotatioun ofsetzt downscaler/force-uptime, zum Beispill, andeems Dir nginx eidel lancéiert:

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

Kuckt VIRLIESEN kube-downscaler, wann Dir interesséiert sidd fir Installatiounsinstruktiounen an zousätzlech Optiounen.

Benotzt horizontal Autoscaling

Vill Applikatiounen / Servicer beschäftegen sech mat engem dynamesche Luedemuster: heiansdo sinn hir Moduler idle, an heiansdo funktionnéiere se voller Kapazitéit. D'Operatioun vun enger permanenter Flott vu Pods fir maximal Spëtzbelaaschtung ze këmmeren ass net ekonomesch. Kubernetes ënnerstëtzt horizontal Auto-Scaling iwwer eng Ressource HorizontalPodAutoscaler (HPA). CPU Notzung ass dacks e gudde Indikator fir Skaléieren:

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 huet e Komponent erstallt fir einfach personaliséiert Metriken fir Skaléieren ze verbannen: Kube Metric Adapter (kube-metrics-adapter) ass e generesche Metrikadapter fir Kubernetes, dee personaliséiert an extern Metriken fir horizontal Autoskaléierung vu Pods sammelen a servéiere kann. Et ënnerstëtzt Skaléieren baséiert op Prometheus Metriken, SQS Schlaangen an aner Astellungen. Zum Beispill, fir Är Détachement op eng personaliséiert Metrik ze skaléieren, representéiert vun der Applikatioun selwer als JSON an / Metrik benotzt:

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

D'Konfiguratioun vun der horizontaler Autoskaléierung mat HPA sollt eng vun de Standardaktioune sinn fir d'Effizienz fir stateless Servicer ze verbesseren. Spotify huet eng Presentatioun mat hirer Erfahrung an Empfehlungen fir HPA: Skala Är Détachementer, net Äre Portemonnaie.

Reduzéieren Ressource Iwwerbuchung

Kubernetes Aarbechtslaascht bestëmmen hir CPU / Erënnerung Bedierfnesser duerch "Ressource Ufroen." CPU Ressourcen ginn a virtuelle Käre gemooss oder méi heefeg a "Millicores", zum Beispill 500m implizéiert 50% vCPU. Memory Ressourcen ginn a Bytes gemooss, a gemeinsame Suffixe kënne benotzt ginn, sou wéi 500Mi, dat heescht 500 Megabytes. Ressource freet "Spär" Kapazitéit op Aarbechternoden, dat heescht e Pod mat enger 1000m CPU Ufro op engem Node mat 4 vCPUs léisst nëmmen 3 vCPUs fir aner Pods verfügbar. [1]

Slack (iwwerschësseg Reserve) ass den Ënnerscheed tëscht ugefrote Ressourcen an aktueller Notzung. Zum Beispill, e Pod deen 2 GiB Erënnerung freet awer nëmmen 200 MiB benotzt huet ~ 1,8 GiB "iwwerschësseg" Erënnerung. Iwwerschëss kascht Suen. Et kann ongeféier schätzen datt 1 GiB vun redundante Erënnerung kascht ~ $ 10 pro Mount. [2]

Kubernetes Ressource Rapport (kube-resource-report) weist iwwerschësseg Reserven a kann Iech hëllefen Spuerpotenzial ze bestëmmen:

Spuert op Kubernetes Cloud Käschten op AWS

Kubernetes Ressource Rapport weist den Iwwerschoss aggregéiert duerch Applikatioun a Kommando. Dëst erlaabt Iech Plazen ze fannen wou Ressource Ufuerderunge reduzéiert ginn. De generéierten HTML-Rapport liwwert nëmmen e Snapshot vun der Ressourceverbrauch. Dir sollt CPU / Erënnerung Benotzen iwwer Zäit kucken fir adäquate Ressource Ufroen ze bestëmmen. Hei ass e Grafana-Diagramm fir en "typeschen" CPU-schwéier Service: all Pods benotze wesentlech manner wéi déi 3 ugefrote CPU-Cores:

Spuert op Kubernetes Cloud Käschten op AWS

D'Reduktioun vun der CPU-Ufro vun 3000m op ~400m befreit Ressourcen fir aner Aarbechtsbelaaschtungen an erlaabt de Cluster méi kleng ze sinn.

"D'Duerchschnëtts CPU Benotzung vun EC2 Instanzen hieft dacks an der Eenziffer Prozentzuel," schreift Corey Quinn. Wärend fir EC2 déi richteg Gréisst schätzen kann eng schlecht Entscheedung sinnE puer Kubernetes Ressource Ufroen an enger YAML Datei z'änneren ass einfach a kann enorm Erspuernisser bréngen.

Awer wëlle mir wierklech datt d'Leit Wäerter an YAML Dateien änneren? Nee, Maschinnen kënnen et vill besser! Kubernetes Vertikal Pod Autoscaler (VPA) mécht just dat: adaptéiert Ressourceufroen a Contrainten no der Aarbechtslaascht. Hei ass e Beispill Grafik vu Prometheus CPU Ufroen (dënn blo Linn) ugepasst vu VPA iwwer Zäit:

Spuert op Kubernetes Cloud Käschten op AWS

Zalando benotzt VPA an all senge Cluster fir Infrastrukturkomponenten. Net-kritesch Uwendungen kënnen och VPA benotzen.

Goldilocks vu Fairwind ass en Tool dat e VPA fir all Deployment an engem Nummraum erstellt an dann eng VPA Empfehlung op sengem Dashboard weist. Et kann Entwéckler hëllefen déi richteg CPU / Erënnerung Ufroe fir hir Uwendungen ze setzen:

Spuert op Kubernetes Cloud Käschten op AWS

Ech geschriwwen eng kleng Blogpost iwwer VPA am Joer 2019, a viru kuerzem an CNCF End Benotzer Gemeinschaft diskutéiert VPA Thema.

Benotzt EC2 Spot Instanzen

Lescht awer net zulescht, AWS EC2 Käschten kënne reduzéiert ginn andeems Dir Spot Instanzen als Kubernetes Aarbechtsknäppchen benotzt [3]. Spot Instanzen si verfügbar mat enger Remise vu bis zu 90% am Verglach zu On-Demand Präisser. Kubernetes op EC2 Spot lafen ass eng gutt Kombinatioun: Dir musst e puer verschidden Instanztypen fir méi héich Disponibilitéit spezifizéieren, dat heescht datt Dir e gréissere Node fir deeselwechten oder méi niddrege Präis kritt, an déi erhéicht Kapazitéit ka vu containeriséierte Kubernetes Workloads benotzt ginn.

Wéi lafen Kubernetes op EC2 Spot? Et gi verschidde Méiglechkeeten: Benotzt en Drëtt Partei Service wéi SpotInst (elo genannt "Spot", frot mech net firwat), oder füügt einfach eng Spot AutoScalingGroup (ASG) an Äre Stärekoup. Zum Beispill, hei ass e CloudFormation Snippet fir e "Kapazitéitsoptimiséierter" Spot ASG mat multiple Instanztypen:

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"

E puer Notizen iwwer d'Benotzung vu Spot mat Kubernetes:

  • Dir musst Spot-Terminéierunge behandelen, zum Beispill andeems Dir den Node fusionéiert wann d'Instanz gestoppt gëtt
  • Zalando benotzt Forschett offiziell Stärekoup autoscaling mat Node Pool Prioritéit
  • Punkt Noden gezwongen ka ginn akzeptéieren "Aschreiwungen" vun Aarbechtslaascht fir op Spot ze lafen

Summary

Ech hoffen Dir fannt e puer vun den presentéiert Tools nëtzlech fir Är Cloud Rechnung ze reduzéieren. Dir fannt de gréissten Deel vum Artikel och op meng Diskussioun um DevOps Gathering 2019 op YouTube an a Rutschen.

Wat sinn Är beschten Praktiken fir Cloud Käschten op Kubernetes ze spueren? Sot mir weg Bescheed um Twitter (@try_except_).

[1] Tatsächlech wäerte manner wéi 3 vCPUs benotzbar bleiwen well den Node säin Duerchgang reduzéiert gëtt duerch reservéiert Systemressourcen. Kubernetes ënnerscheet tëscht kierperlech Node Kapazitéit an "provisionéiert" Ressourcen (Node Allocatable).

[2] Berechnungsbeispiel: eng m5.grouss Instanz mat 8 GiB Erënnerung ass ~$84 ​​pro Mount (eu-central-1, On-Demand), d.h. blockéieren 1/8 Node ass ongeféier ~ $ 10 / Mount.

[3] Et gi vill méi Weeër fir Är EC2 Rechnung ze reduzéieren, wéi Reservéiert Instanzen, Spuerplang, asw - Ech wäert dës Themen net hei ofdecken, awer Dir sollt se definitiv kucken!

Léiert méi iwwer de Cours.

Source: will.com

Setzt e Commentaire