Kubernetes: kenapa penting banget kanggo nyetel manajemen sumber daya sistem?

Minangka aturan, ana tansah perlu kanggo nyedhiyani blumbang darmabakti sumber daya kanggo aplikasi kanggo operasi bener lan stabil. Nanging kepiye yen sawetara aplikasi mlaku kanthi daya sing padha? Kepiye carane nyedhiyakake saben sumber daya sing dibutuhake? Kepiye sampeyan bisa mbatesi konsumsi sumber daya? Kepiye cara nyebarake beban ing antarane simpul kanthi bener? Kepiye cara mesthekake mekanisme skala horisontal bisa digunakake yen beban aplikasi mundhak?

Kubernetes: kenapa penting banget kanggo nyetel manajemen sumber daya sistem?

Sampeyan kudu miwiti karo apa jinis utama sumber daya ana ing sistem - iki, mesthi, wektu prosesor lan RAM. Ing k8s manifests jinis sumber daya iki diukur ing unit ing ngisor iki:

  • CPU - ing inti
  • RAM - ing bita

Kajaba iku, kanggo saben sumber bisa nyetel rong jinis syarat - njaluk и watesan. Panyuwunan - njlèntrèhaké syarat minimal kanggo sumber daya gratis saka simpul kanggo mbukak wadhah (lan pod minangka kabèh), nalika watesan nyetel watesan hard ing sumber kasedhiya kanggo wadhah.

Penting kanggo ngerti manawa manifest ora kudu nemtokake kanthi jelas loro jinis kasebut, nanging prilaku bakal kaya ing ngisor iki:

  • Yen mung watesan sumber daya sing ditemtokake sacara eksplisit, mula panjaluk sumber daya iki kanthi otomatis njupuk nilai sing padha karo watesan (sampeyan bisa verifikasi iki kanthi nelpon njlèntrèhaké entitas). Sing. nyatane, wadhah bakal diwatesi kanggo jumlah sing padha sumber daya mbutuhake kanggo mbukak.
  • Yen mung panjalukan sing ditemtokake kanthi jelas kanggo sumber daya, mula ora ana watesan ndhuwur sing disetel ing sumber iki - i.e. wadhah diwatesi mung dening sumber daya saka simpul dhewe.

Sampeyan uga bisa ngatur manajemen sumber daya ora mung ing tingkat wadhah tartamtu, nanging uga ing tingkat namespace nggunakake entitas ing ngisor iki:

  • LimitRange — njlèntrèhaké kabijakan watesan ing tingkat wadhah / pod ing ns lan dibutuhake kanggo njlèntrèhaké watesan standar ing wadhah / pod, uga nyegah nggawe wadhah / pods (utawa kosok balene), mbatesi jumlahe. lan nemtokake prabédan bisa ing nilai ing watesan lan panjalukan
  • Sumber DayaKuota — njlèntrèhaké kabijakan watesan ing umum kanggo kabeh wadhah ing ns lan digunakake, minangka aturan, kanggo mbatesi sumber daya ing antarane lingkungan (migunani nalika lingkungan ora diwatesi kanthi ketat ing tingkat simpul)

Ing ngisor iki minangka conto manifes sing nyetel watesan sumber daya:

  • Ing tingkat kontainer tartamtu:

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

    Sing. ing kasus iki, kanggo mbukak wadhah karo nginx, sampeyan kudu paling 1G free RAM lan 0.2 CPU ing simpul, nalika paling wadhah bisa nganggo 0.2 CPU lan kabeh RAM kasedhiya ing simpul.

  • Ing tingkat integer ns:

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

    Sing. jumlah kabeh kontaner request ing standar ns ora bisa ngluwihi 300m kanggo CPU lan 1G kanggo OP, lan jumlah kabeh watesan 700m kanggo CPU lan 2G kanggo OP.

  • Watesan standar kanggo wadhah ing 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

    Sing. ing namespace standar kanggo kabeh kontaner, request bakal disetel kanggo 100m kanggo CPU lan 1G kanggo OP, watesan - 1 CPU lan 2G. Ing wektu sing padha, watesan uga disetel ing nilai sing bisa dijaluk / watesan kanggo CPU (50m < x < 2) lan RAM (500M < x < 4G).

  • Watesan tingkat pod ns:

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

    Sing. kanggo saben pod ing ns standar bakal ana watesan 4 vCPU lan 1G.

Saiki aku arep menehi pitutur marang kowe apa keuntungan nyetel watesan iki bisa menehi kita.

Mekanisme imbangan beban antarane simpul

Sing ngerti, komponen k8s tanggung jawab kanggo distribusi pods antarane kelenjar, kayata jadwal, sing dianggo miturut algoritma tartamtu. Algoritma iki ngliwati rong tahap nalika milih simpul optimal kanggo diluncurake:

  1. nyaring
  2. wiwit

Sing. miturut kabijakan sing diterangake, node wiwitane dipilih sing bisa diluncurake pod adhedhasar set predikat (kalebu mriksa apa simpul duwe sumber daya sing cukup kanggo mbukak pod - PodFitsResources), banjur kanggo saben simpul kasebut, miturut prioritas poin dianugerahi (kalebu, luwih akeh sumber daya gratis sing diduweni simpul, luwih akeh poin sing ditugasake - LeastResourceAllocation / LeastRequestedPriority / BalancedResourceAllocation) lan pod diluncurake ing simpul kanthi poin paling akeh (yen sawetara simpul marem kondisi iki bebarengan, banjur dipilih kanthi acak).

Ing wektu sing padha, sampeyan kudu ngerti manawa panjadwal, nalika ngevaluasi sumber daya sing kasedhiya saka simpul, dipandu dening data sing disimpen ing etcd - i.e. kanggo jumlah dijaluk / sumber watesan saben polong mlaku ing simpul iki, nanging ora kanggo konsumsi sumber nyata. Informasi iki bisa dipikolehi saka output printah kubectl describe node $NODE, contone:

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

Ing kene kita ndeleng kabeh pod sing mlaku ing simpul tartamtu, uga sumber daya sing dijaluk saben pod. Lan ing kene kaya apa log panjadwal nalika pod cronjob-cron-events-1573793820-xt6q9 diluncurake (informasi iki bakal katon ing log panjadwal nalika sampeyan nyetel level logging kaping 10 ing argumen perintah wiwitan -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

Kene kita waca sing pisanan panjadwal nyaring lan ngasilake dhaptar 3 kelenjar sing bisa dibukak (nxs-k8s-s8, nxs-k8s-s9, nxs-k8s-s10). Banjur ngetung skor adhedhasar sawetara paramèter (kalebu BalancedResourceAllocation, LeastResourceAllocation) kanggo saben kelenjar iki kanggo nemtokake simpul paling cocok. Pungkasane, polong dijadwalake ing simpul kanthi jumlah titik paling dhuwur (ing kene loro simpul bebarengan duwe jumlah poin sing padha 100037, mula dipilih kanthi acak - nxs-k8s-s10).

kesimpulan: yen simpul mbukak pods sing ora watesan sing disetel, banjur kanggo k8s (saka sudut pandang saka konsumsi sumber) iki bakal padha karo kaya-kaya ora ana pods ing simpul iki ing kabeh. Mulane, yen sampeyan, kanthi kondisional, duwe polong kanthi proses rakus (contone, wowza) lan ora ana watesan sing disetel, mula kahanan bisa uga muncul nalika polong iki bener-bener mangan kabeh sumber daya simpul kasebut, nanging kanggo k8s simpul iki. dianggep unloaded lan bakal dianugerahi nomer padha TCTerms nalika peringkat (tepatan ing TCTerms pambiji sumber kasedhiya) minangka simpul sing ora duwe polong bisa digunakake, kang pungkasanipun bisa mimpin kanggo distribusi ora rata saka mbukak antarane kelenjar.

Pengusiran Pod

Kaya sing sampeyan ngerteni, saben pod diwenehi salah siji saka 3 kelas QoS:

  1. dijamin - ditugasake nalika saben wadhah ing pod panjalukan lan watesan ditemtokake kanggo memori lan CPU, lan nilai kasebut kudu cocog
  2. bledosan - paling ora siji wadhah ing pod duwe panjalukan lan watesan, kanthi panyuwunan < watesan
  3. paling gaweyan - nalika ora siji wadhah ing polong sumber daya winates

Ing wektu sing padha, nalika simpul ngalami kekurangan sumber daya (disk, memori), kubelet wiwit pangkat lan ngusir polong miturut algoritma tartamtu sing njupuk prioritas polong lan kelas QoS. Contone, yen kita ngomong babagan RAM, banjur adhedhasar kelas QoS, poin dianugerahi miturut prinsip ing ngisor iki:

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

Sing. karo prioritas padha, kubelet pisanan bakal ngusir pods karo paling efforts kelas QoS saka simpul.

kesimpulan: yen sampeyan pengin nyuda kemungkinan polong sing dikarepake diusir saka simpul yen ana kekurangan sumber daya, banjur bebarengan karo prioritas, sampeyan uga kudu ngurus nyetel panyuwunan / watesan kasebut.

Mekanisme autoscaling horisontal saka pod aplikasi (HPA)

Nalika tugas kanggo nambah lan nyuda jumlah pods kanthi otomatis gumantung saka panggunaan sumber daya (sistem - CPU / RAM utawa pangguna - rps), entitas k8s kayata HPA (Horizontal Pod Autoscaler). Algoritma kasebut minangka nderek:

  1. Wacan saiki saka sumber sing diamati ditemtokake (currentMetricValue)
  2. Nilai sing dikarepake kanggo sumber daya ditemtokake (desiredMetricValue), sing kanggo sumber daya sistem disetel nggunakake panyuwunan
  3. Jumlah replika saiki ditemtokake (Replika saiki)
  4. Rumus ing ngisor iki ngitung jumlah replika sing dikarepake (Replika sing dikarepake)
    wantedReplicas = [Replika saiki * (currentMetricValue / desiredMetricValue )]

Ing kasus iki, skala ora bakal kedadeyan nalika koefisien (currentMetricValue / desiredMetricValue) cedhak karo 1 (ing kasus iki, kita bisa nyetel kesalahan sing diidini dhewe; kanthi standar yaiku 0.1).

Ayo goleki cara kerjane hpa nggunakake conto aplikasi tes aplikasi (diterangake minangka Deployment), ing ngendi perlu ngganti jumlah replika gumantung saka konsumsi CPU:

  • Manifestasi aplikasi

    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

    Sing. kita weruh yen pod aplikasi wiwitane diluncurake ing rong kedadeyan, sing saben ngemot rong wadhah nginx lan nginx-eksportir, sing saben-saben wis ditemtokake. njaluk kanggo CPU.

  • Manifesto 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

    Sing. Kita nggawe hpa sing bakal ngawasi tes aplikasi Deployment lan nyetel jumlah pod karo aplikasi adhedhasar indikator cpu (kita ngarepake yen pod kudu nganggo 30% saka CPU sing dijaluk), kanthi jumlah replika sing ana. kisaran 2-10.

    Saiki, ayo goleki mekanisme operasi hpa yen kita ngetrapake beban ing salah sawijining perapian:

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

Ing total kita duwe ing ngisor iki:

  • Nilai sing dikarepake (desiredMetricValue) - miturut setelan hpa, kita duwe 30%
  • Nilai saiki (currentMetricValue) - kanggo pitungan, controller-manager ngetung nilai rata-rata konsumsi sumber daya ing%, i.e. conditionally nindakake ing ngisor iki:
    1. Nampa nilai mutlak metrik pod saka server metrik, i.e. 101m lan 4m
    2. Ngetung nilai absolut rata-rata, i.e. (101m + 4m) / 2 = 53m
    3. Entuk nilai mutlak kanggo konsumsi sumber daya sing dikarepake (kanggo iki, panjaluk kabeh wadhah diringkes) 60m + 30m = 90m
    4. Ngetung persentasi rata-rata saka konsumsi CPU relatif kanggo pod request, i.e. 53m / 90m * 100% = 59%

Saiki kita duwe kabeh sing perlu kanggo nemtokake manawa kita kudu ngganti jumlah replika, kanggo nindakake iki, kita ngetung koefisien:

ratio = 59% / 30% = 1.96

Sing. jumlah replika kudu ditambah ~2 kaping lan gunggunge [2 * 1.96] = 4.

Kesimpulan: Kaya sing sampeyan ngerteni, supaya mekanisme iki bisa digunakake, syarat sing dibutuhake yaiku anané panjaluk kanggo kabeh wadhah ing pod sing diamati.

Mekanisme autoscaling horisontal saka node (Cluster Autoscaler)

Kanggo netralake pengaruh negatif ing sistem sajrone beban mundhak, ora cukup duwe hpa sing dikonfigurasi. Contone, miturut setelan ing manajer pengontrol hpa, mutusake manawa jumlah replika kudu ditambah kaping 2, nanging simpul ora duwe sumber daya gratis kanggo mbukak jumlah pod kasebut (yaiku simpul ora bisa nyedhiyakake sumber daya sing dijaluk menyang pod requests) lan pods iki ngalih menyang negara Pending.

Ing kasus iki, yen panyedhiya duwe IaaS/PaaS sing cocog (contone, GKE/GCE, AKS, EKS, lsp.), alat kaya Node Autoscaler. Ngidini sampeyan nyetel jumlah maksimal lan minimal simpul ing kluster lan kanthi otomatis nyetel jumlah simpul saiki (kanthi nelpon API panyedhiya maya kanggo pesen / mbusak simpul) nalika ana kekurangan sumber daya ing kluster lan pods. ora bisa dijadwal (ana ing negara Pending).

Kesimpulan: Kanggo bisa autoscale kelenjar, iku perlu kanggo nyetel panjalukan ing kontaner pod supaya k8s bener bisa netepke mbukak ing kelenjar lan patut laporan sing ora ana sumber daya ing kluster kanggo miwiti pod sabanjuré.

kesimpulan

Perlu dicathet yen nyetel watesan sumber daya wadah ora dadi syarat supaya aplikasi bisa sukses, nanging luwih becik ditindakake amarga alasan ing ngisor iki:

  1. Kanggo operasi luwih akurat saka panjadwal ing syarat-syarat mbukak wawas antarane k8s kelenjar
  2. Kanggo nyuda kemungkinan kedadeyan "pengusiran pod".
  3. Kanggo autoscaling horisontal polong aplikasi (HPA) bisa digunakake
  4. Kanggo autoscaling horisontal saka node (Cluster Autoscaling) kanggo panyedhiya maya

Uga maca artikel liyane ing blog kita:

Source: www.habr.com

Add a comment