Kubernetes: cén fáth a bhfuil sé chomh tábhachtach bainistíocht acmhainní córais a chumrú?

Mar riail, tá gá i gcónaí le linn tiomnaithe acmhainní a sholáthar d’iarratas ar oibriú ceart agus cobhsaí an iarratais. Ach cad má tá roinnt feidhmchlár ag rith ar an gcumhacht chéanna? Conas na hacmhainní íosta is gá a sholáthar do gach duine acu? Conas is féidir leat teorainn a chur le tomhaltas acmhainní? Conas an t-ualach idir na nóid a dháileadh i gceart? Conas a chinntiú go n-oibríonn an meicníocht scálaithe cothrománach má mhéadaíonn an t-ualach iarratais?

Kubernetes: cén fáth a bhfuil sé chomh tábhachtach bainistíocht acmhainní córais a chumrú?

Ní mór duit tosú leis na príomhchineálacha acmhainní atá sa chóras - is é seo, ar ndóigh, am próiseálaí agus RAM. I léiriú k8s déantar na cineálacha acmhainní seo a thomhas sna haonaid seo a leanas:

  • LAP - i gcroíthe
  • RAM - i mbearta

Ina theannta sin, is féidir dhá chineál riachtanas a shocrú do gach acmhainn - iarratais и teorainneacha. Iarratais - cuireann sé síos ar na ceanglais íosta maidir le hacmhainní saor in aisce nód chun coimeádán a rith (agus pod ina iomláine), agus leagann teorainneacha teorainn chrua ar na hacmhainní atá ar fáil don choimeádán.

Tá sé tábhachtach a thuiscint nach gcaithfidh an forléiriú an dá chineál a shainiú go sainráite, ach beidh an iompar mar seo a leanas:

  • Mura sonraítear ach teorainneacha acmhainne go sainráite, glacann iarratais ar an acmhainn seo luach atá comhionann le teorainneacha go huathoibríoch (is féidir leat é seo a fhíorú trí ghlaoch a chur ar aonáin cur síos). Iad siúd. go deimhin, beidh an coimeádán teoranta don mhéid céanna acmhainní a theastaíonn le rith.
  • Mura sonraítear ach iarratais go sainráite ar acmhainn, ansin ní leagtar srianta uachtaracha ar an acmhainn seo - i.e. níl an coimeádán teoranta ach amháin ag acmhainní an nód féin.

Is féidir freisin bainistíocht acmhainní a chumrú ní hamháin ag leibhéal coimeádáin ar leith, ach freisin ag leibhéal an ainmspáis ag baint úsáide as na haonáin seo a leanas:

  • Raon Teorainn — cur síos ar an mbeartas srianta ar an leibhéal coimeádán/pod in ns agus atá de dhíth chun cur síos a dhéanamh ar na teorainneacha réamhshocraithe ar an gcoimeádán/pod, agus chun cosc ​​a chur ar chruthú coimeádán/codáin ar léir go bhfuil saill orthu (nó vice versa), teorainn a chur lena n-uimhir. agus an difríocht a d’fhéadfadh a bheith sna luachanna i dteorainneacha agus iarratais a chinneadh
  • Cuótaí Acmhainní — cur síos a dhéanamh ar an mbeartas srianta i gcoitinne do na coimeádáin go léir in ns agus úsáidtear é, mar riail, chun acmhainní a theorannú i measc timpeallachtaí (úsáideach nuair nach bhfuil teorannú dian ar imshaoil ​​ar leibhéal na nóid)

Seo a leanas samplaí d’fhoilsithe a shocraíonn teorainneacha acmhainní:

  • Ag leibhéal sonrach an choimeádáin:

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

    Iad siúd. sa chás seo, chun coimeádán a reáchtáil le nginx, beidh ort ar a laghad 1G de RAM saor in aisce agus 0.2 CPU ar an nód, agus ar a mhéad is féidir leis an gcoimeádán 0.2 CPU agus gach RAM atá ar fáil a ithe ar an nód.

  • Ag an leibhéal slánuimhir ns:

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

    Iad siúd. ní féidir le suim na gcoimeádán iarratais go léir sa réamhshocrú ns dul thar 300m don LAP agus 1G don OP, agus is é suim na teorann go léir ná 700m don LAP agus 2G don OP.

  • Teorainneacha réamhshocraithe do choimeádáin i 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

    Iad siúd. san ainmspás réamhshocraithe do gach coimeádán, socrófar an t-iarratas go 100m le haghaidh LAP agus 1G le haghaidh OP, teorainn - 1 LAP agus 2G. Ag an am céanna, socraítear teorainn freisin ar na luachanna féideartha san iarratas/teorainn do LAP (50m < x < 2) agus RAM (500M < x < 4G).

  • Srianta pod-leibhéil ns:

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

    Iad siúd. beidh teorainn 4 vCPU agus 1G i gcás gach pod sa réamhshocrú ns.

Anois, ba mhaith liom a insint duit cad iad na buntáistí a d'fhéadfadh na srianta seo a thabhairt dúinn.

Meicníocht cothromaíochta luchtaithe idir nóid

Mar is eol duit, tá an chomhpháirt k8s freagrach as pods a dháileadh i measc nóid, mar shampla sceidealóir, a oibríonn de réir algartam ar leith. Téann an t-algartam seo trí dhá chéim agus an nód is fearr á roghnú le seoladh:

  1. scagadh
  2. Rangú

Iad siúd. De réir an bheartais a thuairiscítear, roghnaítear nóid ar dtús ar féidir pod a sheoladh bunaithe ar thacar tuar (lena n-áirítear seiceáil an bhfuil dóthain acmhainní ag an nód chun an pod a rith - PodFitsResources), agus ansin do gach ceann de na nóid seo, de réir tosaíochtaí bronntar pointí (lena n-áirítear, dá mhéad acmhainní saora atá ag nód, is amhlaidh is mó pointí a shanntar dó - Leithdháileadh na n-Acmhainní is lú/an Tosaíocht a Iarrtar ar Chothrom/Leithroinnt ChothromaitheAcmhainne) agus seoltar an pod ar an nód leis an líon is mó pointí (má shásaíonn roinnt nóid an coinníoll seo ag an am céanna, ansin roghnaítear ceann randamach).

Ag an am céanna, ní mór duit a thuiscint go bhfuil an sceidealóir, agus measúnú á dhéanamh ar na hacmhainní atá ar fáil de nód, á threorú ag na sonraí atá stóráilte i etcd - i.e. maidir le méid na hacmhainne iarrtha/teorainn de gach pod a ritheann ar an nód seo, ach ní le haghaidh tomhaltas iarbhír na hacmhainne. Is féidir an fhaisnéis seo a fháil ón aschur ordaithe kubectl describe node $NODE, mar shampla:

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

Anseo feicimid na pods go léir ag rith ar nód ar leith, chomh maith leis na hacmhainní a iarrann gach pod. Agus seo cuma na logaí sceidealóra nuair a sheoltar an pod cronjob-cron-events-1573793820-xt6q9 (feicfear an fhaisnéis seo sa logáil sceideal nuair a bheidh an 10ú leibhéal logála socraithe in argóintí an ordaithe seolta -v=10 ):

logáil

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

Anseo feicimid go ndéanann an sceidealóir scagadh ar dtús agus gineann sé liosta de 3 nóid ar ar féidir é a sheoladh (nxs-k8s-s8, nxs-k8s-s9, nxs-k8s-s10). Ansin ríomhann sé scóir bunaithe ar roinnt paraiméadair (lena n-áirítear BalancedResourceAllocation, LeastResourceAllocation) do gach ceann de na nóid seo chun an nód is oiriúnaí a chinneadh. Ar deireadh thiar, tá an pod sceidealta ar an nód leis an líon is airde pointí (anseo tá an líon céanna pointí 100037 ag dhá nód ag an am céanna, mar sin roghnaítear ceann randamach - nxs-k8s-s10).

Aschur: má ritheann nód pods nach bhfuil aon srianta leagtha síos ina leith, ansin i gcás k8anna (ó thaobh tomhaltais acmhainní de) beidh sé seo comhionann leis amhail is nach raibh aon pods den sórt sin ar an nód seo ar chor ar bith. Dá bhrí sin, má tá pod agat, go coinníollach, le próiseas gluttonous (mar shampla, wowza) agus nach bhfuil aon srianta leagtha síos dó, ansin d'fhéadfadh cás teacht chun cinn nuair a d'ith an pod seo acmhainní uile an nód, ach le haghaidh k8s an nód seo. Meastar go bhfuil sé díluchtaithe agus bronnfar an líon céanna pointí air agus é á rangú (go beacht i bpointí a dhéanann measúnú ar na hacmhainní atá ar fáil) mar nód nach bhfuil pods oibre aige, rud a d’fhéadfadh dáileadh míchothrom an ualaigh idir na nóid a bheith mar thoradh ar deireadh thiar.

Díshealbhú Pod

Mar is eol duit, sanntar ceann amháin de 3 rang QoS do gach pod:

  1. ráthaithe — sanntar é nuair a shonraítear iarratas agus teorainn don chuimhne agus don cpu do gach coimeádán sa phod, agus caithfidh na luachanna seo a bheith mar a chéile
  2. pléasctha — tá iarraidh agus teorainn ag coimeádán amháin ar a laghad sa phod, agus teorainn leis an iarratas <
  3. an iarracht is fearr — nuair nach bhfuil teorainn acmhainní ag coimeádán amháin sa phoda

Ag an am céanna, nuair a bhíonn taithí ag nód ar easpa acmhainní (diosca, cuimhne), tosaíonn kubelet pods a rangú agus a dhíshealbhú de réir algartam ar leith a chuireann san áireamh tosaíocht an pod agus a rang QoS. Mar shampla, má tá muid ag caint faoi RAM, ansin bunaithe ar an rang QoS, bronntar pointí de réir an phrionsabail seo a leanas:

  • Ráthaithe: -998
  • Dícheall: 1000
  • pléasctha: nóim(uas(2, 1000 - (1000 * cuimhneRequestBytes)) / meaisínMemoryCapacityBytes), 999)

Iad siúd. leis an tosaíocht chéanna, díshealbhóidh an kubelet pods ar dtús leis an iarracht is fearr rang QoS ón nód.

Aschur: más mian leat laghdú a dhéanamh ar an dóchúlacht go ndíshealbhófar an pod inmhianaithe ón nód i gcás easpa acmhainní air, ansin mar aon leis an tosaíocht, ní mór duit cúram a ghlacadh freisin chun an t-iarratas/teorainn a shocrú dó.

Meicníocht chun pods feidhmchlár a uathscálú go cothrománach (HPA)

Nuair atá an tasc le líon na pods a mhéadú agus a laghdú go huathoibríoch ag brath ar úsáid acmhainní (córas - CPU/RAM nó úsáideoir - rps), a leithéid d'eintiteas k8s mar HPA (Uathscálaálaí Pod Cothrománach). Seo a leanas algartam na

  1. Cinntear léamha reatha na hacmhainne breathnaithe (currentMetricValue)
  2. Cinntear na luachanna inmhianaithe don acmhainn (desiredMetricValue), a shocraítear le haghaidh acmhainní córais ag baint úsáide as iarratas
  3. Cinntear líon reatha na macasamhla (currentReplicas)
  4. Ríomhann an fhoirmle seo a leanas an líon macasamhla atá ag teastáil (desiredReplicas)
    DesireReplicas = [ currentReplicas * ( currentMetricValue / DesireMetricValue )]

Sa chás seo, ní tharlóidh scálú nuair a bhíonn an chomhéifeacht (currentMetricValue / DesireMetricValue) gar do 1 (sa chás seo, is féidir linn an earráid incheadaithe a shocrú dúinn féin; de réir réamhshocraithe is é 0.1).

Breathnaímid ar an gcaoi a n-oibríonn hpa ag baint úsáide as sampla an fheidhmchláir app-tástála (a gcuirtear síos air mar Imscaradh), nuair is gá líon na macasamhla a athrú ag brath ar thomhaltas LAP:

  • Léiriú iarratais

    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

    Iad siúd. feicimid go seoltar an pod feidhmchlár ar dtús in dhá chás, agus tá dhá choimeádán nginx agus nginx-onnmhaireora i ngach ceann acu, agus sonraítear i ngach ceann acu iarratais le haghaidh LAP.

  • 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

    Iad siúd. Chruthaíomar hpa a dhéanfaidh monatóireacht ar an app-tástáil Imlonnaithe agus a choigeartóidh líon na pods leis an bhfeidhmchlár bunaithe ar an táscaire cpu (táimid ag súil go n-ídeoidh an pod 30% den LAP a iarrann sé), agus líon na macasamhla istigh. an raon 2-10.

    Anois, déanaimis féachaint ar mheicníocht na hoibríochta hpa má chuirimid ualach i bhfeidhm ar cheann de na teallaigh:

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

San iomlán tá na nithe seo a leanas againn:

  • An luach inmhianaithe (desiredMetricValue) - de réir na socruithe hpa, tá 30% againn
  • Luach reatha (currentMetricValue) - le haghaidh ríomh, ríomhann an rialtóir-bainisteoir meánluach tomhaltais acmhainne i %, i.e. go coinníollach déanann sé seo a leanas:
    1. Faigheann sé luachanna absalóideacha na méadrachta pod ón bhfreastalaí méadrach, i.e. 101m agus 4m
    2. Ríomhann sé an meánluach absalóideach, i.e. (101m + 4m) / 2 = 53m
    3. Faigheann sé an luach absalóideach don tomhaltas acmhainne atá ag teastáil (do seo, déantar iarratais na gcoimeádán go léir a achoimriú) 60m + 30m = 90m
    4. Ríomhann sé an meánchéatadán de thomhaltas LAP i gcoibhneas leis an pod iarratais, i.e. 53m / 90m * 100% = 59%

Anois tá gach rud a theastaíonn uainn chun a chinneadh an gá dúinn líon na macasamhla a athrú; chun é seo a dhéanamh, ríomhaimid an chomhéifeacht:

ratio = 59% / 30% = 1.96

Iad siúd. ba cheart líon na macasamhla a mhéadú faoi ~2 uair agus an méid go [2 * 1.96] = 4.

Conclúid: Mar a fheiceann tú, ionas go n-oibreoidh an meicníocht seo, is coinníoll riachtanach é láithreacht na n-iarratas ar gach coimeádán sa phod a breathnaíodh.

Meicníocht le haghaidh uathscálú cothrománach na nóid (Cluster Autoscaler)

Chun an tionchar diúltach ar an gcóras a neodrú le linn borrtha ualaigh, ní leor hpa cumraithe a bheith agat. Mar shampla, de réir na socruithe sa bhainisteoir rialtóra hpa, cinneann sé gur gá líon na macasamhla a mhéadú faoi 2 uair, ach níl acmhainní saor in aisce ag na nóid chun líon pods den sórt sin a rith (i.e. ní féidir leis an nód an méid a sholáthar. acmhainní iarrtha don phod iarratais) agus aistríonn na pods seo go dtí an staid ar Feitheamh.

Sa chás seo, má tá IaaS/PaaS comhfhreagrach ag an soláthraí (mar shampla, GKE/GCE, AKS, EKS, etc.), uirlis cosúil le Scáálaí Uathoibríoch Nód. Ligeann sé duit uaslíon agus íoslíon na nóid a shocrú sa bhraisle agus an líon reatha nóid a choigeartú go huathoibríoch (trí ghlaoch a chur ar API an tsoláthraí scamall chun nód a ordú/a bhaint) nuair a bhíonn easpa acmhainní sa bhraisle agus sna pods ní féidir iad a sceidealú (atá sa staid ar Feitheamh).

Conclúid: Chun nóid a uathscála, is gá iarratais a shocrú sna coimeádáin pod ionas gur féidir le k8anna an t-ualach ar na nóid a mheas i gceart agus dá réir sin tuairisc a thabhairt nach bhfuil aon acmhainní sa bhraisle chun an chéad pod eile a sheoladh.

Conclúid

Ba cheart a thabhairt faoi deara nach gá teorainneacha acmhainne coimeádáin a shocrú le go n-éireoidh leis an bhfeidhmchlár, ach is fearr é sin a dhéanamh ar na cúiseanna seo a leanas:

  1. Chun oibriú níos cruinne ar an sceidealóir i dtéarmaí cothromú ualach idir nóid k8s
  2. Chun an dóchúlacht go dtarlóidh “díshealbhú pod” a laghdú
  3. Chun go n-oibreoidh na pods feidhmchláir (HPA) go cothrománach uathoibríoch
  4. Le haghaidh uathscálú cothrománach nóid (Uathscalú Braisle) do sholáthraithe néal

Léigh ailt eile ar ár mblag freisin:

Foinse: will.com

Add a comment