Nine Kubernetes Performance Tips

Nine Kubernetes Performance Tips

Halo kabeh! Jenengku Oleg Sidorenkov, aku kerja ing DomClick minangka pimpinan tim infrastruktur. Kita wis nggunakake kubus kanggo didol luwih saka telung taun, lan sajrone wektu iki kita wis ngalami macem-macem momen menarik. Dina iki aku bakal pitutur marang kowe carane, karo pendekatan tengen, sampeyan bisa remet kinerja malah luwih metu saka vanilla Kubernetes kanggo kluster Panjenengan. Siap mantep!

Sampeyan kabeh ngerti banget yen Kubernetes minangka sistem open source sing bisa diukur kanggo orkestrasi wadah; uga, utawa 5 binar sing nindakake sihir kanthi ngatur siklus urip microservices ing lingkungan server. Kajaba iku, iki minangka alat sing cukup fleksibel sing bisa dirakit kaya konstruktor Lego kanggo kustomisasi maksimal kanggo macem-macem tugas.

Lan kabeh katon apik: uncalan server menyang kluster, kaya kayu bakar menyang firebox, lan ora ngerti kasusahan. Nanging yen sampeyan kanggo lingkungan, sampeyan bakal mikir: "Kepiye carane aku bisa nyimpen geni ing kompor lan getun alas?". Ing tembung liyane, carane golek cara kanggo nambah infrastruktur lan nyuda biaya.

1. Nglacak sumber daya tim lan aplikasi

Nine Kubernetes Performance Tips

Salah siji cara paling banal nanging efektif yaiku introduksi panjalukan / watesan. Pisahake aplikasi miturut spasi jeneng, lan spasi jeneng dening tim pangembangan. Setel aplikasi sadurunge masang nilai kanggo konsumsi wektu prosesor, memori, panyimpenan ephemeral.

resources:
   requests:
     memory: 2Gi
     cpu: 250m
   limits:
     memory: 4Gi
     cpu: 500m

Miturut pengalaman, kita teka menyang kesimpulan: iku ora worth inflating panjalukan saka watesan dening luwih saka kaping pindho. Ukuran cluster diwilang adhedhasar panjalukan, lan yen sampeyan nyetel aplikasi kanggo prabédan ing sumber daya, contone, dening 5-10 kaping, banjur mbayangno apa sing bakal kelakon ing simpul nalika kapenuhan pods lan dumadakan nampa mbukak. Ora ana sing apik. Ing minimal, throttling, lan minangka maksimum, ngomong pamit kanggo buruh lan njaluk mbukak siklik ing liyane saka kelenjar sawise pods miwiti obah.

Kajaba iku, kanthi bantuan limitranges sampeyan bisa nyetel nilai sumber daya kanggo wadhah ing wiwitan - minimal, maksimum lan standar:

➜  ~ kubectl describe limitranges --namespace ops
Name:       limit-range
Namespace:  ops
Type        Resource           Min   Max   Default Request  Default Limit  Max Limit/Request Ratio
----        --------           ---   ---   ---------------  -------------  -----------------------
Container   cpu                50m   10    100m             100m           2
Container   ephemeral-storage  12Mi  8Gi   128Mi            4Gi            -
Container   memory             64Mi  40Gi  128Mi            128Mi          2

Elinga kanggo matesi sumber daya namespace supaya siji printah ora bisa njupuk kabeh sumber daya saka kluster:

➜  ~ kubectl describe resourcequotas --namespace ops
Name:                   resource-quota
Namespace:              ops
Resource                Used          Hard
--------                ----          ----
limits.cpu              77250m        80
limits.memory           124814367488  150Gi
pods                    31            45
requests.cpu            53850m        80
requests.memory         75613234944   150Gi
services                26            50
services.loadbalancers  0             0
services.nodeports      0             0

Minangka sampeyan bisa ndeleng saka katrangan resourcequotas, yen prentah ops pengin nyebarake pod sing bakal ngonsumsi 10 cpu liyane, mula panjadwal ora bakal bisa ditindakake lan bakal nggawe kesalahan:

Error creating: pods "nginx-proxy-9967d8d78-nh4fs" is forbidden: exceeded quota: resource-quota, requested: limits.cpu=5,requests.cpu=5, used: limits.cpu=77250m,requests.cpu=53850m, limited: limits.cpu=10,requests.cpu=10

Kanggo ngatasi masalah sing padha, sampeyan bisa nulis alat, contone, minangka iki, sing bisa nyimpen lan nindakake negara sumber daya printah.

2. Pilih panyimpenan file sing paling apik

Nine Kubernetes Performance Tips

Ing kene aku pengin ndemek topik volume terus-terusan lan subsistem disk saka simpul pekerja Kubernetes. Mugi sing ora ana siji nggunakake "Cube" ing HDD ing produksi, nanging kadhangkala malah SSD biasa wis ora cukup. Kita ngadhepi masalah kayata log mateni disk kanthi operasi I / O, lan ora ana akeh solusi ing kene:

  • Gunakake SSDs kinerja dhuwur utawa ngalih menyang NVMe (yen sampeyan ngatur hardware dhewe).

  • Ngurangi tingkat logging.

  • Nindakake keseimbangan "pinter" saka polong sing ngrusak disk (podAntiAffinity).

Gambar ing ndhuwur nuduhake apa sing kedadeyan ing nginx-ingress-controller karo disk nalika access_logs logging diaktifake (~ 12k log / detik). Kahanan kasebut, mesthi, bisa nyebabake degradasi kabeh aplikasi ing simpul iki.

Kanggo PV, sayang, aku durung nyoba kabeh. jinis Volume terus-terusan. Gunakake pilihan sing paling apik sing cocog karo sampeyan. Iku wis historis kedaden ing negara kita bagean cilik saka layanan mbutuhake volume RWX, lan dangu padha wiwit nggunakake panyimpenan NFS kanggo tugas iki. Murah lan ... cukup. Mesthine, kita mangan telek karo dheweke - dadi sehat, nanging kita sinau carane nyetel dheweke, lan sirahe ora lara maneh. Lan yen bisa, pindhah menyang panyimpenan obyek S3.

3. Mbangun Gambar Optimized

Nine Kubernetes Performance Tips

Luwih becik nggunakake gambar sing dioptimalake kanggo wadhah supaya Kubernetes bisa njupuk luwih cepet lan nindakake kanthi luwih efisien. 

Optimization tegese gambar:

  • ngemot mung siji aplikasi utawa nindakake mung siji fungsi;

  • ukuran cilik, amarga gambar gedhe sing luwih elek ditularaké liwat jaringan;

  • duwe titik pungkasan kesehatan lan kesiapan sing bisa digunakake Kubernetes kanggo tumindak yen ana downtime;

  • nggunakake sistem operasi-loropaken wadhah (kaya Alpine utawa CoreOS) sing luwih tahan kanggo kasalahan konfigurasi;

  • nggunakake mbangun multi-tataran supaya sampeyan mung bisa masang aplikasi kompilasi lan ora sumber gawan.

Ana akeh alat lan layanan sing ngidini sampeyan mriksa lan ngoptimalake gambar kanthi cepet. Penting kanggo tansah tetep anyar lan aman. Akibaté, sampeyan entuk:

  1. Ngurangi beban jaringan ing kabeh kluster.

  2. Suda wektu wiwitan wadhah.

  3. Ukuran luwih cilik saka kabeh registri Docker sampeyan.

4. Gunakake cache DNS

Nine Kubernetes Performance Tips

Yen kita ngomong babagan beban sing dhuwur, mula tanpa nyetel sistem DNS saka kluster, urip cukup ala. Biyen, pangembang Kubernetes ndhukung solusi kube-dns. Iki uga ditindakake ing negara kita, nanging piranti lunak iki ora cocog lan ora menehi kinerja sing dibutuhake, sanajan, misale jek, tugas kasebut gampang. Banjur coredns muncul, sing kita ganti lan ora ngerti sedhih, mengko dadi layanan DNS standar ing K8s. Ing sawetara titik, kita tuwuh nganti 40 ewu rps menyang sistem DNS, lan solusi iki uga ora cukup. Nanging, kanthi kasempatan, Nodelocaldns metu, alias cache lokal node, aka NodeLocal DNSCache.

Napa kita nggunakake? Ana bug ing kernel Linux sing, nalika sawetara akses liwat conntrack NAT liwat UDP, mimpin kanggo kondisi lomba kanggo nulis kanggo tabel conntrack, lan bagéan saka lalu lintas liwat NAT ilang (saben trip liwat Service iku NAT). Nodelocaldns ngatasi masalah iki kanthi nyingkirake NAT lan nganyarke menyang konektivitas TCP menyang DNS hulu, uga cache pitakon DNS hulu sacara lokal (kalebu cache negatif 5 detik).

5. Skala pods horisontal lan vertikal kanthi otomatis

Nine Kubernetes Performance Tips

Apa sampeyan bisa ngomong kanthi yakin manawa kabeh layanan mikro sampeyan wis siyap kanggo nambah beban loro nganti telu? Kepiye cara ngalokasi sumber daya kanthi bener kanggo aplikasi sampeyan? Tetep sawetara pods mlaku ing keluwihan workload bisa keluwih, lan tetep bali menyang mburi risiko downtime saka mundhak dadakan ing lalu lintas menyang layanan. Tegese emas mbantu entuk mantra multiplikasi kayata layanan Autoscaler Pod Horisontal и Vertikal Pod Autoscaler.

VPA ngidini sampeyan kanthi otomatis ngunggahake panjalukan / watesan wadhah sampeyan ing pod adhedhasar panggunaan nyata. Kepiye carane bisa migunani? Yen sampeyan duwe Pods sing sakperangan alesan ora bisa scaled metu horisontal (sing ora sakabehe dipercaya), sampeyan bisa nyoba kanggo dipercaya VPA kanggo ngganti sumber daya. Fitur kasebut minangka sistem rekomendasi adhedhasar data historis lan saiki saka metric-server, dadi yen sampeyan ora pengin ngganti panjalukan / watesan kanthi otomatis, sampeyan mung bisa ngawasi sumber daya sing disaranake kanggo wadhah sampeyan lan ngoptimalake setelan kanggo nyimpen CPU lan memori. ing kluster.

Nine Kubernetes Performance TipsGambar dijupuk saka https://levelup.gitconnected.com/kubernetes-autoscaling-101-cluster-autoscaler-horizontal-pod-autoscaler-and-vertical-pod-2a441d9ad231

Penjadwal ing Kubernetes mesthi adhedhasar panjaluk. Punapa mawon nilai sampeyan sijine ana, panjadwal bakal golek simpul cocok adhedhasar iku. Nilai watesan dibutuhake dening kublet kanggo ngerti kapan throttle utawa mateni pod. Lan amarga mung parameter penting yaiku nilai panjaluk, VPA bakal bisa digunakake. Yen sampeyan nggedhekake aplikasi kanthi vertikal, sampeyan nemtokake panjaluk apa sing kudu ditindakake. Lan apa sing bakal kelakon kanggo watesan banjur? Parameter iki uga bakal diukur kanthi proporsional.

Contone, ing ngisor iki setelan pod sing khas:

resources:
   requests:
     memory: 250Mi
     cpu: 200m
   limits:
     memory: 500Mi
     cpu: 350m

Mesin rekomendasi nemtokake manawa aplikasi sampeyan mbutuhake CPU 300m lan 500Mi supaya bisa mlaku kanthi bener. Sampeyan bakal entuk setelan iki:

resources:
   requests:
     memory: 500Mi
     cpu: 300m
   limits:
     memory: 1000Mi
     cpu: 525m

Kaya sing kasebut ing ndhuwur, iki minangka skala proporsional adhedhasar rasio panjaluk / watesan ing manifest:

  • CPU: 200m → 300m: rasio 1:1.75;

  • Memori: 250Mi → 500Mi: rasio 1:2.

Kanthi gati HPA, banjur mekanisme operasi luwih transparan. Ambang disetel kanggo metrik kayata prosesor lan memori, lan yen rata-rata kabeh replika ngluwihi batesan, banjur aplikasi timbangan dening +1 pod nganti nilai tiba ing ngisor batesan, utawa nganti jumlah maksimum replika tekan.

Nine Kubernetes Performance TipsGambar dijupuk saka https://levelup.gitconnected.com/kubernetes-autoscaling-101-cluster-autoscaler-horizontal-pod-autoscaler-and-vertical-pod-2a441d9ad231

Saliyane metrik biasa kaya CPU lan Memori, sampeyan bisa nyetel batesan ing metrik Prometheus khusus lan bisa digunakake yen sampeyan rumangsa iki minangka cara sing paling akurat kanggo nemtokake kapan ukuran aplikasi sampeyan. Sawise aplikasi stabil ing sangisore ambang metrik sing ditemtokake, HPA bakal miwiti ngedhunake Pods nganti jumlah replika minimal utawa nganti beban tekan ambang.

6. Aja Lali Babagan Afinitas Node lan Afinitas Pod

Nine Kubernetes Performance Tips

Ora kabeh simpul mbukak ing hardware sing padha, lan ora kabeh pods kudu mbukak aplikasi komputasi-intensif. Kubernetes ngidini sampeyan nemtokake spesialisasi node lan pods nggunakake Afinitas Node и Pod Afinitas.

Yen sampeyan duwe simpul sing cocog kanggo operasi komputasi intensif, mula kanggo efisiensi maksimal, luwih becik ngiket aplikasi menyang simpul sing cocog. Kanggo nindakake iki, gunakake nodeSelector kanthi label simpul.

Ayo dadi ngomong sampeyan duwe rong kelenjar: siji karo CPUType=HIGHFREQ lan nomer akeh intine cepet, liyane karo MemoryType=HIGHMEMORY memori luwih lan kinerja luwih cepet. Cara paling gampang yaiku nemtokake panyebaran pod menyang simpul HIGHFREQkanthi nambah menyang bagean spec pamilih kaya iki:

…
nodeSelector:
	CPUType: HIGHFREQ

Cara sing luwih larang lan spesifik kanggo nindakake iki yaiku nggunakake nodeAffinity ing lapangan affinity razdela spec. Ana rong pilihan:

  • requiredDuringSchedulingIgnoredDuringExecution: setelan hard (scheduler mung bakal masang pods ing simpul tartamtu (lan ora ana liya));

  • preferredDuringSchedulingIgnoredDuringExecution: setelan alus (panjadwal bakal nyoba kanggo masang menyang kelenjar tartamtu, lan yen gagal, iku bakal nyoba kanggo nyebarke menyang simpul kasedhiya sabanjuré).

Sampeyan bisa nemtokake sintaks tartamtu kanggo ngatur label simpul, contone, In, NotIn, Exists, DoesNotExist, Gt utawa Lt. Nanging, elinga yen cara rumit ing dhaptar label sing dawa bakal alon-alon nggawe keputusan ing kahanan kritis. Ing tembung liyane, aja dadi rumit.

Kaya kasebut ing ndhuwur, Kubernetes ngidini sampeyan nyetel ikatan polong saiki. Tegese, sampeyan bisa nggawe polong tartamtu bisa bebarengan karo polong liyane ing zona kasedhiyan sing padha (relevan kanggo awan) utawa simpul.

В podAffinity lapangan affinity razdela spec kothak padha kasedhiya ing cilik saka nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution и preferredDuringSchedulingIgnoredDuringExecution. Bentenipun mung iku matchExpressions bakal ngiket pods menyang simpul sing wis mlaku pod karo label sing.

More Kubernetes nawakake lapangan podAntiAffinity, sing, ing kontras, ora ngiket pod menyang simpul karo pods tartamtu.

Babagan ekspresi nodeAffinity Saran sing padha bisa diwenehake: nyoba supaya aturan tetep prasaja lan logis, aja nyoba nglebokake spesifikasi pod kanthi aturan sing rumit. Gampang banget kanggo nggawe aturan sing ora cocog karo kahanan kluster, nglebokake beban ekstra ing panjadwal lan ngrusak kinerja sakabèhé.

7. Tants & Toleransi

Ana cara liya kanggo ngatur panjadwal. Yen sampeyan duwe kluster gedhe kanthi atusan simpul lan ewu layanan mikro, angel banget kanggo nyegah polong tartamtu ora di-host dening kelenjar tartamtu.

Mekanisme taints - aturan nglarang - mbantu karo iki. Contone, sampeyan bisa nyegah simpul tartamtu saka mbukak pods ing skenario tartamtu. Kanggo ngetrapake taint menyang simpul tartamtu, gunakake pilihan kasebut taint ing kubectl. Nemtokake tombol lan nilai banjur taint kaya NoSchedule utawa NoExecute:

$ kubectl taint nodes node10 node-role.kubernetes.io/ingress=true:NoSchedule

Sampeyan uga kudu dicathet yen mekanisme taint ndhukung telung efek utama: NoSchedule, NoExecute и PreferNoSchedule.

  • NoSchedule tegese nganti ana entri sing cocog ing spesifikasi pod tolerations, ora bisa disebarake menyang simpul (ing conto iki node10).

  • PreferNoSchedule - versi simplified NoSchedule. Ing kasus iki, panjadwal bakal nyoba ora nyedhiakke pods sing ora duwe entri cocog. tolerations saben simpul, nanging iki ora watesan hard. Yen ora ana sumber daya ing kluster, mula pods bakal wiwit nyebar ing simpul iki.

  • NoExecute - efek iki micu evakuasi langsung saka pods sing ora duwe entri cocog tolerations.

Aneh, prilaku iki bisa dibatalake kanthi nggunakake mekanisme toleransi. Iki trep yen ana simpul "dilarang" lan sampeyan mung kudu nyelehake layanan infrastruktur ing kono. Carane nindakake? Mung polong sing ana toleransi sing cocog.

Mangkene apa spek pod bakal katon kaya:

spec:
   tolerations:
     - key: "node-role.kubernetes.io/ingress"
        operator: "Equal"
        value: "true"
        effect: "NoSchedule"

Iki ora ateges nalika redeployment sabanjure, pod bakal tekan simpul iki, iki dudu mekanisme Afinitas Node lan nodeSelector. Nanging kanthi nggabungake sawetara fitur, sampeyan bisa entuk persiyapan panjadwal sing fleksibel banget.

8. Setel Prioritas Penyebaran Pod

Mung amarga sampeyan wis ngonfigurasi ikatan pod-to-node ora ateges kabeh pods kudu dianggep kanthi prioritas sing padha. Contone, sampeyan bisa uga pengin masang sawetara Pod sadurunge liyane.

Kubernetes nawakake macem-macem cara kanggo nyetel Prioritas Pod lan Preemption. Setelan kasusun saka sawetara bagean: obyek PriorityClass lan gambaran lapangan priorityClassName ing spesifikasi pod. Coba conto:

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 99999
globalDefault: false
description: "This priority class should be used for very important pods only"

Kita nggawe PriorityClass, wenehi jeneng, katrangan, lan nilai. Sing luwih dhuwur value, sing luwih dhuwur prioritas. Nilai kasebut bisa dadi integer 32-bit kurang saka utawa padha karo 1. Nilai sing luwih dhuwur disimpen kanggo pod sistem kritis misi, sing biasane ora bisa dideleng. Pengusiran kasebut mung bakal kedadeyan yen polong prioritas dhuwur ora bisa diuripake, banjur sawetara polong saka simpul tartamtu bakal dievakuasi. Yen mekanisme iki banget kaku kanggo sampeyan, sampeyan bisa nambah pilihan preemptionPolicy: Never, banjur ora ana preemption, polong bakal dadi sing pertama ing antrian lan ngenteni panjadwal kanggo nemokake sumber daya gratis.

Sabanjure, kita nggawe pod, ing ngendi kita nemtokake jeneng kasebut priorityClassName:

apiVersion: v1
kind: Pod
metadata:
  name: static-web
  labels:
    role: myrole
 spec:
  containers:
    - name: web
      image: nginx
      ports:
        - name: web
          containerPort: 80
          protocol: TCP
  priorityClassName: high-priority
          

Sampeyan bisa nggawe minangka akeh kelas prioritas sing disenengi, sanajan dianjurake supaya ora digawa adoh karo iki (ngomong, matesi dhewe kanggo kurang, medium lan prioritas dhuwur).

Dadi, yen perlu, sampeyan bisa nambah efisiensi nggunakake layanan kritis, kayata nginx-ingress-controller, coredns, lsp.

9. Ngoptimalake kluster ETCD Panjenengan

Nine Kubernetes Performance Tips

ETCD bisa diarani otak kabeh kluster. Penting banget kanggo njaga operasi database iki ing tingkat dhuwur, amarga kacepetan operasi ing "Cube" gumantung ing. A cukup standar, lan ing wektu sing padha, solusi apik bakal tetep ETCD kluster ing kelenjar master supaya duwe wektu tundha minimal kanggo kube-apiserver. Yen iki ora bisa, banjur sijine ETCD sabisa, karo bandwidth apik antarane peserta. Uga mbayar manungsa waé kanggo carane akeh kelenjar saka ETCD bisa tiba metu tanpa gawe piala kanggo kluster.

Nine Kubernetes Performance Tips

Tetep wonten ing pikiran sing Tambah gedhe banget ing nomer peserta ing kluster bisa nambah toleransi fault ing beyo saka kinerja, kabeh kudu ing moderat.

Yen kita ngomong babagan nyiyapake layanan, mula ana sawetara rekomendasi:

  1. Nduwe hardware sing apik, adhedhasar ukuran kluster (sampeyan bisa maca kene).

  2. Ngatur sawetara paramèter yen sampeyan wis nyebar kluster ing antarane sepasang DC utawa jaringan lan disk sampeyan isih akeh sing dikarepake (sampeyan bisa maca kene).

kesimpulan

Artikel iki njlèntrèhaké poin sing tim kita nyoba kanggo tundhuk. Iki dudu katrangan langkah-langkah kanggo tumindak, nanging opsi sing bisa migunani kanggo ngoptimalake overhead kluster. Cetha yen saben kluster unik kanthi cara dhewe, lan solusi tuning bisa beda-beda, mula bakal dadi menarik kanggo njaluk umpan balik saka sampeyan: kepiye ngawasi kluster Kubernetes, kepiye carane nambah kinerja. Nuduhake pengalaman sampeyan ing komentar, bakal menarik kanggo ngerti.

Source: www.habr.com