Кубернетес: чаро ташкили идоракунии захираҳои система ин қадар муҳим аст?

Чун қоида, ҳамеша зарурати таъмини захираҳои ҷудошуда ба барнома барои кори дуруст ва устувори он вуҷуд дорад. Аммо чӣ мешавад, агар якчанд барнома бо як қудрат кор кунанд? Хар кадоми онхоро бо минимуми ресурсхои зарурй чй тавр таъмин кардан мумкин аст? Чӣ тавр шумо метавонед истеъмоли захираҳоро маҳдуд кунед? Чӣ тавр дуруст тақсим кардани сарборӣ дар байни гиреҳҳо? Чӣ тавр таъмин кардани кори механизми миқёси уфуқӣ ҳангоми зиёд шудани сарбории барнома?

Кубернетес: чаро ташкили идоракунии захираҳои система ин қадар муҳим аст?

Шумо бояд аз он оғоз кунед, ки кадом намудҳои асосии захираҳо дар система мавҷуданд - ин, албатта, вақти протсессор ва RAM мебошад. Дар зуҳури k8s ин намуди захираҳо дар воҳидҳои зерин чен карда мешаванд:

  • CPU - дар ядроҳо
  • RAM - дар байт

Ғайр аз он, барои ҳар як захира ду намуди талаботро муқаррар кардан мумкин аст - дархостҳо и маҳдудиятҳо. Дархостҳо - талаботҳои ҳадди ақалро барои захираҳои ройгони гиреҳ барои идора кардани контейнер тавсиф мекунад (ва дар маҷмӯъ pod), дар ҳоле ки маҳдудиятҳо маҳдудияти сахти захираҳои барои контейнерро муқаррар мекунад.

Фаҳмидани он муҳим аст, ки манифест набояд ҳарду намудро ба таври возеҳ муайян кунад, аммо рафтор чунин хоҳад буд:

  • Агар танҳо маҳдудиятҳои манбаъ ба таври возеҳ нишон дода шуда бошанд, пас дархостҳо барои ин манбаъ ба таври худкор арзиши баробар ба маҳдудиятҳо мегиранд (шумо метавонед инро тавассути занг задан ба объектҳои тавсифшуда тафтиш кунед). Онхое. дар асл, контейнер бо ҳамон миқдори захираҳое, ки барои кор кардан лозим аст, маҳдуд карда мешавад.
  • Агар танҳо дархостҳо ба таври возеҳ барои манба нишон дода шуда бошанд, пас дар ин манбаъ маҳдудиятҳои болоӣ муқаррар карда намешаванд - яъне. контейнер танҳо бо захираҳои худи гиреҳ маҳдуд аст.

Идоракунии захираҳоро на танҳо дар сатҳи контейнери мушаххас, балки дар сатҳи фазои номҳо бо истифода аз объектҳои зерин низ танзим кардан мумкин аст:

  • Маҳдудият — сиёсати маҳдудкуниро дар сатҳи контейнер/под дар ns тавсиф мекунад ва барои тавсифи маҳдудиятҳои пешфарз дар контейнер/под, инчунин пешгирии эҷоди контейнер/подҳои баръало фарбеҳ (ё баръакс), маҳдуд кардани шумораи онҳо зарур аст. ва фарқияти эҳтимолии арзишҳоро дар маҳдудиятҳо ва дархостҳо муайян кунед
  • Квотаҳои захиравӣ — сиёсати маҳдудкуниро дар маҷмӯъ барои ҳама контейнерҳо дар ns тавсиф кунед ва чун қоида, барои ҷудо кардани захираҳо дар байни муҳитҳо истифода мешавад (вақте ки муҳитҳо дар сатҳи гиреҳ ба таври қатъӣ ҷудо карда нашудаанд, муфид аст)

Дар зер намунаҳои манифестҳо мавҷуданд, ки маҳдудиятҳои захираҳоро муқаррар мекунанд:

  • Дар сатҳи мушаххаси контейнер:

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

    Онхое. дар ин ҳолат, барои кор кардани контейнер бо nginx, ба шумо ҳадди аққал 1G RAM-и ройгон ва 0.2 CPU дар гиреҳ лозим аст, дар ҳоле ки ҳадди аксар контейнер метавонад 0.2 CPU ва ҳама RAM-и дастрасро дар гиреҳ истеъмол кунад.

  • Дар сатҳи бутуни ns:

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

    Онхое. маблағи ҳамаи контейнерҳои дархост дар ns пешфарз наметавонад аз 300m барои CPU ва 1G барои OP зиёд бошад ва маблағи ҳамаи маҳдудият 700m барои CPU ва 2G барои OP аст.

  • Маҳдудиятҳои пешфарз барои контейнерҳо дар 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

    Онхое. дар фазои номи пешфарз барои ҳама контейнерҳо, дархост ба 100м барои CPU ва 1G барои OP муқаррар карда мешавад, маҳдудият - 1 CPU ва 2G. Дар айни замон, маҳдудият инчунин дар арзишҳои имконпазир дар дархост/лимити CPU (50m <x<2) ва RAM (500M <x <4G) муқаррар карда мешавад.

  • Маҳдудиятҳои сатҳи pod:

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

    Онхое. барои ҳар як pod дар ns пешфарз маҳдудияти 4 vCPU ва 1G хоҳад буд.

Ҳоло ман мехоҳам ба шумо бигӯям, ки муқаррар кардани ин маҳдудиятҳо ба мо чӣ бартарият дода метавонад.

Механизми мувозинати сарборӣ байни гиреҳҳо

Тавре ки шумо медонед, ҷузъҳои k8s барои тақсимоти поддонҳо дар байни гиреҳҳо, ба монанди планкаш, ки аз руи алгоритми муайян кор мекунад. Ин алгоритм ҳангоми интихоби гиреҳи оптималии оғозёбӣ аз ду марҳила мегузарад:

  1. полиши
  2. Ранг

Онхое. мувофиқи сиёсати тавсифшуда, гиреҳҳо дар аввал интихоб карда мешаванд, ки дар онҳо подкастро дар асоси маҷмӯа оғоз кардан мумкин аст предикатхо (аз ҷумла тафтиш кардани он, ки оё гиреҳ дорои захираҳои кофӣ барои кор кардани pod - PodFitsResources) ва сипас барои ҳар як аз ин гиреҳҳо, мувофиқи афзалиятҳо холҳо дода мешаванд (аз он ҷумла, гиреҳ ҳар қадар захираҳои озод дошта бошад, ҳамон қадар ба он холҳо дода мешавад - LeastResourceAllocation/LeastRequestedPriority/BalancedResourceAllocation) ва подкаст дар гиреҳе, ки холҳои зиёд дорад (агар якчанд гиреҳ якбора ин шартро қонеъ гардонад) оғоз мешавад. як тасодуфӣ интихоб карда мешавад).

Дар айни замон, шумо бояд фаҳмед, ки нақшакаш ҳангоми арзёбии захираҳои мавҷудаи гиреҳ маълумотеро, ки дар etcd нигоҳ дошта мешавад, роҳнамоӣ мекунад - яъне. барои маблағи дархостшуда/маҳдудии манбаи ҳар як подкӯҳе, ки дар ин гиреҳ кор мекунад, аммо на барои истеъмоли воқеии захираҳо. Ин маълумотро аз баромади фармон гирифтан мумкин аст kubectl describe node $NODE, масалан:

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

Дар ин ҷо мо мебинем, ки ҳамаи подкҳо дар гиреҳи мушаххас кор мекунанд ва инчунин захираҳое, ки ҳар як подк дархост мекунад. Ва ин аст, ки гузоришҳои нақшакаш ҳангоми ба кор андохтани pod cronjob-cron-events-1573793820-xt6q9 чӣ гуна ба назар мерасанд (ин маълумот дар сабти банақшагир ҳангоми муқаррар кардани сатҳи 10-уми сабти ном дар аргументҳои фармони оғозёбӣ -v=10 пайдо мешавад):

сабт

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

Дар ин ҷо мо мебинем, ки нақшасоз дар аввал рӯйхати 3 гиреҳро филтр мекунад ва тавлид мекунад, ки дар онҳо онро оғоз кардан мумкин аст (nxs-k8s-s8, nxs-k8s-s9, nxs-k8s-s10). Сипас он холҳоро дар асоси якчанд параметрҳо (аз ҷумла BalancedResourceAllocation, LeastResourceAllocation) барои ҳар яке аз ин гиреҳҳо бо мақсади муайян кардани гиреҳи мувофиқтарин ҳисоб мекунад. Дар ниҳоят, поддон дар гиреҳ бо шумораи бештари нуқтаҳо ба нақша гирифта шудааст (дар ин ҷо ду гиреҳ якбора шумораи якхелаи нуқтаҳои 100037 доранд, бинобар ин як тасодуфӣ интихоб карда мешавад - nxs-k8s-s10).

хулоса: агар гиреҳ подкҳоро иҷро кунад, ки барои онҳо ҳеҷ гуна маҳдудият муқаррар карда нашудааст, пас барои k8s (аз нуқтаи назари истеъмоли захираҳо) ин ба он баробар хоҳад буд, ки гӯё дар ин гиреҳ чунин подкҳо умуман вуҷуд надоштанд. Аз ин рӯ, агар шумо, шартан, як паҳлӯи дорои раванди пурхӯрӣ (масалан, wowza) дошта бошед ва барои он ҳеҷ гуна маҳдудият муқаррар карда нашуда бошад, пас вазъият метавонад ба миён ояд, ки ин поддон воқеан тамоми захираҳои гиреҳро хӯрд, аммо барои k8s ин гиреҳ холӣ ҳисобида мешавад ва ба он ҳангоми рейтинг (махз аз рӯи холҳои баҳодиҳии захираҳои мавҷуда) ҳамчун гиреҳе, ки қуттиҳои корӣ надоранд, ҳамон миқдор хол дода мешавад, ки дар ниҳоят метавонад ба тақсимоти нобаробари сарборӣ дар байни гиреҳҳо оварда расонад.

ихроҷи Под

Тавре ки шумо медонед, ба ҳар як pod яке аз 3 синфи QoS таъин карда мешавад:

  1. кафолат дода шудааст - вақте таъин карда мешавад, ки барои ҳар як контейнер дар подкаст дархост ва маҳдудият барои хотира ва CPU муайян карда мешавад ва ин арзишҳо бояд мувофиқат кунанд
  2. тарканда — акаллан як контейнер дар подшох дархост ва лимит дорад, бо дархост < лимити
  3. беҳтарин кӯшишҳои — вакте ки ягон контейнер дар подшох захираи махдуд нест

Ҳамзамон, вақте ки гиреҳ норасоии захираҳоро (диск, хотира) эҳсос мекунад, kubelet ба гурӯҳбандӣ ва хориҷ кардани поддонҳо мувофиқи алгоритми мушаххасе оғоз мекунад, ки афзалияти подк ва синфи QoS-и онро ба назар мегирад. Масалан, агар мо дар бораи RAM сухан ронем, пас дар асоси синфи QoS, холҳо мувофиқи принсипи зерин дода мешаванд:

  • Кафолат дода мешавад: -998
  • Беҳтарин кӯшиш: 1000
  • Таркибшаванда: дақ (макс (2, 1000 - (1000 * memoryRequestBytes) / machineMemoryCapacityBytes), 999)

Онхое. бо ҳамон афзалият, кубелет аввал бо кӯшиши беҳтарин синфи QoS аз гиреҳ қубурҳоро хориҷ мекунад.

хулоса: агар шумо хоҳед, ки эҳтимолияти аз гиреҳ хориҷ шудани pod-и дилхоҳро дар сурати набудани захираҳо дар он кам кунед, пас дар баробари афзалият, шумо бояд дар бораи муқаррар кардани дархост/лимити он низ ғамхорӣ кунед.

Механизми автоматизатсияи уфуқии қуттиҳои барнома (HPA)

Ҳангоме ки вазифа вобаста ба истифодаи захираҳо (система - CPU/RAM ё корбар - rps) ба таври худкор зиёд ва кам кардани шумораи подкҳо аст, ба монанди объекти k8s, ба монанди HPA (Уфуқӣ Pod Autoscaler). Алгоритми он чунин аст:

  1. Хонишҳои ҷории манбаи мушоҳидашуда муайян карда мешаванд (currentMetricValue)
  2. Арзишҳои дилхоҳ барои захира муайян карда мешаванд (desiredMetricValue), ки барои захираҳои система бо истифода аз дархост муқаррар карда мешаванд
  3. Шумораи ҷории репликаҳо муайян карда мешавад (currentReplicas)
  4. Формулаи зерин шумораи дилхоҳи такрорҳоро ҳисоб мекунад (desiredReplicas)
    wantdReplicas = [CurrentReplicas * (currentMetricValue / desiredMetricValue)]

Дар ин ҳолат, вақте ки коэффитсиент (currentMetricValue / desiredMetricValue) ба 1 наздик аст, миқёскунӣ рух намедиҳад (дар ин ҳолат мо метавонем хатои иҷозатдодашударо худамон муқаррар кунем; бо нобаёнӣ он 0.1 аст).

Биёед бубинем, ки hpa бо истифода аз мисоли барномаи санҷиши барнома (бо истинод тавсиф шудааст) чӣ гуна кор мекунад, ки дар он ҷо вобаста ба истеъмоли CPU шумораи репликаҳоро тағир додан лозим аст:

  • Манифести ариза

    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

    Онхое. мо мебинем, ки подшипникҳои барнома дар аввал дар ду маврид оғоз мешаванд, ки ҳар яки онҳо ду контейнери nginx ва nginx-exporter доранд, ки барои ҳар кадоми онҳо як контейнер муайян карда шудааст. дархостҳо барои CPU.

  • Манифести 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

    Онхое. Мо hpa-ро офаридаем, ки санҷиши барномаи Deployment-ро назорат мекунад ва шумораи подкҳоро бо барнома дар асоси нишондиҳандаи cpu танзим мекунад (мо интизорем, ки pod бояд 30% CPU-и дархосткардаашро истеъмол кунад), бо шумораи репликаҳо дар диапазони 2-10.

    Акнун биёед механизми кори hpa-ро дида бароем, агар ба яке аз оташдонҳо бор гузорем:

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

Дар маҷмӯъ мо инҳоро дорем:

  • Арзиши дилхоҳ (desiredMetricValue) - мувофиқи танзимоти hpa, мо 30% дорем
  • Арзиши ҷорӣ (currentMetricValue) - барои ҳисоб, контроллер-менеҷер арзиши миёнаи истеъмоли захираҳоро бо % ҳисоб мекунад, яъне. шартан зеринро иҷро мекунад:
    1. Аз сервери метрикӣ арзишҳои мутлақи ченакҳои подшоиро мегирад, яъне. 101м ва 4м
    2. Қимати миёнаи мутлақро ҳисоб мекунад, яъне. (101м + 4м) / 2 = 53м
    3. Арзиши мутлақи истеъмоли захираҳои дилхоҳро мегирад (барои ин дархостҳои ҳама контейнерҳо ҷамъбаст карда мешаванд) 60м + 30м = 90м
    4. Ҳисоб кардани фоизи миёнаи истеъмоли CPU нисбат ба pod дархост, яъне. 53м / 90м * 100% = 59%

Ҳоло мо ҳама чизро дорем, то муайян кунем, ки оё мо бояд шумораи репликаҳоро тағир диҳем; барои ин, мо коэффисиентро ҳисоб мекунем:

ratio = 59% / 30% = 1.96

Онхое. шумораи репликаҳо бояд ~ 2 маротиба зиёд карда шаванд ва ба [2 * 1.96] = 4 баробар шаванд.

Хулоса: Тавре ки шумо мебинед, барои кор кардани ин механизм, шарти зарурӣ мавҷудияти дархостҳо барои ҳама контейнерҳо дар паҳлӯи мушоҳидашуда мебошад.

Механизми автоматизатсияи уфуқии гиреҳҳо (Cluster Autoscaler)

Барои безарар кардани таъсири манфӣ ба система ҳангоми афзоиши сарборӣ, доштани hpa танзимшуда кофӣ нест. Масалан, мувофиқи танзимот дар менеҷери контроллери hpa, он қарор мекунад, ки шумораи репликаҳоро 2 маротиба зиёд кардан лозим аст, аммо гиреҳҳо барои иҷро кардани чунин шумораи подкҳо захираҳои ройгон надоранд (яъне гиреҳ наметавонад захираҳои дархостшуда ба поди дархостҳо) ва ин подкладҳо ба ҳолати интизорӣ мегузаранд.

Дар ин ҳолат, агар провайдер дорои IaaS/PaaS мувофиқ бошад (масалан, GKE/GCE, AKS, EKS ва ғайра), асбобе монанди Autoscaler гиреҳ. Он ба шумо имкон медиҳад, ки шумораи ҳадди аксар ва ҳадди ақали гиреҳҳоро дар кластер муқаррар кунед ва ба таври худкор шумораи ҷории гиреҳҳоро танзим кунед (тавассути занг ба провайдери абрии API барои фармоиш/нест кардани гиреҳ) ҳангоми набудани захираҳо дар кластер ва поддонҳо ба нақша гирифтан мумкин нест (дар ҳолати интизорӣ ҳастанд).

Хулоса: Барои қобилияти автоматии гиреҳҳо, зарур аст, ки дархостҳоро дар контейнерҳои подкӣ насб кунед, то k8s сарбориро ба гиреҳҳо дуруст арзёбӣ кунанд ва мувофиқан гузориш диҳанд, ки дар кластер захираҳо барои оғоз кардани паҳлӯи навбатӣ вуҷуд надоранд.

хулоса

Бояд қайд кард, ки муқаррар кардани маҳдудияти захираҳои контейнерӣ барои бомуваффақият кор кардани барнома шарт нест, аммо бо сабабҳои зерин ин корро кардан беҳтар аст:

  1. Барои кори дақиқтари нақшакаш дар робита бо мувозинати сарбории байни гиреҳҳои k8s
  2. Барои кам кардани эҳтимолияти ба амал омадани ҳодисаи "кӯчонидан"
  3. Барои ба кор даровардани автоматии уфуқӣ қуттиҳои барнома (HPA).
  4. Барои автоматизатсияи уфуқии гиреҳҳо (Cluster Autoscaling) барои провайдерҳои абр

Инчунин мақолаҳои дигарро дар блоги мо хонед:

Манбаъ: will.com

Илова Эзоҳ