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)
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:
(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:
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:
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:
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:
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:
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:
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:
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:
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:
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.