Kubernetes: no ke aha he mea nui e hoʻonohonoho i ka hoʻokele waiwai ʻōnaehana?

Ma ke ʻano he kānāwai, pono mau e hāʻawi i kahi waihona waiwai i hoʻolaʻa ʻia i kahi noi no kāna hana pololei a paʻa. Akā pehea inā e holo ana kekahi mau noi ma ka mana like? Pehea e hoʻolako ai i kēlā me kēia o lākou i nā kumuwaiwai liʻiliʻi e pono ai? Pehea ʻoe e kaupalena ai i ka hoʻohana waiwai? Pehea e puunaue pono ai i ka ukana ma waena o nā nodes? Pehea e hōʻoia ai i ka hana ʻana o ka mīkini scaling horizontal inā piʻi ka ukana noi?

Kubernetes: no ke aha he mea nui e hoʻonohonoho i ka hoʻokele waiwai ʻōnaehana?

Pono ʻoe e hoʻomaka me nā ʻano kumu waiwai nui i loko o ka ʻōnaehana - ʻo kēia, ʻoiaʻiʻo, ʻo ka manawa kaʻina hana a me ka RAM. Ma k8s hōʻike ua ana ʻia kēia mau ʻano waiwai ma nā ʻāpana penei:

  • CPU - i loko o nā cores
  • RAM - ma nā paita

Eia kekahi, no kēlā me kēia kumuwaiwai hiki ke hoʻonohonoho i ʻelua ʻano koi - noi и palena. Nā noi - wehewehe i nā koi liʻiliʻi no nā kumuwaiwai manuahi o kahi node e holo ai i kahi pahu (a me ka pod ma ke ʻano holoʻokoʻa), ʻoiai nā palena e kau i kahi palena paʻa i nā kumuwaiwai i loaʻa i ka ipu.

He mea nui ka hoʻomaopopo ʻana ʻaʻole pono e wehewehe pono ka hōʻike i nā ʻano ʻelua, akā penei ka ʻano:

  • Inā ʻike maopopo ʻia nā palena o kahi kumuwaiwai, a laila lawe ʻokoʻa nā noi no kēia kumuwaiwai i kahi waiwai like me nā palena (hiki iā ʻoe ke hōʻoia i kēia ma ke kāhea ʻana i nā hui wehewehe). ʻO kēlā mau mea. ʻoiaʻiʻo, e kaupalena ʻia ka pahu i ka nui o nā kumuwaiwai e pono ai e holo.
  • Inā ʻōlelo ʻia nā noi no kahi kumuwaiwai, ʻaʻole kau ʻia nā palena kiʻekiʻe ma kēia kumuwaiwai - i.e. ua kaupalena ʻia ka pahu e nā kumu waiwai o ka node ponoʻī.

Hiki ke hoʻonohonoho i ka hoʻokele waiwai ʻaʻole wale ma ke kiʻekiʻe o kahi pahu kikoʻī, akā ma ka pae inoa inoa hoʻi me ka hoʻohana ʻana i kēia mau mea:

  • LimitRange - wehewehe i ke kulekele kaohi ma ka ipu/pod pae i ns a pono e wehewehe i nā palena paʻamau o ka ipu/pod, a me ka pale ʻana i ka hana ʻana i nā ipu/pods momona (a i ʻole, e kaupalena i ko lākou helu. a hoʻoholo i ka hiki ke ʻokoʻa i nā waiwai i nā palena a me nā noi
  • Punawaiwai - wehewehe i ke kulekele kapu ma ka laulā no nā ipu a pau ma ns a hoʻohana ʻia, ma ke ʻano he lula, e hoʻokaʻawale i nā kumuwaiwai ma waena o nā kaiapuni (pono inā ʻaʻole i hoʻokaʻawale ʻia nā kaiapuni ma ka pae node)

Eia nā laʻana o nā hōʻike i hoʻonohonoho i nā palena waiwai:

  • Ma ka pae pahu kiko'ī:

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

    ʻO kēlā mau mea. i keia hihia, e holo i ka ipu me ka nginx, oe e pono ma ka liʻiliʻi loa 1G o ka noa RAM a me 0.2 CPU ma ka node, oiai ka nui o ka ipu hiki ke hoopau i ka 0.2 CPU a me na mea a pau i loaʻa RAM ma ka node.

  • Ma ka pae helu helu ns:

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

    ʻO kēlā mau mea. ʻAʻole hiki ke ʻoi aku ka nui o nā pahu noi āpau i ka ns paʻamau ma mua o 300m no ka CPU a me 1G no ka OP, a ʻo ka huina o nā palena āpau he 700m no ka CPU a me 2G no ka OP.

  • Nā palena paʻamau no nā ipu ma 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

    ʻO kēlā mau mea. ma ka inoa inoa paʻamau no nā ipu āpau, e hoʻonoho ʻia ke noi i 100m no CPU a me 1G no OP, palena - 1 CPU a me 2G. Ma ka manawa like, ua kau ʻia kahi palena ma nā waiwai hiki ke noi / palena no CPU (50m <x <2) a me RAM (500M <x <4G).

  • Nā kapu pae-pod ns:

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

    ʻO kēlā mau mea. no kēlā me kēia pod i ka ns paʻamau e loaʻa ka palena o 4 vCPU a me 1G.

I kēia manawa makemake wau e haʻi iā ʻoe i nā mea maikaʻi e hiki ai iā mākou ke hāʻawi i kēia mau palena.

ʻO ka hoʻouka kaulike ma waena o nā nodes

E like me kāu e ʻike ai, ʻo ka ʻāpana k8s ke kuleana no ka hāʻawi ʻana i nā pods ma waena o nā nodes, e like me ka mea kikowaena, e hana ana e like me ka algorithm kiko'ī. Hele kēia algorithm i ʻelua mau ʻanuʻu i ke koho ʻana i ka node maikaʻi loa e hoʻomaka:

  1. 'oʻoleʻa
  2. Kaulana

ʻO kēlā mau mea. e like me ke kulekele i wehewehe ʻia, koho mua ʻia nā nodes i hiki ke hoʻomaka i kahi pod e pili ana i kahi hoʻonohonoho predicates (me ka nānā ʻana inā lawa nā kumu waiwai o ka node e holo ai i ka pod - PodFitsResources), a laila no kēlā me kēia node, e like me nā mea nui Hāʻawi ʻia nā helu (me, ʻoi aku ka nui o nā kumuwaiwai manuahi i loaʻa i kahi node, ʻoi aku ka nui o nā helu i hāʻawi ʻia - LeastResourceAllocation/LeastRequestedPriority/BalancedResourceAllocation) a hoʻomaka ʻia ka pod ma ka node me nā helu nui loa (inā hoʻokō kekahi mau node i kēia kūlana i ka manawa hoʻokahi, a laila ua koho ʻia kekahi mea maʻamau).

I ka manawa like, pono ʻoe e hoʻomaopopo i ka mea hoʻonohonoho, i ka nānā ʻana i nā kumuwaiwai i loaʻa o kahi node, alakaʻi ʻia e ka ʻikepili i mālama ʻia ma etcd - i.e. no ka nui o ka waiwai i noi ʻia/palena o kēlā me kēia pod e holo ana ma kēia node, akā, ʻaʻole no ka hoʻohana waiwai maoli. Hiki ke loaʻa kēia ʻike mai ka puka kauoha kubectl describe node $NODEno ka laʻana:

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

Maanei mākou e ʻike ai i nā pods a pau e holo ana ma kahi node kikoʻī, a me nā kumuwaiwai a kēlā me kēia pod noi. A eia ke ʻano o ka papa kuhikuhi i ka wā i hoʻokuʻu ʻia ai ka cronjob-cron-events-1573793820-xt6q9 pod (e ʻike ʻia kēia ʻike ma ka log scheduler i ka wā e hoʻonoho ai ʻoe i ka pae logging 10th i nā hoʻopaʻapaʻa kauoha hoʻomaka -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

Ma ʻaneʻi, ʻike mākou i ka hoʻomaka ʻana o ka mea hoʻonohonoho kānana a hoʻopuka i kahi papa inoa o 3 nodes i hiki ke hoʻokuʻu ʻia (nxs-k8s-s8, nxs-k8s-s9, nxs-k8s-s10). A laila, helu ʻo ia i nā helu ma muli o kekahi mau ʻāpana (me BalancedResourceAllocation, LeastResourceAllocation) no kēlā me kēia o kēia mau node i mea e hoʻoholo ai i ka node kūpono loa. ʻO ka hope loa, ua hoʻonohonoho ʻia ka pod ma ka node me ka helu kiʻekiʻe loa o nā helu (ma ʻaneʻi ʻelua mau nodes i ka manawa hoʻokahi i ka helu like o nā helu 100037, no laila ua koho ʻia kahi koho - nxs-k8s-s10).

hopena: ina e holo ana ka node i na pods i kau ole ia ai na kapu, alaila, no k8s (mai ka mana'o o ka hoohana waiwai) e like ana keia me he mea la aole loa na pods ma keia node. No laila, inā loaʻa iā ʻoe kahi pod me kahi kaʻina paʻa (e laʻa, wowza) a ʻaʻohe kau palena no ia mea, a laila hiki ke kū mai kahi kūlana i ka wā i ʻai maoli ai kēia pod i nā kumuwaiwai āpau o ka node, akā no k8s kēia node. Ua manaʻo ʻia ʻaʻole i hoʻouka ʻia a e hāʻawi ʻia ia i ka helu like o nā helu i ka wā e hoʻonoho ai (ma nā helu e loiloi ana i nā kumuwaiwai i loaʻa) ma ke ʻano he node ʻaʻohe o nā pods hana, hiki ke alakaʻi i ka puʻunaue like ʻole o ka ukana ma waena o nā node.

Kipaku ʻia ʻo Pod

E like me kāu e ʻike ai, hāʻawi ʻia kēlā me kēia pod i hoʻokahi o 3 mau papa QoS:

  1. hoʻopaʻa ʻia - hāʻawi ʻia i ka manawa no kēlā me kēia pahu i loko o ka pod i kuhikuhi ʻia kahi noi a me ka palena no ka hoʻomanaʻo a me ka cpu, a pono e kūlike kēia mau waiwai.
  2. hikiwawe - ma ka liʻiliʻi loa o hoʻokahi pahu i loko o ka pod he noi a he palena, me ka noi < palena
  3. hoʻoikaika maikaʻi loa - inā ʻaʻole i kaupalena ʻia kahi pahu hoʻokahi o ka pod

I ka manawa like, i ka wā e ʻike ai kahi node i ka nele o nā kumuwaiwai (disk, memory), hoʻomaka ka kubelet e hoʻonohonoho a hoʻokuke i nā pods e like me kahi algorithm kikoʻī e noʻonoʻo ana i ka mea nui o ka pod a me kāna papa QoS. No ka laʻana, inā mākou e kamaʻilio e pili ana i ka RAM, a laila e pili ana i ka papa QoS, hāʻawi ʻia nā helu e like me kēia kumu.

  • Hōʻoia:-998
  • Hooikaika: 1000
  • Pahū: min(max(2, 1000 - (1000 * memoryRequestBytes) / machineMemoryCapacityBytes), 999)

ʻO kēlā mau mea. me ka mea nui, e kipaku mua ka kubelet i nā pods me ka hoʻoikaika maikaʻi loa o ka papa QoS mai ka node.

hopena: inā makemake ʻoe e hōʻemi i ka hiki ke kipaku ʻia ka pod i makemake ʻia mai ka node i ka wā o ka nele o nā kumuwaiwai ma luna, a laila me ka mea nui, pono ʻoe e mālama i ka hoʻonohonoho ʻana i ka noi / palena no ia.

Mechanism for horizontal autoscaling of application pods (HPA)

Ke hoʻonui ʻia ka hana a hoʻemi i ka helu o nā pods ma muli o ka hoʻohana ʻana i nā kumuwaiwai (pūnaewele - CPU/RAM a i ʻole mea hoʻohana - rps), kahi hui k8s e like me HPA (Horizontal Pod Autoscaler). ʻO ka algorithm o ia mea penei:

  1. Hoʻoholo ʻia nā heluhelu o kēia manawa o ka punawai i ʻike ʻia (currentMetricValue)
  2. Hoʻoholo ʻia nā waiwai i makemake ʻia no ka punawai (makemakeMetricValue), i hoʻonohonoho ʻia no nā kumuwaiwai pūnaewele me ka hoʻohana ʻana i ke noi.
  3. Hoʻoholo ʻia ka helu o nā replicas i kēia manawa (currentReplicas)
  4. Ke helu nei ke kumu hoʻohālikelike i ka helu i makemake ʻia o nā kope (makemakeReplicas)
    makemakeReplicas = [Replicas i kēia manawa * (MetricValue / makemakeMetricValue )]

I kēia hihia, ʻaʻole hiki ke hoʻonui ʻia ke kokoke ka coefficient (currentMetricValue / desiredMetricValue) i ka 1 (ma kēia hihia, hiki iā mākou ke hoʻonohonoho iā mākou iho i ka hewa i ʻae ʻia; ʻo 0.1 ka mea paʻamau).

E nānā i ka hana ʻana o ka hpa me ka hoʻohana ʻana i ka laʻana o ka app-test application (i wehewehe ʻia ʻo Deployment), kahi e pono ai ke hoʻololi i ka helu o nā replicas ma muli o ka hoʻohana ʻana i ka CPU:

  • Hōʻike palapala noi

    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

    ʻO kēlā mau mea. ʻike mākou ua hoʻomaka mua ʻia ka pod application i ʻelua mau manawa, aia kēlā me kēia mea i ʻelua pahu nginx a me ka nginx-exporter, no kēlā me kēia mea i kuhikuhi ʻia. noi no ka CPU.

  • Hōʻike 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

    ʻO kēlā mau mea. Ua hana mākou i kahi hpa e nānā i ka Deployment app-test a hoʻoponopono i ka helu o nā pods me ka noi e pili ana i ka hōʻailona cpu (manaʻo mākou e pau ka pod i 30% o ka CPU e noi ai), me ka helu o nā replicas i loko. ka laulā o 2-10.

    I kēia manawa, e nānā kākou i ke ʻano o ka hana ʻana o ka hpa inā hoʻokomo mākou i kahi ukana i kekahi o nā kapuahi.

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

Ma ka huina, loaʻa iā mākou nā mea penei:

  • ʻO ka waiwai makemake (makemakeMetricValue) - e like me nā hoʻonohonoho hpa, loaʻa iā mākou 30%
  • Waiwai o kēia manawa (currentMetricValue) - no ka helu ʻana, e helu ana ka luna hoʻoponopono i ka waiwai awelika o ka hoʻohana waiwai ma %, ʻo ia hoʻi. conditionally hana penei:
    1. Loaʻa i nā waiwai piha o nā metric pod mai ka server metric, i.e. 101m a me 4m
    2. Heluhelu i ka awelika waiwai piha, i.e. (101m + 4m) / 2 = 53m
    3. Loaʻa i ka waiwai piha no ka hoʻohana waiwai i makemake ʻia (no kēia, ua hōʻuluʻulu ʻia nā noi o nā pahu āpau) 60m + 30m = 90m
    4. E helu ana i ka awelika pākēneka o ka hoʻohana ʻana i ka CPU e pili ana i ka pod noi, ʻo ia hoʻi. 53m / 90m * 100% = 59%

I kēia manawa, loaʻa iā mākou nā mea a pau e pono ai mākou e hoʻoholo inā pono mākou e hoʻololi i ka helu o nā replicas; e hana i kēia, helu mākou i ka coefficient:

ratio = 59% / 30% = 1.96

ʻO kēlā mau mea. Pono e hoʻonui ʻia ka helu o nā replicas e ~2 manawa a nui i [2 * 1.96] = 4.

Panina: E like me kāu e ʻike ai, i mea e hana ai kēia ʻano hana, kahi kūlana kūpono ke kū ʻana o nā noi no nā pahu āpau i ka pod i ʻike ʻia.

Mechanism for horizontal autoscaling of nodes (Cluster Autoscaler)

I mea e pale ai i ka hopena maikaʻi ʻole i ka ʻōnaehana i ka wā o ka hoʻouka ʻana, ʻaʻole lawa ka loaʻa ʻana o kahi hpa i hoʻonohonoho ʻia. No ka laʻana, e like me nā hoʻonohonoho i loko o ka mana hoʻoponopono hpa, hoʻoholo ʻo ia e hoʻonui ʻia ka nui o nā replicas e 2 mau manawa, akā ʻaʻole i loaʻa i nā node nā kumuwaiwai manuahi e holo ai i kēlā mau pods (ʻo ia hoʻi. Ua noi ʻia nā kumuwaiwai i ka pod noi) a ua hoʻololi kēia mau pods i ka mokuʻāina e kali nei.

I kēia hihia, inā he IaaS/PaaS pili ka mea hāʻawi (e laʻa, GKE/GCE, AKS, EKS, etc.), kahi mea hana e like me Node Autoscaler. Hāʻawi ia iā ʻoe e hoʻonohonoho i ka helu kiʻekiʻe a me ka liʻiliʻi o nā node i loko o ka pūʻulu a hoʻoponopono maʻalahi i ka helu o kēia manawa o nā nodes (ma ke kāhea ʻana i ka API mea hāʻawi kapua e kauoha / wehe i kahi node) ke loaʻa ʻole nā ​​kumu waiwai i ka hui a me nā pods. ʻAʻole hiki ke hoʻonohonoho ʻia (aia ma ka mokuʻāina e kali nei).

Panina: No ka hiki ke hoʻonui i nā nodes, pono e hoʻonohonoho i nā noi i loko o nā pahu pod i hiki i nā k8s ke nānā pono i ka ukana ma nā nodes a ma muli o ka hōʻike ʻana ʻaʻohe kumu i loko o ka hui e hoʻomaka i ka pod aʻe.

hopena

Pono e hoʻomaopopo ʻia ʻaʻole pono ka hoʻonohonoho ʻana i nā palena kumu waiwai no ka holo pono ʻana o ka noi, akā ʻoi aku ka maikaʻi o ka hana ʻana no kēia mau kumu:

  1. No ka ʻoi aku ka pololei o ka hana ʻana o ka mea hoʻonohonoho e pili ana i ka hoʻohālikelike ʻana ma waena o nā nodes k8s
  2. No ka hoʻemi ʻana i ka hiki ʻana mai o kahi hanana "pod eviction".
  3. No ka hana ʻana i ka autoscaling ākea o nā palapala noi (HPA).
  4. No ka hoʻokaʻawale ʻana i nā nodes (Cluster Autoscaling) no nā mea hāʻawi ao

E heluhelu pū i nā ʻatikala ʻē aʻe ma kā mākou blog:

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka