Tavaliselt on alati vajalik tagada pĂŒhendatud ressursside hulk rakendusele, et see töötab Ă”igesti ja stabiilselt. Aga mis juhtub, kui mitu rakendust töötab samadel seadmetel? Kuidas tagada igale rakendusele minimaalne vajalik ressursihulk? Kuidas saab piirata ressursside tarbimist? Kuidas jaotada koormus Ă”igesti sĂ”lmede vahel? Kuidas tagada horisontaalse skaleerimise mehhanismi töö rakenduste koormuse tĂ”ustes?

Alustada tuleb sellega, millised on peamised ressursside tĂŒĂŒbid sĂŒsteemis â need on muidugi protsessoriaeg ja mĂ€lu. K8si manifestides mÔÔdetakse neid ressursitĂŒĂŒpe jĂ€rgmistes ĂŒhikutes:
- CPU â tuumades
- RAM â baitides
Igale ressursile on vĂ”imalik mÀÀrata kahte tĂŒĂŒpi nĂ”udmisi â requests ja limits. Requests â kirjeldab minimaalset nĂ”uet sĂ”lme vaba ressursi osas konteineri (ja podi tervikuna) kĂ€ivitamiseks, samas kui limits seab ressursside range piirangu, mis on konteinerile kĂ€tte saadav.
Oluline on mĂ”ista, et manifestis ei pea olema kohustuslikult selgelt mÀÀratletud mĂ”lemat tĂŒĂŒpi, samasugune kĂ€itumine kehtib jĂ€rgmistel tingimustel:
- Kui on selgelt mÀÀratud ainult ressursside limiidid, siis selle ressursi taotlused vĂ”tavad automaatselt vÀÀrtuse, mis on vĂ”rdne limiitidega (seda saab kontrollida, kutsudes esile ĂŒksuse kirjeldamise). St tegelikult on konteineri töö piiratud sama palju ressursse, kui see vajab oma kĂ€ivitamiseks.
- Kui ressursile on selgelt mÀÀratud ainult taotlused, siis sellele ressursile ei rakendata ĂŒldse ĂŒlemisi piiranguid â st konteiner on piiratud ainult sĂ”lme enda ressurssidega.
Samuti on vĂ”imalik seadistada ressursihaldust mitte ainult konkreetse konteineri tasemel, vaid ka namespaces tasemel jĂ€rgmiste ĂŒksuste abil:
- LimitRange â kirjeldab piiranguid konteineri/podi tasemel ns ja on vajalik, et kirjeldada konteineri/podi vaikimisi piiranguid, samuti vĂ€ltida teadlikult suurte konteinerite/podide loomist (vĂ”i vastupidi), piirata nende arvu ja mÀÀrata vĂ”imalike limiitide ja taotluste vÀÀrtuste erinevust
- ResourceQuotas â kirjeldavad piirangupoliitikat ĂŒldiselt kĂ”igi konteinerite jaoks ns-s ning seda kasutatakse tavaliselt ressursside piiretluseks keskkondade vahel (kasulik, kui keskkonnad ei ole tĂ”eliselt eraldatud sĂ”lmede tasandil).
Allpool on nÀited manifestidest, kus on seatud ressursipiirangud:
Konkreetse konteineri tasandil:
containers: - name: app-nginx image: nginx resources: requests: memory: 1Gi limits: cpu: 200mSee tÀhendab, et antud juhul on nginx konteinri kÀitamiseks vaja vÀhemalt 1G vabast RAM-ist ja 0.2 CPU-d sÔlmes, samas kui maksimaalselt vÔib konteiner tarbida 0.2 CPU-d ja kogu saadavalolev RAM sÔlmes.
Kogu ns tasandil:
apiVersion: v1 kind: ResourceQuota metadata: name: nxs-test spec: hard: requests.cpu: 300m requests.memory: 1Gi limits.cpu: 700m limits.memory: 2GiSee tĂ€hendab, et kĂ”ikide konteinerite requestide summa defaul ns-is ei tohi ĂŒletada 300m CPU ja 1G RAM, samas kui kĂ”igi limitide summa ei tohi ĂŒletada 700m CPU ja 2G RAM.
Defauid piirangud konteinerite jaoks ns-is:
apiVersion: v1 kind: LimitRange metadata: name: nxs-limit-per-container spec: limits: - type: Container defaultRequest: cpu: 100m memory: 1Gi default: cpu: 1 memory: 2Gi min: cpu: 50m memory: 500Mi max: cpu: 2 memory: 4GiSee, vaikimisi nimiruumi jaoks on kÔikidele konteineritele CPU nÔudmiseks mÀÀratud 100m ja RAM-i nÔudmiseks 1G, piiri mÀÀramiseks on seatud 1 CPU ja 2G. Samuti on kehtestatud piirangud nÔudmise/piiri vÀÀrtustele CPU jaoks (50m < x < 2) ja RAM-i jaoks (500M < x < 4G).
Piirangud podide tasemel ns:
apiVersion: v1 kind: LimitRange metadata: name: nxs-limit-pod spec: limits: - type: Pod max: cpu: 4 memory: 1GiSee tÀhendab, et iga podi jaoks vaikimisi nimiruumis mÀÀratakse piirang 4 vCPU ja 1G.
NĂŒĂŒd tahaksin rÀÀkida, milliseid eeliseid need piirangud meile tuua vĂ”ivad.
Laadimise tasakaalustamise mehhanism sÔlmede vahel
Kuidas teada, podide jaotuse eest sÔlmede vahel vastutab k8s komponendiks scheduler, mis töötab kindla algoritmi alusel. See algoritm lÀbib kahe etapi, et valida optimaalne sÔlm kÀivitamiseks:
- Filtreerimine
- Reiting
See tĂ€hendab, et kirjeldatud poliitika kohaselt valitakse algselt sĂ”lmed, kus podi kĂ€ivitamine on vĂ”imalik, tuginedes komplektile predicates (sealhulgas kontrollitakse, kas sĂ”lmel on piisavalt ressursse podi kĂ€ivitamiseks â PodFitsResources), seejĂ€rel hinnatakse nende sĂ”lmede jaoks vastavalt priorities punkte antakse (sealhulgas, mida rohkem on vabu ressursse node'il - seda rohkem punkte sellele antakse - LeastResourceAllocation / LeastRequestedPriority / BalancedResourceAllocation) ja seda kĂ€ivitatakse node'il, millel on kĂ”ige rohkem punkte (kui mitu node'it vastab sellele tingimusele, valitakse neist juhuslik).
Samuti tuleb mÔista, et ajakava hindab node'i kÀttesaadavaid ressursse andmete pÔhjal, mis on salvestatud etcd-s - st iga selle node'i peal kÀivitatud pod'i requested / limit ressursside summa, kuid mitte tegeliku ressursikasutuse pÔhjal. Selle teabe saab kÀsku kasutades kubectl describe node $NODE, nÀiteks:
# kubectl describe nodes nxs-k8s-s1
..
Non-terminated Pods: (9 in total)
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits AGE
--------- ---- ------------ ---------- --------------- ------------- ---
ingress-nginx nginx-ingress-controller-754b85bf44-qkt2t 0 (0%) 0 (0%) 0 (0%) 0 (0%) 233d
kube-system kube-flannel-26bl4 150m (0%) 300m (1%) 64M (0%) 500M (1%) 233d
kube-system kube-proxy-exporter-cb629 0 (0%) 0 (0%) 0 (0%) 0 (0%) 233d
kube-system kube-proxy-x9fsc 0 (0%) 0 (0%) 0 (0%) 0 (0%) 233d
kube-system nginx-proxy-k8s-worker-s1 25m (0%) 300m (1%) 32M (0%) 512M (1%) 233d
nxs-monitoring alertmanager-main-1 100m (0%) 100m (0%) 425Mi (1%) 25Mi (0%) 233d
nxs-logging filebeat-lmsmp 100m (0%) 0 (0%) 100Mi (0%) 200Mi (0%) 233d
nxs-monitoring node-exporter-v4gdq 112m (0%) 122m (0%) 200Mi (0%) 220Mi (0%) 233d
Allocated resources:
(Total limits may be over 100 percent, i.e., overcommitted.)
Resource Requests Limits
-------- -------- ------
cpu 487m (3%) 822m (5%)
memory 15856217600 (2%) 749976320 (3%)
ephemeral-storage 0 (0%) 0 (0%)Siin nĂ€eme kĂ”iki podâe, mis on konkreetse node'i peal kĂ€ivitatud, samuti ressursse, mida iga pod kĂŒsib. Ja siin on logid ajakava tööprotsessist cronjob-cron-events-1573793820-xt6q9 (see teave ilmub ajakava logis, kui tĂ”stetakse logimise taset 10. tasemeni kĂ€ivituskomandi argumentides -v=10):
log
I1115 07:57:21.637791 1 scheduling_queue.go:908] Proovime nĂŒĂŒd ajastada pod'i nxs-stage/cronjob-cron-events-1573793820-xt6q9
I1115 07:57:21.637804 1 scheduler.go:453] Proovime ajastada pod'i: nxs-stage/cronjob-cron-events-1573793820-xt6q9
I1115 07:57:21.638285 1 predicates.go:829] Pod'i nxs-stage/cronjob-cron-events-1573793820-xt6q9 ajastamine sÔlmele nxs-k8s-s5 on lubatud, sÔlm töötab ainult 16 pod'ist 110.
I1115 07:57:21.638300 1 predicates.go:829] Pod'i nxs-stage/cronjob-cron-events-1573793820-xt6q9 ajastamine sÔlmele nxs-k8s-s6 on lubatud, sÔlm töötab ainult 20 pod'ist 110.
I1115 07:57:21.638322 1 predicates.go:829] Pod'i nxs-stage/cronjob-cron-events-1573793820-xt6q9 ajastamine sÔlmele nxs-k8s-s3 on lubatud, sÔlm töötab ainult 20 pod'ist 110.
I1115 07:57:21.638322 1 predicates.go:829] Pod'i nxs-stage/cronjob-cron-events-1573793820-xt6q9 ajastamine sÔlmele nxs-k8s-s4 on lubatud, sÔlm töötab ainult 17 pod'ist 110.
I1115 07:57:21.638334 1 predicates.go:829] Pod'i nxs-stage/cronjob-cron-events-1573793820-xt6q9 ajastamine sÔlmele nxs-k8s-s10 on lubatud, sÔlm töötab ainult 16 pod'ist 110.
I1115 07:57:21.638365 1 predicates.go:829] Pod'i nxs-stage/cronjob-cron-events-1573793820-xt6q9 ajastamine sÔlmele nxs-k8s-s12 on lubatud, sÔlm töötab ainult 9 pod'ist 110.
I1115 07:57:21.638334 1 predicates.go:829] Pod'i nxs-stage/cronjob-cron-events-1573793820-xt6q9 ajastamine sÔlmele nxs-k8s-s11 on lubatud, sÔlm töötab ainult 11 pod'ist 110.
I1115 07:57:21.638385 1 predicates.go:829] Pod'i nxs-stage/cronjob-cron-events-1573793820-xt6q9 ajastamine sÔlmele nxs-k8s-s1 on lubatud, sÔlm töötab ainult 19 pod'ist 110.
I1115 07:57:21.638402 1 predicates.go:829] Pod'i nxs-stage/cronjob-cron-events-1573793820-xt6q9 ajastamine sÔlmele nxs-k8s-s2 on lubatud, sÔlm töötab ainult 21 pod'ist 110.
I1115 07:57:21.638383 1 predicates.go:829] Pod'i nxs-stage/cronjob-cron-events-1573793820-xt6q9 ajastamine sÔlmele nxs-k8s-s9 on lubatud, sÔlm töötab ainult 16 pod'ist 110.
I1115 07:57:21.638335 1 predicates.go:829] Pod'i nxs-stage/cronjob-cron-events-1573793820-xt6q9 ajastamine sÔlmele nxs-k8s-s8 on lubatud, sÔlm töötab ainult 18 pod'ist 110.
I1115 07:57:21.638408 1 predicates.go:829] Pod'i nxs-stage/cronjob-cron-events-1573793820-xt6q9 ajastamine sÔlmele nxs-k8s-s13 on lubatud, sÔlm töötab ainult 8 pod'ist 110.
I1115 07:57:21.638478 1 predicates.go:1369] Pod'i nxs-stage/cronjob-cron-events-1573793820-xt6q9 ajastamine sÔlmele nxs-k8s-s10 on lubatud, olemasolevad pod'ide anti-affinity tingimused on tÀidetud.
I1115 07:57:21.638505 1 predicates.go:1369] Pod'i nxs-stage/cronjob-cron-events-1573793820-xt6q9 ajastamine sÔlmele nxs-k8s-s8 on lubatud, olemasolevad pod'ide anti-affinity tingimused on tÀidetud.
I1115 07:57:21.638577 1 predicates.go:1369] Pod'i nxs-stage/cronjob-cron-events-1573793820-xt6q9 ajastamine sÔlmele nxs-k8s-s9 on lubatud, olemasolevad pod'ide anti-affinity tingimused on tÀidetud.
I1115 07:57:21.638583 1 predicates.go:829] Pod'i nxs-stage/cronjob-cron-events-1573793820-xt6q9 ajastamine sÔlmele nxs-k8s-s7 on lubatud, sÔlm töötab ainult 25 pod'ist 110.
I1115 07:57:21.638932 1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s10: Tasakaalustatud ressursside jaotamine, maht 39900 millicores 66620178432 mÀlubaidi, kogunÔue 2343 millicores 9640186880 mÀlubaidi, skoor 9
I1115 07:57:21.638946 1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s10: VÀhenenud ressursside jaotamine, maht 39900 millicores 66620178432 mÀlubaidi, kogunÔue 2343 millicores 9640186880 mÀlubaidi, skoor 8
I1115 07:57:21.638961 1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s9: Tasakaalustatud ressursside jaotamine, maht 39900 millicores 66620170240 mÀlubaidi, kogunÔue 4107 millicores 11307422720 mÀlubaidi, skoor 9
I1115 07:57:21.638971 1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s8: Tasakaalustatud ressursside jaotamine, maht 39900 millicores 66620178432 mÀlubaidi, kogunÔue 5847 millicores 24333637120 mÀlubaidi, skoor 7
I1115 07:57:21.638975 1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s9: VÀhenenud ressursside jaotamine, maht 39900 millicores 66620170240 mÀlubaidi, kogunÔue 4107 millicores 11307422720 mÀlubaidi, skoor 8
I1115 07:57:21.638990 1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s8: VÀhenenud ressursside jaotamine, maht 39900 millicores 66620178432 mÀlubaidi, kogunÔue 5847 millicores 24333637120 mÀlubaidi, skoor 7
I1115 07:57:21.639022 1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s10: TaintTolerationPriority, skoor: (10)
I1115 07:57:21.639030 1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s8: TaintTolerationPriority, skoor: (10)
I1115 07:57:21.639034 1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s9: TaintTolerationPriority, skoor: (10)
I1115 07:57:21.639041 1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s10: NodeAffinityPriority, skoor: (0)
I1115 07:57:21.639053 1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s8: NodeAffinityPriority, skoor: (0)
I1115 07:57:21.639059 1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s9: NodeAffinityPriority, skoor: (0)
I1115 07:57:21.639061 1 interpod_affinity.go:237] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s10: InterPodAffinityPriority, skoor: (0)
I1115 07:57:21.639063 1 selector_spreading.go:146] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s10: SelectorSpreadPriority, skoor: (10)
I1115 07:57:21.639073 1 interpod_affinity.go:237] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s8: InterPodAffinityPriority, skoor: (0)
I1115 07:57:21.639077 1 selector_spreading.go:146] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s8: SelectorSpreadPriority, skoor: (10)
I1115 07:57:21.639085 1 interpod_affinity.go:237] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s9: InterPodAffinityPriority, skoor: (0)
I1115 07:57:21.639088 1 selector_spreading.go:146] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s9: SelectorSpreadPriority, skoor: (10)
I1115 07:57:21.639103 1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s10: SelectorSpreadPriority, skoor: (10)
I1115 07:57:21.639109 1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s8: SelectorSpreadPriority, skoor: (10)
I1115 07:57:21.639114 1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s9: SelectorSpreadPriority, skoor: (10)
I1115 07:57:21.639127 1 generic_scheduler.go:781] SÔlm nxs-k8s-s10 => skoor 100037
I1115 07:57:21.639150 1 generic_scheduler.go:781] SÔlm nxs-k8s-s8 => skoor 100034
I1115 07:57:21.639154 1 generic_scheduler.go:781] SÔlm nxs-k8s-s9 => skoor 100037
I1115 07:57:21.639267 1 scheduler_binder.go:269] Oletan pod'i mahud pod'ile "nxs-stage/cronjob-cron-events-1573793820-xt6q9", sÔlm "nxs-k8s-s10"
I1115 07:57:21.639286 1 scheduler_binder.go:279] Oletan pod'i mahud pod'ile "nxs-stage/cronjob-cron-events-1573793820-xt6q9", sÔlm "nxs-k8s-s10": kÔik PVC'd on seotud ja pole midagi teha
I1115 07:57:21.639333 1 factory.go:733] Proovin siduda cronjob-cron-events-1573793820-xt6q9 nxs-k8s-s10'gaSiin nÀeme, et esialgu filtreerib scheduler ja koostab kolme sÔlme nimekirja, kus kÀivitamine on vÔimalik (nxs-k8s-s8, nxs-k8s-s9, nxs-k8s-s10). SeejÀrel arvutab see punktid mitmete parameetrite alusel (sealhulgas BalancedResourceAllocation, LeastResourceAllocation) iga kÔnealuse sÔlme jaoks, et mÀÀrata kÔige sobivam sÔlm. LÔpuks plaanitakse kÀivitamine kÔige rohkem punkte saanud sÔlmes (siin on koht, kus kaks sÔlme saavad samasuguse punktide arvu 100037, seetÔttu valitakse neist juhuslik, nimelt nxs-k8s-s10).
KokkuvĂ”te: kui sĂ”lmedes töötavad podid, mille jaoks ei ole piiranguid mÀÀratud, siis k8si jaoks (ressursikasutuse mĂ”ttes) on see sama nagu kui sellised podid ei oleks ĂŒldse olemas. SeetĂ”ttu, kui teil on nĂ€iteks pod, millel on ressursinĂ€ljane protsess (nt wowza) ja millele ei ole piiranguid mÀÀratud, vĂ”ib tekkida olukord, kus see pod on tegelikult söönud kĂ”ik sĂ”lme ressursid, kuid k8si jaoks loetakse see sĂ”lm mitte ĂŒlekoormatud ja sellel mÀÀratakse sama palju punkte hindamisel (nimelt k8si kergesti juurdepÀÀsetavuse punktides) nagu sĂ”lmele, millel pole töötavaid pode, mis lĂ”puks vĂ”ib viia koormuse ebaĂŒhtlase jaotumiseni sĂ”lmede vahel.
Podi vÀljaajamine
Nagu teada, mÀÀratakse igale podile ĂŒks kolmest QoS-klassist:
- garanteeritud â mÀÀratakse siis, kui iga konteineri jaoks podis on mÀÀratud memory ja cpu jaoks request ja limit, ning need vÀÀrtused peavad olema ĂŒhesugused
- burstable â vĂ€hemalt ĂŒhel konteineril podis on mÀÀratud request ja limit, ning request < limit
- parim pingutus â kui ĂŒhtegi konteinerit podis ei piirati ressursside osas
Kui sÔlmedes on tÀiendavaid ressursse (ketta, mÀluga) vÀhem, alustab kubelet podide jÀrjestamise ja vÀljatÔstmise protsessi, jÀrgides kindlat algoritmi, mis arvestab podi prioriteedi ja tema QoS-klassi. NÀiteks kui on jutt RAM-ist, siis QoS klassi pÔhjal mÀÀratakse punktid jÀrgmise pÔhimÔtte kohaselt:
- Tagatud: -998
- Parim Pingutus: 1000
- Purskamine: min(max(2, 1000 â (1000 * memoryRequestBytes) / machineMemoryCapacityBytes), 999)
See tÀhendab, et sama prioriteedi korral hakkab kubelet esmajoones vÀlja tÔstma sÔlmedest pod'e, millel on QoS-klassi parim pingutus.
KokkuvÔte: kui soovite vÀhendada vajaliku pod-i vÀljatÔstmise tÔenÀosust sÔlmest ressursipuuduse korral, siis peab lisaks prioriteedile olema hoolt kando ka request/limit mÀÀramise eest.
Rakenduste podide horisontaalpÔhine automaatne skaleerimine (HPA)
Kui eesmĂ€rgiks on automaatselt suurendada ja vĂ€iksemaks muuta pod'ide arvu sĂ”ltuvalt ressursside kasutusest (sĂŒsteemi â CPU/RAM vĂ”i kasutaja â rps), siis vĂ”ib selle lahendamiseks aidata selline k8s ĂŒksus nagu HPA (Horisontaalne Pod Automaatne Skaleerija). Selle algoritm seisneb jĂ€rgnevates detailides:
- MÀÀratakse vaadeldava ressursi (currentMetricValue) praegused nÀidud
- MÀÀratakse ressursi soovitud vÀÀrtused (desiredMetricValue), mis mÀÀratakse sĂŒsteemiressursside jaoks nĂ”ude kaudu
- MÀÀratakse hetke replikate arv (currentReplicas)
- JĂ€rgmise valemi alusel arvutatakse soovitud replikate arv (desiredReplicas)
desiredReplicas = [ currentReplicas * ( currentMetricValue / desiredMetricValue )]
Kuna skaleerimist ei toimu, kui koefitsient (currentMetricValue / desiredMetricValue) on lÀhedal 1 (samuti saame ise mÀÀrata lubatud vea, mille vaikevÀÀrtus on 0,1).
Vaatleme hpa toimimist rakenduse app-test nÀitel (mida on kirjeldatud kui Deployment), kus on vajalik muuta replikate arvu vastavalt CPU tarbimisele:
Rakenduse manifest
kind: Deployment apiVersion: apps/v1beta2 metadata: name: app-test spec: selector: matchLabels: app: app-test replicas: 2 template: metadata: labels: app: app-test spec: containers: - name: nginx image: registry.nixys.ru/generic-images/nginx imagePullPolicy: Always resources: requests: cpu: 60m ports: - name: http containerPort: 80 - name: nginx-exporter image: nginx/nginx-prometheus-exporter resources: requests: cpu: 30m ports: - name: nginx-exporter containerPort: 9113 args: - -nginx.scrape-uri - http://127.0.0.1:80/nginx-statusSee, et rakenduse kĂ€ivitamine toimub algselt kahes eksemplaris, millest igaĂŒhes on kaks konteinerit nginx ja nginx-exporter, millele on mÀÀratud requests CPU.
HPA manifest
apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: app-test-hpa spec: maxReplicas: 10 minReplicas: 2 scaleTargetRef: apiVersion: extensions/v1beta1 kind: Deployment name: app-test metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 30Seega, oleme loonud hpa, mis jĂ€lgib Deployment'i app-test ja reguleerib rakenduse pod'ide arvu CPU nĂ€itajate alusel (ootame, et pod tarbib 30% kĂŒsitud CPU-st), samas kui replikate arv jÀÀb vahemikku 2-10.
NĂŒĂŒd vaatame hpa toimimise mehhanismi, kui ĂŒhele pod'ile koormust rakendada:
# kubectl top pod NAME CPU(cores) MEMORY(bytes) app-test-78559f8f44-pgs58 101m 243Mi app-test-78559f8f44-cj4jz 4m 240Mi
KokkuvÔttes saame jÀrgmise:
- Soovitud vÀÀrtus (desiredMetricValue) â vastavalt hpa seadistustele on see 30%
- Praegune vÀÀrtus (currentMetricValue) â controller-manager arvutab keskmise ressursside tarbimise protsendi, st tĂ”enĂ€oliselt teeb jĂ€rgmist:
- Saab metrikate absoluutvÀÀrtused metrikaserverist, st 101m ja 4m
- Arvutab keskmise absoluutse vÀÀrtuse, st (101m + 4m) / 2 = 53m
- Hankige absoluutne vÀÀrtus soovitud ressursitarbimise jaoks (selleks liidetakse kÔigi konteinerite request'id) 60m + 30m = 90m
- Arvutab CPU tarbimise keskmise protsendi vÔrreldes poda request'iga, st 53m / 90m * 100% = 59%
NĂŒĂŒd on meil kĂ”ik vajalik, et mÀÀrata, kas replikaide arvu tuleb muuta, selleks arvutame koefitsiendi:
ratio = 59% / 30% = 1.96
St replikaide arvu tuleks suurendada ~2 korda ja see peaks olema [2 * 1.96] = 4.
VÀljund: Nagu nÀha, et see mehhanism toimiks, on vajalikud tingimused, sealhulgas requests'i olemasolu kÔigi konteinerite jaoks jÀlgitavas pod'is.
Klusteri automaatne horisontaalne skaleerimine (Cluster Autoscaler)
SĂŒsteemi negatiivse mĂ”ju leevendamiseks koormuse tĂ”usude ajal ei pruugi hpa olemasolu olla piisav. NĂ€iteks, hpa controller manager'i seade kohaselt otsustatakse, et replikaide arvu tuleb kahekordistada, kuid node'idel ei ole piisavalt ressursse sellise hulga pod'ide kĂ€itamiseks (st node ei saa pakkuda nĂ”utavaid ressursse pod'i requests) ja need pod'id lĂ€hevad Pending olekusse.
Selles olukorras, kui teenusepakkujal on vastav IaaS/PaaS (nÀiteks GKE/GCE, AKS, EKS jne), vÔib meid aidata selline tööriist nagu Node Autoscaler. See vÔimaldab seada klastris maksimaalne ja minimaalne node'i arv ning automaatselt reguleerida praegust node'ide arvu (kasutades pilveteenuse pakkuja API-d node'i tellimiseks/ kustutamiseks), kui klastris on ressursid puudulikud ja pod'e ei saa planeerida (nad on olekus Pending).
VÀljund: Node'ide automaatse skaleerimise vÔimaldamiseks on vajalik mÀÀrata pÀringud pod'i konteinerites, et k8s saaks Ôigesti hinnata node'ide koormust ning vastavalt teavitada, et jÀrgmise pod'i kÀitamiseks pole klastris ressursse.
KokkuvÔte
Oluline on mÀrkida, et konteineri ressursside piirangute seadmine ei ole rakenduse eduka kÀitamise kohustuslik tingimus, kuid see on siiski parem teha jÀrgmiste pÔhjuste tÔttu:
- Et scheduler toimiks tÀpsemalt node'ide vahelise koormuse jaotamise osas k8s
- Et vĂ€hendada vĂ”imalust âpod'i vĂ€ljatĂ”ukamiseâ sĂŒndmuseks
- Et korraldada rakenduse pod'ide horisontaalset automaatset skaleerimist (HPA)
- Horisontaalsete automaatsete skaalade (Cluster Autoscaling) tööks pilvteenuse pakkujate juures
Vaata ka teisi artikleid meie blogis:
Allikas: habr.com
