Kubernetes: għaliex huwa daqshekk importanti li tiġi kkonfigurata l-ġestjoni tar-riżorsi tas-sistema?

Bħala regola, dejjem hemm bżonn li tiġi pprovduta ġabra dedikata ta' riżorsi għal applikazzjoni għall-operat korrett u stabbli tagħha. Imma x'jiġri jekk diversi applikazzjonijiet qed jaħdmu fuq l-istess qawwa? Kif tipprovdi lil kull wieħed minnhom ir-riżorsi minimi meħtieġa? Kif tista' tillimita l-konsum tar-riżorsi? Kif tqassam b'mod korrett it-tagħbija bejn in-nodi? Kif tiżgura li l-mekkaniżmu tal-iskala orizzontali jaħdem jekk it-tagħbija tal-applikazzjoni tiżdied?

Kubernetes: għaliex huwa daqshekk importanti li tiġi kkonfigurata l-ġestjoni tar-riżorsi tas-sistema?

Trid tibda b'liema tipi ewlenin ta 'riżorsi jeżistu fis-sistema - dan, ovvjament, huwa ħin tal-proċessur u RAM. Fil-manifesti k8s dawn it-tipi ta’ riżorsi jitkejlu fl-unitajiet li ġejjin:

  • CPU - fil-qlub
  • RAM - f'bytes

Barra minn hekk, għal kull riżors huwa possibbli li jiġu stabbiliti żewġ tipi ta 'rekwiżiti - jitlob и limiti. Talbiet - jiddeskrivi r-rekwiżiti minimi għal riżorsi b'xejn ta 'node biex imexxi kontenitur (u pod kollu kemm hu), filwaqt li limiti jistabbilixxi limitu iebes fuq ir-riżorsi disponibbli għall-kontenitur.

Huwa importanti li wieħed jifhem li l-manifest m'għandux għalfejn jiddefinixxi b'mod espliċitu ż-żewġ tipi, iżda l-imġieba se tkun kif ġej:

  • Jekk il-limiti ta' riżorsa biss huma speċifikati b'mod espliċitu, allura t-talbiet għal din ir-riżors awtomatikament jieħdu valur ugwali għal-limiti (tista' tivverifika dan billi ċċempel entitajiet jiddeskrivu). Dawk. fil-fatt, il-kontenitur se jkun limitat għall-istess ammont ta 'riżorsi li jeħtieġ biex jaħdem.
  • Jekk talbiet biss huma speċifikati b'mod espliċitu għal riżorsa, allura l-ebda restrizzjonijiet ta 'fuq huma stabbiliti fuq din ir-riżorsa - i.e. il-kontenitur huwa limitat biss mir-riżorsi tan-node innifsu.

Huwa wkoll possibbli li tiġi kkonfigurata l-ġestjoni tar-riżorsi mhux biss fil-livell ta 'kontenitur speċifiku, iżda wkoll fil-livell tal-ispazju tal-isem bl-użu tal-entitajiet li ġejjin:

  • LimitRange — tiddeskrivi l-politika ta’ restrizzjoni fil-livell tal-kontenitur/miżwed f’ns u hija meħtieġa sabiex tiddeskrivi l-limiti awtomatiċi fuq il-kontenitur/miżwed, kif ukoll tipprevjeni l-ħolqien ta’ kontenituri/miżwed ovvjament xaħam (jew viċi versa), tillimita n-numru tagħhom u tiddetermina d-differenza possibbli fil-valuri fil-limiti u t-talbiet
  • Kwoti tar-Riżorsi — tiddeskrivi l-politika ta’ restrizzjoni b’mod ġenerali għall-kontenituri kollha f’ns u tintuża, bħala regola, biex tiddelimita r-riżorsi fost l-ambjenti (utli meta l-ambjenti mhumiex demarkati strettament fil-livell tan-nodi)

Dawn li ġejjin huma eżempji ta' manifesti li jistabbilixxu limiti tar-riżorsi:

  • Fil-livell speċifiku tal-kontenitur:

    containers:
    - name: app-nginx
      image: nginx
      resources:
        requests:
          memory: 1Gi
        limits:
          cpu: 200m

    Dawk. f'dan il-każ, biex tmexxi kontenitur b'nginx, ser ikollok bżonn mill-inqas 1G ta 'RAM ħielsa u 0.2 CPU fuq in-node, filwaqt li l-aktar il-kontenitur jista' jikkonsma 0.2 CPU u RAM kollha disponibbli fuq in-node.

  • Fil-livell integer ns:

    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: nxs-test
    spec:
      hard:
        requests.cpu: 300m
        requests.memory: 1Gi
        limits.cpu: 700m
        limits.memory: 2Gi

    Dawk. is-somma tal-kontenituri kollha tat-talba fin-ns default ma tistax taqbeż 300m għas-CPU u 1G għall-OP, u s-somma tal-limitu kollu hija 700m għas-CPU u 2G għall-OP.

  • Limiti default għal kontenituri f'ns:

    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: 4Gi

    Dawk. fl-ispazju tal-isem default għall-kontenituri kollha, it-talba se tkun issettjata għal 100m għal CPU u 1G għal OP, limitu - 1 CPU u 2G. Fl-istess ħin, huwa stabbilit ukoll limitu fuq il-valuri possibbli fit-talba/limitu għal CPU (50m < x < 2) u RAM (500M < x < 4G).

  • Restrizzjonijiet fil-livell tal-pods:

    apiVersion: v1
    kind: LimitRange
    metadata:
     name: nxs-limit-pod
    spec:
     limits:
     - type: Pod
       max:
         cpu: 4
         memory: 1Gi

    Dawk. għal kull pod fil-ns default se jkun hemm limitu ta '4 vCPU u 1G.

Issa nixtieq ngħidlek x'vantaġġi jista' jagħtina l-iffissar ta' dawn ir-restrizzjonijiet.

Mekkaniżmu tal-ibbilanċjar tat-tagħbija bejn in-nodi

Kif tafu, il-komponent k8s huwa responsabbli għad-distribuzzjoni tal-imżiewed fost in-nodi, bħal Scheduler, li jaħdem skond algoritmu speċifiku. Dan l-algoritmu jgħaddi minn żewġ stadji meta jagħżel in-nodu ottimali biex jitnieda:

  1. filtrazzjoni
  2. Li jvarjaw

Dawk. skond il-politika deskritta, inizjalment jintgħażlu nodi li fuqhom huwa possibbli li titnieda pod ibbażat fuq sett predikati (inkluż il-verifika jekk in-node għandux biżżejjed riżorsi biex imexxi l-pod - PodFitsResources), u mbagħad għal kull wieħed minn dawn in-nodi, skond prijoritajiet il-punti jingħataw (inkluż, iktar ma jkun hemm riżorsi ħielsa node, aktar punti jiġi assenjat - LeastResourceAllocation/LeastRequestedPriority/BalancedResourceAllocation) u l-pod jiġi mniedi fuq in-nodu bl-aktar punti (jekk diversi nodi jissodisfaw din il-kundizzjoni f’daqqa, allura tintgħażel waħda każwali).

Fl-istess ħin, trid tifhem li l-iskeder, meta jivvaluta r-riżorsi disponibbli ta 'node, huwa ggwidat mid-dejta li hija maħżuna f'etcd - i.e. għall-ammont tar-riżorsi mitluba/limitu ta 'kull pod li jaħdem fuq dan in-node, iżda mhux għall-konsum tar-riżorsi attwali. Din l-informazzjoni tista 'tinkiseb mill-output tal-kmand kubectl describe node $NODEper eżempju:

# 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%)

Hawnhekk naraw il-miżwed kollha jaħdmu fuq node speċifiku, kif ukoll ir-riżorsi li kull pods jitlob. U hawn kif jidhru r-reġistri tal-iskedar meta jitnieda l-pod cronjob-cron-events-1573793820-xt6q9 (din l-informazzjoni se tidher fil-ġurnal tal-iskedar meta tissettja l-10 livell tal-illoggjar fl-argumenti tal-kmand tal-istartjar -v=10):

zokk maqtugħ

I1115 07:57:21.637791       1 scheduling_queue.go:908] About to try and schedule pod nxs-stage/cronjob-cron-events-1573793820-xt6q9                                                                                                                                           
I1115 07:57:21.637804       1 scheduler.go:453] Attempting to schedule pod: nxs-stage/cronjob-cron-events-1573793820-xt6q9                                                                                                                                                    
I1115 07:57:21.638285       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s5 is allowed, Node is running only 16 out of 110 Pods.                                                                               
I1115 07:57:21.638300       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s6 is allowed, Node is running only 20 out of 110 Pods.                                                                               
I1115 07:57:21.638322       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s3 is allowed, Node is running only 20 out of 110 Pods.                                                                               
I1115 07:57:21.638322       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s4 is allowed, Node is running only 17 out of 110 Pods.                                                                               
I1115 07:57:21.638334       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s10 is allowed, Node is running only 16 out of 110 Pods.                                                                              
I1115 07:57:21.638365       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s12 is allowed, Node is running only 9 out of 110 Pods.                                                                               
I1115 07:57:21.638334       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s11 is allowed, Node is running only 11 out of 110 Pods.                                                                              
I1115 07:57:21.638385       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s1 is allowed, Node is running only 19 out of 110 Pods.                                                                               
I1115 07:57:21.638402       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s2 is allowed, Node is running only 21 out of 110 Pods.                                                                               
I1115 07:57:21.638383       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s9 is allowed, Node is running only 16 out of 110 Pods.                                                                               
I1115 07:57:21.638335       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s8 is allowed, Node is running only 18 out of 110 Pods.                                                                               
I1115 07:57:21.638408       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s13 is allowed, Node is running only 8 out of 110 Pods.                                                                               
I1115 07:57:21.638478       1 predicates.go:1369] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s10 is allowed, existing pods anti-affinity terms satisfied.                                                                         
I1115 07:57:21.638505       1 predicates.go:1369] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s8 is allowed, existing pods anti-affinity terms satisfied.                                                                          
I1115 07:57:21.638577       1 predicates.go:1369] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s9 is allowed, existing pods anti-affinity terms satisfied.                                                                          
I1115 07:57:21.638583       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s7 is allowed, Node is running only 25 out of 110 Pods.                                                                               
I1115 07:57:21.638932       1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s10: BalancedResourceAllocation, capacity 39900 millicores 66620178432 memory bytes, total request 2343 millicores 9640186880 memory bytes, score 9        
I1115 07:57:21.638946       1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s10: LeastResourceAllocation, capacity 39900 millicores 66620178432 memory bytes, total request 2343 millicores 9640186880 memory bytes, score 8           
I1115 07:57:21.638961       1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s9: BalancedResourceAllocation, capacity 39900 millicores 66620170240 memory bytes, total request 4107 millicores 11307422720 memory bytes, score 9        
I1115 07:57:21.638971       1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s8: BalancedResourceAllocation, capacity 39900 millicores 66620178432 memory bytes, total request 5847 millicores 24333637120 memory bytes, score 7        
I1115 07:57:21.638975       1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s9: LeastResourceAllocation, capacity 39900 millicores 66620170240 memory bytes, total request 4107 millicores 11307422720 memory bytes, score 8           
I1115 07:57:21.638990       1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s8: LeastResourceAllocation, capacity 39900 millicores 66620178432 memory bytes, total request 5847 millicores 24333637120 memory bytes, score 7           
I1115 07:57:21.639022       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s10: TaintTolerationPriority, Score: (10)                                                                                                        
I1115 07:57:21.639030       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s8: TaintTolerationPriority, Score: (10)                                                                                                         
I1115 07:57:21.639034       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s9: TaintTolerationPriority, Score: (10)                                                                                                         
I1115 07:57:21.639041       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s10: NodeAffinityPriority, Score: (0)                                                                                                            
I1115 07:57:21.639053       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s8: NodeAffinityPriority, Score: (0)                                                                                                             
I1115 07:57:21.639059       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s9: NodeAffinityPriority, Score: (0)                                                                                                             
I1115 07:57:21.639061       1 interpod_affinity.go:237] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s10: InterPodAffinityPriority, Score: (0)                                                                                                                   
I1115 07:57:21.639063       1 selector_spreading.go:146] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s10: SelectorSpreadPriority, Score: (10)                                                                                                                   
I1115 07:57:21.639073       1 interpod_affinity.go:237] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s8: InterPodAffinityPriority, Score: (0)                                                                                                                    
I1115 07:57:21.639077       1 selector_spreading.go:146] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s8: SelectorSpreadPriority, Score: (10)                                                                                                                    
I1115 07:57:21.639085       1 interpod_affinity.go:237] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s9: InterPodAffinityPriority, Score: (0)                                                                                                                    
I1115 07:57:21.639088       1 selector_spreading.go:146] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s9: SelectorSpreadPriority, Score: (10)                                                                                                                    
I1115 07:57:21.639103       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s10: SelectorSpreadPriority, Score: (10)                                                                                                         
I1115 07:57:21.639109       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s8: SelectorSpreadPriority, Score: (10)                                                                                                          
I1115 07:57:21.639114       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s9: SelectorSpreadPriority, Score: (10)                                                                                                          
I1115 07:57:21.639127       1 generic_scheduler.go:781] Host nxs-k8s-s10 => Score 100037                                                                                                                                                                            
I1115 07:57:21.639150       1 generic_scheduler.go:781] Host nxs-k8s-s8 => Score 100034                                                                                                                                                                             
I1115 07:57:21.639154       1 generic_scheduler.go:781] Host nxs-k8s-s9 => Score 100037                                                                                                                                                                             
I1115 07:57:21.639267       1 scheduler_binder.go:269] AssumePodVolumes for pod "nxs-stage/cronjob-cron-events-1573793820-xt6q9", node "nxs-k8s-s10"                                                                                                               
I1115 07:57:21.639286       1 scheduler_binder.go:279] AssumePodVolumes for pod "nxs-stage/cronjob-cron-events-1573793820-xt6q9", node "nxs-k8s-s10": all PVCs bound and nothing to do                                                                             
I1115 07:57:21.639333       1 factory.go:733] Attempting to bind cronjob-cron-events-1573793820-xt6q9 to nxs-k8s-s10

Hawnhekk naraw li inizjalment l-iskeder jiffiltra u jiġġenera lista ta 'nodi 3 li fuqhom jista' jiġi mniedi (nxs-k8s-s8, nxs-k8s-s9, nxs-k8s-s10). Imbagħad tikkalkula punteġġi bbażati fuq diversi parametri (inklużi BalancedResourceAllocation, LeastResourceAllocation) għal kull wieħed minn dawn in-nodi sabiex jiddetermina l-aktar nodu adattat. Fl-aħħar mill-aħħar, il-pod huwa skedat fuq in-nodu bl-ogħla numru ta 'punti (hawnhekk żewġ nodi f'daqqa għandhom l-istess numru ta' punti 100037, għalhekk jintgħażel wieħed każwali - nxs-k8s-s10).

Output: jekk node jmexxi l-imżiewed li għalihom m'hemm l-ebda restrizzjonijiet stabbiliti, allura għal k8s (mil-lat tal-konsum tar-riżorsi) dan ikun ekwivalenti għal bħallikieku ma kien hemm l-ebda imżiewed bħal dawn fuq dan in-node. Għalhekk, jekk inti, kondizzjonalment, għandek pod bi proċess gluttonous (per eżempju, wowza) u l-ebda restrizzjonijiet huma stabbiliti għaliha, allura tista 'tqum sitwazzjoni meta dan il-pod fil-fatt kiel ir-riżorsi kollha tan-node, iżda għal k8s dan in-node jitqies mhux mgħobbi u se jingħata l-istess numru ta 'punti meta jikklassifika (preċiżament f'punti li jivvalutaw ir-riżorsi disponibbli) bħala node li ma jkollux imżiewed tax-xogħol, li fl-aħħar mill-aħħar jista' jwassal għal distribuzzjoni irregolari tat-tagħbija bejn in-nodi.

Żgumbrament ta' Pod

Kif tafu, kull pod huwa assenjat waħda minn 3 klassijiet QoS:

  1. garantit — jiġi assenjat meta għal kull kontenitur fil-pod jiġu speċifikati talba u limitu għall-memorja u l-cpu, u dawn il-valuri jridu jaqblu
  2. jinfaqa — mill-inqas kontenitur wieħed fil-pod għandu talba u limitu, b'talba < limitu
  3. aħjar sforz — meta l-ebda kontenitur wieħed fil-miżwed ma jkun limitat fir-riżorsi

Fl-istess ħin, meta node jesperjenza nuqqas ta 'riżorsi (disk, memorja), kubelet jibda jikklassifika u jkeċċi l-imżiewed skond algoritmu speċifiku li jqis il-prijorità tal-pod u l-klassi QoS tiegħu. Pereżempju, jekk qed nitkellmu dwar RAM, imbagħad ibbażati fuq il-klassi QoS, il-punti jingħataw skont il-prinċipju li ġej:

  • Garantit:-998
  • BestEffort: 1000
  • Burstable: min(max(2, 1000 - (1000 * memoryRequestBytes) / machineMemoryCapacityBytes), 999)

Dawk. bl-istess prijorità, il-kubelet l-ewwel se jkeċċi l-imżiewed bl-aħjar klassi QoS tal-isforz min-node.

Output: jekk trid tnaqqas il-probabbiltà li l-powd mixtieq jiġi żgumbrat min-node fil-każ ta 'nuqqas ta' riżorsi fuqu, allura flimkien mal-prijorità, trid tieħu ħsieb ukoll li tistabbilixxi t-talba/limitu għaliha.

Mekkaniżmu għal awtoscaling orizzontali tal-poss tal-applikazzjoni (HPA)

Meta l-kompitu huwa li żżid u tnaqqas awtomatikament in-numru ta 'miżwed skond l-użu tar-riżorsi (sistema - CPU/RAM jew utent - rps), bħal entità k8s bħal HPA (Pod Autoscaler Orizzontali). L-algoritmu tiegħu huwa kif ġej:

  1. Il-qari kurrenti tar-riżors osservat huwa determinat (currentMetricValue)
  2. Il-valuri mixtieqa għar-riżors huma determinati (desiredMetricValue), li għar-riżorsi tas-sistema huma stabbiliti bl-użu tat-talba
  3. In-numru attwali ta' repliki huwa determinat (currentReplicas)
  4. Il-formula li ġejja tikkalkula n-numru mixtieq ta’ repliki (Repliki mixtieqa)
    wishedReplicas = [currentReplicas * ( currentMetricValue / wishedMetricValue )]

F'dan il-każ, l-iskala mhux se jseħħ meta l-koeffiċjent (currentMetricValue / wishedMetricValue) ikun qrib 1 (f'dan il-każ, nistgħu nissettjaw l-iżball permissibbli aħna stess; awtomatikament huwa 0.1).

Ejja nħarsu lejn kif taħdem hpa billi tuża l-eżempju tal-applikazzjoni tat-test tal-app (deskritta bħala Deployment), fejn huwa meħtieġ li jinbidel in-numru ta 'repliki skont il-konsum tas-CPU:

  • Manifest ta' applikazzjoni

    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-status

    Dawk. naraw li l-pod tal-applikazzjoni huwa inizjalment imniedi f'żewġ każijiet, li kull wieħed minnhom fih żewġ kontenituri nginx u nginx-exporter, li għal kull wieħed minnhom jitlob għal CPU.

  • Manifest HPA

    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: 30

    Dawk. Ħloqna hpa li se timmonitorja l-App-test ta’ Deployment u taġġusta n-numru ta’ pods bl-applikazzjoni bbażata fuq l-indikatur tal-cpu (nistennew li l-pod għandu jikkonsma 30% tas-CPU li jitlob), bin-numru ta’ repliki jkun fih il-medda ta '2-10.

    Issa, ejja nħarsu lejn il-mekkaniżmu tat-tħaddim tal-hpa jekk napplikaw tagħbija għal waħda mill-fuklar:

     # kubectl top pod
    NAME                                                   CPU(cores)   MEMORY(bytes)
    app-test-78559f8f44-pgs58            101m         243Mi
    app-test-78559f8f44-cj4jz            4m           240Mi

B'kollox għandna dan li ġej:

  • Il-valur mixtieq (desiredMetricValue) - skont is-settings tal-hpa, għandna 30%
  • Valur kurrenti (currentMetricValue) - għall-kalkolu, kontrollur-maniġer jikkalkula l-valur medju tal-konsum tar-riżorsi f'%, i.e. kondizzjonalment jagħmel dan li ġej:
    1. Jirċievi valuri assoluti tal-metriċi tal-pods mis-server tal-metriċi, i.e. 101m u 4m
    2. Jikkalkula l-valur assolut medju, i.e. (101m + 4m) / 2 = 53m
    3. Ikseb il-valur assolut għall-konsum tar-riżorsi mixtieq (għal dan, it-talbiet tal-kontenituri kollha huma magħduda) 60m + 30m = 90m
    4. Jikkalkula l-persentaġġ medju tal-konsum tas-CPU relattiv għall-pod tat-talba, i.e. 53m / 90m * 100% = 59%

Issa għandna dak kollu li għandna bżonn biex niddeterminaw jekk hemmx bżonn nibdlu n-numru ta 'repliki; biex nagħmlu dan, nikkalkulaw il-koeffiċjent:

ratio = 59% / 30% = 1.96

Dawk. in-numru ta 'repliki għandu jiżdied b'~2 darbiet u jammonta għal [2 * 1.96] = 4.

Konklużjoni: Kif tistgħu taraw, sabiex dan il-mekkaniżmu jaħdem, kundizzjoni meħtieġa hija l-preżenza ta 'talbiet għall-kontenituri kollha fil-pod osservat.

Mekkaniżmu għal awtoscaling orizzontali tan-nodi (Cluster Autoscaler)

Sabiex jinnewtralizza l-impatt negattiv fuq is-sistema waqt żidiet fit-tagħbija, li jkollok hpa konfigurat mhuwiex biżżejjed. Pereżempju, skont is-settings fil-maniġer tal-kontrollur hpa, jiddeċiedi li n-numru ta' repliki jeħtieġ li jiżdied b'2 darbiet, iżda n-nodi m'għandhomx riżorsi b'xejn biex imexxu tali numru ta' imżiewed (jiġifieri n-nodu ma jistax jipprovdi l- riżorsi mitluba lill-pods talbiet) u dawn il-miżwed jaqilbu għall-istat Pendenti.

F'dan il-każ, jekk il-fornitur ikollu IaaS/PaaS korrispondenti (pereżempju, GKE/GCE, AKS, EKS, eċċ.), għodda bħal Node Autoscaler. Jippermettilek li tissettja n-numru massimu u minimu ta’ nodi fil-cluster u taġġusta awtomatikament in-numru attwali ta’ nodi (billi ssejjaħ lill-API tal-fornitur tas-sħab biex tordna/tneħħi nodu) meta jkun hemm nuqqas ta’ riżorsi fil-cluster u l-imżiewed ma jistgħux jiġu skedati (huma fl-istat Pendenti).

Konklużjoni: Biex tkun tista 'tagħmel skala awtomatika in-nodi, huwa meħtieġ li jiġu stabbiliti talbiet fil-kontenituri tal-pods sabiex il-k8s ikunu jistgħu jivvalutaw b'mod korrett it-tagħbija fuq in-nodi u għalhekk jirrapportaw li m'hemm l-ebda riżorsi fil-cluster biex iniedu l-pod li jmiss.

Konklużjoni

Għandu jiġi nnutat li l-iffissar ta' limiti tar-riżorsi tal-kontejners mhuwiex rekwiżit biex l-applikazzjoni taħdem b'suċċess, iżda xorta huwa aħjar li tagħmel dan għar-raġunijiet li ġejjin:

  1. Għal tħaddim aktar preċiż tal-ischeduler f'termini ta 'ibbilanċjar tat-tagħbija bejn in-nodi k8s
  2. Biex titnaqqas il-probabbiltà li jseħħ avveniment ta' "żgumbrament tal-pod".
  3. Għall-autoscaling orizzontali tal-imżiewed tal-applikazzjoni (HPA) biex jaħdmu
  4. Għal awtoscaling orizzontali tan-nodi (Cluster Autoscaling) għall-fornituri tal-cloud

Aqra wkoll artikli oħra fuq il-blog tagħna:

Sors: www.habr.com

Żid kumment