Simpen dina biaya awan Kubernetes dina AWS

Tarjamahan tina artikel ieu disiapkeun dina wengi mimiti kursus "Platform Infrastruktur dumasar kana Kubernetes".

Simpen dina biaya awan Kubernetes dina AWS

Kumaha ngahémat biaya awan nalika damel sareng Kubernetes? Henteu aya solusi anu leres, tapi tulisan ieu ngajelaskeun sababaraha alat anu tiasa ngabantosan anjeun ngatur sumber daya anjeun langkung efektif sareng ngirangan biaya komputasi awan anjeun.

Kuring nulis artikel ieu kalawan Kubernetes pikeun AWS dina pikiran, tapi bakal nerapkeun (ampir) persis cara nu sarua ka panyadia awan séjén. Kuring nganggap klaster anjeun (s) parantos gaduh autoscaling dikonpigurasi (klaster-autoscaler). Nyoplokkeun sumber daya sareng ngirangan panyebaran anjeun ngan ukur bakal ngahémat artos upami éta ogé ngirangan armada tempat kerja anjeun (contona EC2).

Artikel ieu bakal nutupan:

  • ngabersihkeun sumber daya anu henteu dianggo (kube-janitor)
  • Ngurangan skala nalika jam teu damel (kube-downscaler)
  • ngagunakeun horizontal autoscaling (HPA),
  • ngurangan réservasi sumberdaya kaleuleuwihan (kube-sumberdaya-laporan, VPA)
  • ngagunakeun instansi Spot

Ngabersihan sumber daya anu henteu dianggo

Gawe di lingkungan gancang-paced hébat. Kami hoyong organisasi téknologi digancangan. Pangiriman software anu langkung gancang ogé hartosna langkung seueur panyebaran PR, lingkungan sawangan, prototipe, sareng solusi analitik. Sagalana geus deployed on Kubernetes. Saha anu gaduh waktos pikeun ngabersihan panyebaran tés sacara manual? Gampang hilap mupus percobaan umur minggu. RUU awan bakal naék kusabab aya anu urang hilap nutup:

Simpen dina biaya awan Kubernetes dina AWS

(Henning Jacobs:
Zhiza:
(kutipan) Corey Quinn:
Mitos: Akun AWS anjeun mangrupikeun fungsi tina jumlah pangguna anu anjeun gaduh.
Fakta: Skor AWS anjeun mangrupikeun fungsi tina jumlah insinyur anu anjeun gaduh.

Ivan Kurnosov (nu ngajawab):
Kanyataan nyata: Skor AWS anjeun mangrupikeun fungsi tina jumlah hal anu anjeun hilap mareuman / ngahapus.)

Kubernetes Janitor (kube-janitor) mantuan ngabersihan up klaster Anjeun. Konfigurasi janitor fleksibel pikeun panggunaan global sareng lokal:

  • Aturan klaster-lega bisa nangtukeun maksimum time-to-live (TTL) pikeun PR / deployments test.
  • Sumberdaya individu tiasa annotated sareng janitor / ttl, contona pikeun otomatis ngahapus spike / prototipe saatos 7 dinten.

Aturan umum ditetepkeun dina file YAML. Jalur na dialirkeun parameter --rules-file di kube-janitor. Ieu conto aturan pikeun ngahapus sadaya rohangan ngaran -pr- dina nami saatos dua dinten:

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

Conto di handap ieu ngatur pamakean labél aplikasi dina pod Deployment sareng StatefulSet pikeun sadaya Deployments/StatefulSets anyar dina 2020, tapi dina waktos anu sami ngamungkinkeun palaksanaan tés tanpa labél ieu salami saminggu:

- 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

Jalankeun demo waktos-wates pikeun 30 menit dina klaster ngajalankeun kube-janitor:

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

Sumber séjén pikeun ningkatkeun biaya nyaéta volume pengkuh (AWS EBS). Ngahapus Kubernetes StatefulSet henteu ngahapus volume anu terus-terusan (PVC - PersistentVolumeClaim). Volume EBS anu henteu kapake tiasa gampang ngahasilkeun biaya ratusan dolar per bulan. Kubernetes Janitor gaduh fitur pikeun ngabersihan PVC anu henteu kapake. Salaku conto, aturan ieu bakal ngahapus sadaya PVC anu henteu dipasang ku modul sareng anu henteu dirujuk ku StatefulSet atanapi CronJob:

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

Kubernetes Janitor tiasa ngabantosan anjeun ngajaga kluster anjeun beresih sareng nyegah biaya komputasi awan tina tumpukan lalaunan. Pikeun deployment jeung parentah konfigurasi, tuturkeun README kube-janitor.

Ngurangan skala salila jam non-kerja

Sistem tés sareng pementasan biasana diperyogikeun pikeun operasi ngan ukur dina jam kerja. Sababaraha aplikasi produksi, sapertos alat back office/admin, ogé meryogikeun kasadiaan terbatas sareng tiasa ditumpurkeun sapeuting.

Kubernetes Downscaler (kube-downscaler) ngamungkinkeun pamaké sarta operator pikeun skala handap sistem salila jam non-kerja. Deployments na StatefulSets tiasa skala ka enol réplika. CronJobs tiasa ditunda. Kubernetes Downscaler dikonpigurasi pikeun sakabéh klaster, hiji atawa leuwih spasi ngaran, atawa sumberdaya individu. Anjeun tiasa nyetél "waktos dianggurkeun" atanapi, sabalikna, "waktos damel". Contona, pikeun ngurangan skala saloba mungkin salila peuting jeung weekends:

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

Ieu grafik pikeun skala titik worker kluster dina sabtu minggu:

Simpen dina biaya awan Kubernetes dina AWS

Turunkeun skala tina ~ 13 dugi ka 4 titik pagawé pasti ngajantenkeun bédana dina tagihan AWS anjeun.

Tapi kumaha upami kuring kedah damel salami klaster "downtime"? deployments tangtu bisa permanén kaasup ti skala ku nambahkeun downscaler / ngaluarkeun: annotation leres. Deployments bisa dikaluarkeun samentara ngagunakeun downscaler / ngaluarkeun-dugi annotation kalawan timestamp mutlak dina format YYYY-MM-DD HH: MM (UTC). Upami diperlukeun, sakabéh klaster bisa diskalakeun deui ku deploying pod kalawan annotation nu downscaler/force-uptime, contona, ku ngaluncurkeun nginx kosong:

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

Tempo README kube-downscaler, lamun museurkeun parentah deployment sarta pilihan tambahan.

Paké autoscaling horizontal

Seueur aplikasi/jasa nguruskeun pola muatan dinamis: sakapeung modulna dianggurkeun, sareng sakapeung tiasa dianggo dina kapasitas pinuh. Ngoperasikeun armada permanén tina pods pikeun Cope jeung beban puncak maksimum teu ekonomis. Kubernetes ngadukung skala otomatis horizontal dina sumber daya HorizontalPodAutoscaler (HPA). Pamakéan CPU sering mangrupikeun indikator anu hadé pikeun skala:

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 parantos nyiptakeun komponén pikeun gampang nyambungkeun métrik khusus pikeun skala: Adaptor métrik Kube (kube-metrics-adapter) mangrupikeun adaptor métrik umum pikeun Kubernetes anu tiasa ngumpulkeun sareng ngalayanan métrik khusus sareng éksternal pikeun autoscaling horisontal pods. Éta ngadukung skala dumasar kana métrik Prometheus, antrian SQS, sareng setélan sanés. Contona, pikeun skala deployment anjeun ka métrik custom digambarkeun ku aplikasi sorangan salaku JSON di / metrics pamakéan:

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

Ngonpigurasikeun skala otomatis horisontal sareng HPA kedah janten salah sahiji tindakan standar pikeun ningkatkeun efisiensi pikeun jasa stateless. Spotify gaduh presentasi sareng pangalaman sareng saran pikeun HPA: skala deployments Anjeun, moal dompét anjeun.

Ngurangan overbooking sumberdaya

Beban kerja Kubernetes nangtukeun kabutuhan CPU/memori maranéhanana ngaliwatan "pamenta sumberdaya". sumberdaya CPU diukur dina cores virtual atawa leuwih ilahar dina "millicores", contona 500m ngakibatkeun 50% vCPU. Sumber daya mémori diukur dina bait, sareng sufiks umum tiasa dianggo, sapertos 500Mi, anu hartosna 500 megabyte. Resource requests kapasitas "konci" dina titik worker, hartina pod kalawan pamundut CPU 1000m dina titik kalawan 4 vCPUs bakal ninggalkeun ngan 3 vCPUs sadia pikeun pods séjén. [1]

Slack (kelebihan cadangan) nya éta selisih sumberdaya dipénta jeung pamakéan sabenerna. Contona, hiji pod nu menta 2 GiB memori tapi ngan ngagunakeun 200 MiB boga ~1,8 GiB memori "kaleuwihan". kaleuwihan waragad duit. Urang kira-kira tiasa ngira-ngira yén 1 GiB mémori kaleuleuwihan biaya ~ $ 10 per bulan. [2]

Laporan Sumberdaya Kubernetes (kube-resource-report) mintonkeun kaleuwihan cadangan tur bisa mantuan Anjeun nangtukeun poténsi tabungan:

Simpen dina biaya awan Kubernetes dina AWS

Laporan Sumberdaya Kubernetes nembongkeun kaleuwihan aggregated ku aplikasi tur paréntah. Ieu ngidinan Anjeun pikeun manggihan tempat dimana tungtutan sumberdaya bisa ngurangan. Laporan HTML nu dihasilkeun ngan nyadiakeun snapshot tina pamakéan sumberdaya. Anjeun kedah ningali pamakean CPU / mémori kana waktosna pikeun nangtukeun paménta sumberdaya anu nyukupan. Ieu bagan Grafana pikeun layanan "khas" CPU-beurat: sadaya pods ngagunakeun sacara signifikan kirang ti 3 inti CPU anu dipénta:

Simpen dina biaya awan Kubernetes dina AWS

Ngurangan paménta CPU tina 3000m ka ~ 400m ngabebaskeun sumber daya pikeun beban kerja anu sanés sareng ngamungkinkeun kluster langkung alit.

"Pamakean CPU rata-rata instansi EC2 sering ngalayang dina rentang persentase angka tunggal," nyerat Corey Quinn. Sedengkeun pikeun EC2 estimasi ukuran katuhu bisa jadi kaputusan goréngNgarobih sababaraha patarosan sumber daya Kubernetes dina file YAML gampang sareng tiasa ngahémat pisan.

Tapi naha urang leres-leres hoyong jalma ngarobih nilai dina file YAML? Henteu, mesin tiasa ngalakukeun éta langkung saé! Kubernetes Nangtung Pod Autoscaler (VPA) ngalakukeun éta: nyaluyukeun paménta sumberdaya sareng konstrain dumasar kana beban kerja. Ieu conto grafik paménta CPU Prometheus (garis biru ipis) diadaptasi ku VPA kana waktosna:

Simpen dina biaya awan Kubernetes dina AWS

Zalando ngagunakeun VPA dina sagala klaster na pikeun komponén infrastruktur. Aplikasi non-kritis ogé tiasa nganggo VPA.

Goldilocks ti Fairwind mangrupikeun alat anu nyiptakeun VPA pikeun unggal panyebaran dina rohangan ngaran teras nampilkeun rekomendasi VPA dina dasbor na. Éta tiasa ngabantosan pamekar nyetél pamundut CPU/memori anu leres pikeun aplikasina:

Simpen dina biaya awan Kubernetes dina AWS

Kuring nulis leutik blogpost ngeunaan VPA dina 2019, sarta anyar dina Komunitas Pamaké Ahir CNCF ngabahas masalah VPA.

Ngagunakeun instansi EC2 Spot

Panungtungan tapi teu saeutik, biaya AWS EC2 bisa dikirangan ku ngagunakeun instansi Spot salaku titik pagawe Kubernetes. [3]. Instance spot sayogi kalayan diskon dugi ka 90% dibandingkeun sareng harga On-Demand. Ngajalankeun Kubernetes on EC2 Spot mangrupakeun kombinasi alus: Anjeun kudu nangtukeun sababaraha jenis instansi béda pikeun kasadiaan luhur, hartina anjeun bisa meunangkeun titik nu leuwih gede pikeun harga sarua atawa leuwih handap, sarta ngaronjat kapasitas bisa dipaké ku containerized beban kerja Kubernetes.

Kumaha ngajalankeun Kubernetes dina EC2 Spot? Aya sababaraha pilihan: ngagunakeun jasa pihak katilu kawas SpotInst (ayeuna disebut "Spot", ulah nanya ka kuring naha), atawa ngan saukur nambahkeun Spot AutoScalingGroup (ASG) kana klaster Anjeun. Contona, ieu snippet CloudFormation pikeun Spot ASG "dioptimalkeun kapasitas" sareng sababaraha jinis conto:

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"

Sababaraha catetan ngeunaan ngagunakeun Spot sareng Kubernetes:

  • Anjeun kedah nanganan terminasi Spot, contona ku ngahijikeun titik nalika instansi dieureunkeun
  • Zalando ngagunakeun garpu autoscaling klaster resmi kalayan prioritas kolam renang titik
  • Titik titik bisa dipaksakeun nampa "registrations" tina workloads ngajalankeun di Spot

singgetan

Kuring miharep anjeun manggihan sababaraha parabot dibere mangpaat dina ngurangan bil awan Anjeun. Anjeun tiasa mendakan seueur eusi tulisan ogé di omongan kuring di DevOps Gathering 2019 dina YouTube sareng dina slide.

Naon prakték pangsaéna anjeun pikeun ngahémat biaya awan dina Kubernetes? Mangga wartosan kuring di Twitter (@coba_iwal_).

[1] Kanyataanna, kirang ti 3 vCPU bakal tetep bisa dipaké salaku throughput titik urang diréduksi ku sumberdaya sistem ditangtayungan. Kubernetes ngabedakeun antara kapasitas titik fisik jeung sumber daya "disadiakeun" (Node dialokasikeun).

[2] Conto itungan: hiji conto m5.large kalayan memori 8 GiB nyaéta ~$84 ​​​​per bulan (eu-central-1, On-Demand), i.e. meungpeuk 1/8 node kira-kira ~$10/bulan.

[3] Aya seueur deui cara pikeun ngirangan tagihan EC2 anjeun, sapertos Instans Ditangtayungan, Rencana Tabungan, jsb.

Diajar langkung seueur ngeunaan kursus.

sumber: www.habr.com

Tambahkeun komentar