Kubernetes: kutheni kubaluleke kangaka ukuqwalasela ulawulo lwemithombo yenkqubo?

Njengomthetho, kukho imfuneko yokubonelela ngedama elizinikeleyo lezibonelelo kwisicelo sokusebenza kwayo ngokuchanekileyo kunye nokuzinza. Kodwa kuthekani ukuba izicelo ezininzi zisebenza kumandla afanayo? Indlela yokubonelela ngamnye kubo ngezona zixhobo zincinci ziyimfuneko? Ungakunciphisa njani ukusetyenziswa kobutyebi? Indlela yokuhambisa ngokuchanekileyo umthwalo phakathi kweenodi? Uqinisekisa njani ukuba indlela yokukala ethe tyaba iyasebenza ukuba umthwalo wesicelo uyenyuka?

Kubernetes: kutheni kubaluleke kangaka ukuqwalasela ulawulo lwemithombo yenkqubo?

Kufuneka uqale ngeziphi iintlobo eziphambili zezixhobo ezikhoyo kwinkqubo - oku, ngokuqinisekileyo, lixesha leprosesa kunye ne-RAM. Kwii-k8s zibonakalisa ezi ntlobo zemithombo zilinganiswa kwezi yunithi zilandelayo:

  • CPU - kwiicores
  • RAM - ngebytes

Ngaphezu koko, kwisixhobo ngasinye kunokwenzeka ukuseta iindidi ezimbini zeemfuno - izicelo ΠΈ Imida. Izicelo - ichaza iimfuno ezincinci zezibonelelo zamahhala ze-node yokuqhuba isitya (kunye ne-pod yonke), ngelixa imida ibeka umda onzima kwizibonelelo ezikhoyo kwisitya.

Kubalulekile ukuqonda ukuba i-manifest ayifuni ukuchaza ngokucacileyo zombini iindidi, kodwa ukuziphatha kuya kuba ngolu hlobo lulandelayo:

  • Ukuba kuphela imida yobutyebi echazwe ngokucacileyo, ngoko ke izicelo zesi sixhobo zithatha ngokuzenzekelayo ixabiso elilingana nemida (ungakuqinisekisa oku ngokubiza amaqumrhu achazayo). Ezo. eneneni, isikhongozeli siya kulinganiselwa kwisixa esifanayo semithombo esiyifunayo ukuze siqhube.
  • Ukuba kuphela izicelo ezichazwe ngokucacileyo kwisixhobo, ngoko akukho zithintelo eziphezulu zisekiweyo kwesi sixhobo - okt. isikhongozeli sithintelwe kuphela yimithombo ye-node ngokwayo.

Kukwayenzeka ukuba uqwalasele ulawulo lwezibonelelo kungekuphela nje kwinqanaba lesikhongozeli esithile, kodwa nakwinqanaba lendawo yegama usebenzisa ezi zigqeba zilandelayo:

  • LimitRange β€” ichaza umgaqo-nkqubo wothintelo kwinqanaba lesikhongozeli/yepod kwi-ns kwaye iyafuneka ukuze kuchazwe imida engagqibekanga kwisikhongozeli/ipod, kunye nokuthintela ukwenziwa kwezikhongozeli zamafutha/iipod ezicacileyo (okanye ngokuphendululekileyo), ukunciphisa inani labo kwaye umisele umahluko onokwenzeka kumaxabiso kwimida kunye nezicelo
  • ResourceQuotas β€” chaza umgaqo-nkqubo wothintelo ngokubanzi kuzo zonke izikhongozeli kwi-ns kwaye isetyenziswa, njengomthetho, ukucanda izixhobo phakathi kokusingqongileyo (iluncedo xa iimeko-bume zingacandwa ngokungqongqo kwinqanaba le-node)

Le ilandelayo yimizekelo yemiboniso emisela imida yemithombo:

  • Kwinqanaba lesikhongozeli esithile:

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

    Ezo. kule meko, ukuqhuba isikhongozeli ngenginx, uya kufuna ubuncinci i-1G ye-RAM yasimahla kunye ne-0.2 CPU kwi-node, ngelixa uninzi lwesitya sinokutya i-0.2 CPU kunye nayo yonke i-RAM ekhoyo kwindawo.

  • Kwinqanaba elipheleleyo ns:

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

    Ezo. isixa sazo zonke izikhongozeli zesicelo kwi-ns engagqibekanga ayinakudlula i-300m ye-CPU kunye ne-1G ye-OP, kwaye isixa sayo yonke umda yi-700m ye-CPU kunye ne-2G ye-OP.

  • Imida ehlala ikho kwizikhongozeli kwi-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

    Ezo. kwisithuba samagama esingagqibekanga kuzo zonke izikhongozeli, isicelo siya kumiselwa kwi-100m ye-CPU kunye ne-1G ye-OP, umda - 1 CPU kunye ne-2G. Kwangaxeshanye, umda umiselwe kwakhona kumaxabiso anokwenzeka kwisicelo/umda we-CPU (50m <x <2) kunye ne-RAM (500M <x <4G).

  • Izithintelo zomgangatho wePod ns:

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

    Ezo. kwipod nganye kwi-ns engagqibekanga kuya kubakho umda we-4 vCPU kunye ne-1G.

Ngoku ndingathanda ukukuxelela ukuba zeziphi iingenelo zokumisela ezi zithintelo ezinokusinika.

Indlela yokulinganisa ukulayisha phakathi kweenodi

Njengoko usazi, icandelo le-k8s linoxanduva lokusasazwa kweepod phakathi kweenodi, njenge umcwangcisi, esebenza ngokwe-algorithm ethile. Le algorithm ihamba ngamanqanaba amabini xa ukhetha indawo efanelekileyo yokuqalisa:

  1. Ukucoca
  2. Ukutshintsha

Ezo. ngokomgaqo-nkqubo ochaziweyo, ii-nodes zikhethwa ekuqaleni apho kunokwenzeka ukuba uqalise i-pod ngokusekelwe kwisethi izibikezelo (kubandakanya ukujonga ukuba i-node inezixhobo ezaneleyo zokusebenzisa i-PodFitsResources), kwaye ke nganye kwezi nodi, ngokutsho Priorities amanqaku anikezelwa (kubandakanywa, izibonelelo ezininzi ezikhululekileyo i-node inazo, amanqaku amaninzi ayabelwe - LeastResourceAllocation/LeastRequestedPriority/BalancedResourceAllocation) kwaye i-pod iqaliswe kwi-node ngamanqaku amaninzi (ukuba iindawo ezininzi ziyanelisa le meko kanye, ngoko enye ikhethiwe) .

Ngexesha elifanayo, kufuneka uqonde ukuba umcwangcisi, xa uvavanya izixhobo ezikhoyo ze-node, zikhokelwa yidatha egcinwe kwi-etcd - i.e. malunga nesixa esiceliweyo/somda wesibonelelo sepod nganye esebenzayo kule nodi, kodwa hayi olona setyenziso lovimba. Olu lwazi lunokufumaneka kwisiphumo somyalelo kubectl describe node $NODE, umzekelo:

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

Apha sibona zonke iipod ezisebenza kwindawo ethile, kunye nezixhobo ezicelwayo nganye. Kwaye nantsi indlela iilog zomcwangcisi ezijongeka ngayo xa i-cronjob-cron-events-1573793820-xt6q9 pod isungulwa (olu lwazi luya kuvela kwilog yomcwangcisi xa ucwangcisa inqanaba lokuloga le-10 kwiingxoxo zomyalelo wokuqalisa -v=10):

log

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

Apha siyabona ukuba ekuqaleni umcwangcisi wokucoca kwaye enze uluhlu lwee-nodes ezi-3 apho inokuqaliswa khona (nxs-k8s-s8, nxs-k8s-s9, nxs-k8s-s10). Emva koko ibala amanqaku ngokusekelwe kwiiparamitha ezininzi (kuquka i-BalancedResourceAllocation, LeastResourceAllocation) kwindawo nganye yezi ndawo ukuze kumiselwe eyona node ifanelekileyo. Ekugqibeleni, i-pod icwangciswe kwi-node kunye nenani eliphezulu lamanqaku (apha ama-nodes amabini ngexesha elinye anenani elifanayo lamanqaku 100037, ngoko ke kukhethwe i-random - nxs-k8s-s10).

isiphelo: ukuba i-node iqhuba ii-pods apho kungekho zithintelo zibekiweyo, ngoko ke kwi-k8s (ukusuka kwindawo yokujonga ukusetyenziswa kobutyebi) oku kuya kufana nokuba akukho mida enjalo kule nodi konke konke. Ke ngoko, ukuba wena, ngokwemiqathango, une-pod enenkqubo edla-kudla (umzekelo, wowza) kwaye akukho zithintelo zibekiweyo, ke imeko inokuvela xa le pod itye ngokwenene zonke izibonelelo ze-node, kodwa nge-k8s le node. ithathwa njengengalayishwanga kwaye iya kunikwa inani elifanayo lamanqaku xa ihlelwa (ngokuchanekileyo kumanqaku avavanya izixhobo ezikhoyo) njenge-node engenazo iipod ezisebenzayo, ezinokuthi ekugqibeleni zikhokelela ekuhanjisweni okungalinganiyo komthwalo phakathi kweendawo zokuhlala.

Ukukhutshwa kwePod

Njengoko usazi, ipod nganye yabelwa enye yeeklasi ezi-3 zeQoS:

  1. iqinisekisiwe - inikezelwe xa isikhongozeli ngasinye kwipod isicelo kunye nomda ukhankanyiwe kwimemori kunye neCPU, kwaye la maxabiso kufuneka ahambelane
  2. kuqhuma - ubuncinci isitya esinye kwipod sinesicelo kunye nomda, kunye nesicelo < umda
  3. eyona nzame β€” xa kungekho nasinye isikhongozeli esikwipod esinoncedo olulinganiselweyo

Ngexesha elifanayo, xa i-node ifumana ukunqongophala kwezixhobo (idiski, imemori), i-kubelet iqala ukulinganisa kunye nokukhupha iipods ngokwe-algorithm ethile ethatha ingqalelo ephambili kwi-pod kunye neklasi yayo ye-QoS. Ngokomzekelo, ukuba sithetha nge-RAM, ngoko ngokusekelwe kwiklasi ye-QoS, amanqaku anikezelwa ngomgaqo ulandelayo:

  • Qi nyiweyo:-998
  • BestEffort: 1000
  • Ukuqhawuka: min(ubuninzi (2, 1000 - (1000 * memoryRequestBytes) / machineMemoryCapacityBytes), 999)

Ezo. ngokuphambili okufanayo, i-kubelet iya kuqala ukukhupha iipods ngomzamo ongcono weQoS iklasi ukusuka kwindawo.

isiphelo: ukuba ufuna ukunciphisa amathuba okuba i-pod efunwayo ikhutshwe kwi-node xa kukho ukungabikho kwezibonelelo kuyo, ngoko kunye nokuphambili, kufuneka kwakhona unakekele ukuseta isicelo / umda kuyo.

Inkqubo yokulinganisa okuthe tye kweepod zesicelo (HPA)

Xa umsebenzi kukwandisa ngokuzenzekelayo kwaye unciphise inani lee-pods ngokuxhomekeke ekusebenziseni izixhobo (inkqubo - CPU / RAM okanye umsebenzisi - rps), iqumrhu le-k8s njenge HPA (Horizontal Pod Autoscaler). I-algorithm yayo yile ilandelayo:

  1. Ufundo lwangoku lomthombo ojongiweyo lumiselwa (currentMetricValue)
  2. Amaxabiso anqwenelekayo ovimba amisiwe (desiredMetricValue), ethi izibonelelo zenkqubo zimiselwe kusetyenziswa isicelo.
  3. Inani langoku leekopi lichongiwe (currentReplicas)
  4. Le fomyula ilandelayo ibala inani elifunwayo lee-replicas (desiredReplicas)
    takaReplicas = [ currentReplicas * ( currentMetricValue / desiredMetricValue )]

Kule meko, ukulinganisa akuyi kwenzeka xa i-coefficient (currentMetricValue / desiredMetricValue) isondele ku-1 (kulo mzekelo, sinokuseta impazamo evumelekileyo ngokwethu; ngokungagqibekanga ngu-0.1).

Makhe sijonge indlela i-hpa esebenza ngayo kusetyenziswa umzekelo wesicelo sovavanyo lwe-app (esichazwe njenge-Deployment), apho kuyimfuneko ukutshintsha inani leekopi ngokuxhomekeke kusetyenziso lwe-CPU:

  • Umboniso wesicelo

    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

    Ezo. siyabona ukuba isicelo se-pod siqaliswe kwimizekelo emibini, nganye inezikhongozeli ezimbini ze-nginx kunye ne-nginx-exporter, nganye apho ichaziweyo. izicelo ye-CPU.

  • IManifesto ye-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

    Ezo. Senze i-hpa eza kubeka iliso kuvavanyo lwe-app-Deployment kwaye ilungelelanise inani leepods kunye nesicelo ngokusekelwe kwisalathisi se-CPU (silindele ukuba i-pod idle i-30% ye-CPU eyicelayo), kunye nenani leekopi ezikuyo. uluhlu lwe-2-10.

    Ngoku, makhe sijonge indlela yokusebenza kwe-hpa ukuba sisebenzisa umthwalo kwenye yeziko:

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

Lilonke sinokulandelayo:

  • Ixabiso elifunekayo (desiredMetricValue) - ngokwezicwangciso ze-hpa, sine-30%
  • Ixabiso langoku (currentMetricValue) - ekubaleni, umlawuli-umphathi ubala ixabiso eliphakathi lokusetyenziswa kobutyebi kwi-%, i.e. ngokwemiqathango yenza oku kulandelayo:
    1. Ifumana amaxabiso apheleleyo eemethrikhi ze-pod kwi-metric server, okt. 101m kunye ne-4m
    2. Ibala umndilili wexabiso elipheleleyo, okt. (101m + 4m) / 2 = 53m
    3. Ifumana ixabiso elipheleleyo losetyenziso olufunekayo (koku, izicelo zazo zonke izikhongozeli zishwankathelwe) 60m + 30m = 90m
    4. Ibala ipesenti yomndilili wokusetyenziswa kwe-CPU ngokunxulumene nesicelo se-pod, okt. 53m / 90m * 100% = 59%

Ngoku sinayo yonke into esiyifunayo ukugqiba ukuba ngaba sifuna ukutshintsha inani leekopi; ukwenza oku, sibala i-coefficient:

ratio = 59% / 30% = 1.96

Ezo. inani leekopi kufuneka linyuswe ~ 2 amaxesha kunye nenani ukuya [2 * 1.96] = 4.

Isiphelo: Njengoko ubona, ukuze le ndlela isebenze, imeko eyimfuneko kubukho bezicelo zazo zonke izikhongozeli ezikwipod ephawulweyo.

Indlela yokulinganisa i-autoscaling yeendawo (Cluster Autoscaler)

Ukuze uthintele impembelelo engalunganga kwinkqubo ngexesha lokunyuka komthwalo, ukuba ne-hpa emiselweyo akwanelanga. Ngokomzekelo, ngokwezicwangciso kumphathi womlawuli we-hpa, ithatha isigqibo sokuba inani le-replicas kufuneka linyuswe ngamaxesha angama-2, kodwa i-nodes ayinayo imithombo yamahhala yokuqhuba inani elinjalo leepods (okt i-node ayikwazi ukubonelela ucele izibonelelo kwi-application pod) kwaye ezi pod zitshintshela kwi-Pending state.

Kule meko, ukuba umnikezeli une-IaaS / PaaS ehambelanayo (umzekelo, i-GKE / GCE, i-AKS, i-EKS, njl.), isixhobo esifana Node Autoscaler. Ikuvumela ukuba ubeke ubuninzi kunye nenani elincinci leenqununu kwiqela kwaye ulungelelanise ngokuzenzekelayo inani langoku leendawo (ngokubiza umnikezeli wefu i-API ukuyalela / ukususa i-node) xa kukho ukungabikho kwezixhobo kwiqela kunye neepods. ayinakucwangciswa (zikwimeko elindileyo).

Isiphelo: Ukuze ukwazi ukulinganisa i-autoscale nodes, kuyimfuneko ukuseta izicelo kwimibhobho ye-pod ukwenzela ukuba i-k8 ikwazi ukuvavanya ngokuchanekileyo umthwalo kwiinqununu kwaye ngokufanelekileyo ingxelo yokuba akukho zixhobo kwi-cluster ukuqalisa i-pod elandelayo.

isiphelo

Kufuneka kuqatshelwe ukuba ukuseta imida yemithombo yesikhongozeli akuyomfuneko ukuba isicelo sisebenze ngempumelelo, kodwa kusengcono ukwenza njalo ngezi zizathu zilandelayo:

  1. Ngomsebenzi ochanekileyo ngakumbi womcwangcisi ngokwemiqathango yokulinganisa umthwalo phakathi kwee-k8s nodes
  2. Ukunciphisa ukuba nokwenzeka kwesiganeko "sokukhutshwa kweepod".
  3. Ukuze i-autoscaling ethe tye yeepod zesicelo (HPA) isebenze
  4. Ukulinganisa i-autoscaling ethe tye (i-Cluster Autoscaling) kubaboneleli belifu

Funda namanye amanqaku kwibhlog yethu:

umthombo: www.habr.com

Yongeza izimvo