Kubernetes: システム リ゜ヌス管理を構成するこずがなぜそれほど重芁なのでしょうか?

原則ずしお、アプリケヌションが正しく安定しお動䜜するためには、アプリケヌションに専甚のリ゜ヌス プヌルを提䟛する必芁が垞にありたす。 しかし、耇数のアプリケヌションが同じ電源で実行されおいる堎合はどうなるでしょうか? それぞれに必芁最小限のリ゜ヌスを提䟛するにはどうすればよいでしょうか? リ゜ヌスの消費をどのように制限できるでしょうか? ノヌド間で負荷を正しく分散するにはどうすればよいでしょうか? アプリケヌションの負荷が増加した堎合に氎平スケヌリングメカニズムが確実に機胜するようにするにはどうすればよいでしょうか?

Kubernetes: システム リ゜ヌス管理を構成するこずがなぜそれほど重芁なのでしょうか?

システムに存圚する䞻なリ゜ヌスの皮類から始める必芁がありたす。これは、もちろん、プロセッサ時間ず RAM です。 k8s マニフェストでは、これらのリ゜ヌス タむプは次の単䜍で枬定されたす。

  • CPU - コア内
  • RAM - バむト単䜍

さらに、リ゜ヌスごずに XNUMX 皮類の芁件を蚭定できたす。 リク゚スト О 制限。 リク゚スト - コンテナヌ (およびポッド党䜓) を実行するためのノヌドの空きリ゜ヌスの最小芁件を蚘述したす。䞀方、制限は、コンテナヌで䜿甚できるリ゜ヌスに察するハヌド制限を蚭定したす。

マニフェストで䞡方のタむプを明瀺的に定矩する必芁はないこずを理解するこずが重芁ですが、動䜜は次のようになりたす。

  • リ゜ヌスの制限のみが明瀺的に指定されおいる堎合、このリ゜ヌスに察するリク゚ストは自動的に制限に等しい倀を取埗したす (これは、゚ンティティの蚘述を呌び出すこずで確認できたす)。 それらの。 実際、コンテナは実行に必芁なリ゜ヌスず同じ量に制限されたす。
  • リ゜ヌスに察しおリク゚ストのみが明瀺的に指定されおいる堎合、このリ゜ヌスには䞊限は蚭定されたせん。 コンテナはノヌド自䜓のリ゜ヌスによっおのみ制限されたす。

特定のコンテナヌのレベルだけでなく、次の゚ンティティを䜿甚しお名前空間レベルでもリ゜ヌス管理を構成するこずもできたす。

  • 制限範囲 — コンテナ/ポッド レベルでの制限ポリシヌを ns で蚘述したす。これは、コンテナ/ポッドのデフォルトの制限を蚘述するだけでなく、明らかに倪いコンテナ/ポッド (たたはその逆) の䜜成を防止し、その数を制限するために必芁です。そしお、制限ずリク゚ストの倀に起こり埗る差異を刀断したす
  • リ゜ヌスクォヌタ — ns 内のすべおのコンテナに察する䞀般的な制限ポリシヌを蚘述し、原則ずしお環境間のリ゜ヌスを区切るために䜿甚されたす (環境がノヌド レベルで厳密に区切られおいない堎合に圹立ちたす)

以䞋は、リ゜ヌス制限を蚭定するマニフェストの䟋です。

  • 特定のコンテナヌ レベルでは次のようになりたす。

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

    それらの。 この堎合、nginx でコンテナを実行するには、ノヌド䞊に少なくずも 1G の空き RAM ず 0.2 CPU が必芁ですが、コンテナが消費できるのは最倧でも 0.2 CPU ずノヌド䞊のすべおの利甚可胜な RAM です。

  • 敎数レベル ns では、次のようになりたす。

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

    それらの。 デフォルトの ns 内のすべおのリク゚スト コンテナの合蚈は、CPU で 300m、OP で 1G を超えるこずはできたせん。すべおの制限の合蚈は、CPU で 700m、OP で 2G です。

  • 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

    それらの。 すべおのコンテナヌのデフォルトの名前空間では、リク゚ストは CPU に 100m、OP に 1G に蚭定され、制限は 1 CPU ず 2G に蚭定されたす。 同時に、CPU (50m < x < 2) および RAM (500M < x < 4G) のリク゚スト/制限の可胜な倀にも制限が蚭定されたす。

  • ポッドレベルの制限 ns:

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

    それらの。 デフォルトの ns の各ポッドには、4 vCPU ず 1G の制限がありたす。

ここで、これらの制限を蚭定するこずでどのようなメリットが埗られるのかを説明したいず思いたす。

ノヌド間の負荷分散メカニズム

ご存知のずおり、k8s コンポヌネントはノヌド間のポッドの分散を担圓したす。 スケゞュヌラ、特定のアルゎリズムに埓っお動䜜したす。 このアルゎリズムは、起動する最適なノヌドを遞択する際に XNUMX ぀の段階を経たす。

  1. フィルタリング
  2. レンゞング

それらの。 説明されたポリシヌに埓っお、セットに基づいおポッドを起動できるノヌドが最初に遞択されたす。 述語 (ノヌドにポッドを実行するのに十分なリ゜ヌスがあるかどうかの確認 (PodFitsResources を含む))、次に、これらのノヌドごずに、次のようにしたす。 優先順䜍 ポむントが付䞎され (ノヌドの空きリ゜ヌスが倚いほど、より倚くのポむントが割り圓おられたす - LeastResourceAllocation/LeastRequestedPriority/BalancedResourceAllocation)、最も倚くのポむントを持぀ノヌドでポッドが起動されたす (耇数のノヌドが䞀床にこの条件を満たした堎合、ランダムに遞択されたす)。

同時に、スケゞュヌラは、ノヌドの利甚可胜なリ゜ヌスを評䟡するずきに、etcd に保存されおいるデヌタによっおガむドされるこずを理解する必芁がありたす。 このノヌドで実行されおいる各ポッドの芁求/制限リ゜ヌスの量ではなく、実際のリ゜ヌス消費量ではありたせん。 この情報はコマンド出力から取埗できたす。 kubectl describe node $NODEたずえば、次のようになりたす。

# kubectl describe nodes nxs-k8s-s1
..
Non-terminated Pods:         (9 in total)
  Namespace                  Name                                         CPU Requests  CPU Limits  Memory Requests  Memory Limits  AGE
  ---------                  ----                                         ------------  ----------  ---------------  -------------  ---
  ingress-nginx              nginx-ingress-controller-754b85bf44-qkt2t    0 (0%)        0 (0%)      0 (0%)           0 (0%)         233d
  kube-system                kube-flannel-26bl4                           150m (0%)     300m (1%)   64M (0%)         500M (1%)      233d
  kube-system                kube-proxy-exporter-cb629                    0 (0%)        0 (0%)      0 (0%)           0 (0%)         233d
  kube-system                kube-proxy-x9fsc                             0 (0%)        0 (0%)      0 (0%)           0 (0%)         233d
  kube-system                nginx-proxy-k8s-worker-s1                    25m (0%)      300m (1%)   32M (0%)         512M (1%)      233d
  nxs-monitoring             alertmanager-main-1                          100m (0%)     100m (0%)   425Mi (1%)       25Mi (0%)      233d
  nxs-logging                filebeat-lmsmp                               100m (0%)     0 (0%)      100Mi (0%)       200Mi (0%)     233d
  nxs-monitoring             node-exporter-v4gdq                          112m (0%)     122m (0%)   200Mi (0%)       220Mi (0%)     233d
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource           Requests           Limits
  --------           --------           ------
  cpu                487m (3%)          822m (5%)
  memory             15856217600 (2%)  749976320 (3%)
  ephemeral-storage  0 (0%)             0 (0%)

ここでは、特定のノヌドで実行されおいるすべおのポッドず、各ポッドが芁求するリ゜ヌスが衚瀺されたす。 cronjob-cron-events-1573793820-xt6q9 ポッドが起動されたずきのスケゞュヌラヌ ログは次のようになりたす (この情報は、起動コマンド -v=10 の匕数に 10 番目のログ レベルが蚭定されおいる堎合にスケゞュヌラヌ ログに衚瀺されたす) ):

カモメ

I1115 07:57:21.637791       1 scheduling_queue.go:908] About to try and schedule pod nxs-stage/cronjob-cron-events-1573793820-xt6q9                                                                                                                                           
I1115 07:57:21.637804       1 scheduler.go:453] Attempting to schedule pod: nxs-stage/cronjob-cron-events-1573793820-xt6q9                                                                                                                                                    
I1115 07:57:21.638285       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s5 is allowed, Node is running only 16 out of 110 Pods.                                                                               
I1115 07:57:21.638300       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s6 is allowed, Node is running only 20 out of 110 Pods.                                                                               
I1115 07:57:21.638322       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s3 is allowed, Node is running only 20 out of 110 Pods.                                                                               
I1115 07:57:21.638322       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s4 is allowed, Node is running only 17 out of 110 Pods.                                                                               
I1115 07:57:21.638334       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s10 is allowed, Node is running only 16 out of 110 Pods.                                                                              
I1115 07:57:21.638365       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s12 is allowed, Node is running only 9 out of 110 Pods.                                                                               
I1115 07:57:21.638334       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s11 is allowed, Node is running only 11 out of 110 Pods.                                                                              
I1115 07:57:21.638385       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s1 is allowed, Node is running only 19 out of 110 Pods.                                                                               
I1115 07:57:21.638402       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s2 is allowed, Node is running only 21 out of 110 Pods.                                                                               
I1115 07:57:21.638383       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s9 is allowed, Node is running only 16 out of 110 Pods.                                                                               
I1115 07:57:21.638335       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s8 is allowed, Node is running only 18 out of 110 Pods.                                                                               
I1115 07:57:21.638408       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s13 is allowed, Node is running only 8 out of 110 Pods.                                                                               
I1115 07:57:21.638478       1 predicates.go:1369] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s10 is allowed, existing pods anti-affinity terms satisfied.                                                                         
I1115 07:57:21.638505       1 predicates.go:1369] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s8 is allowed, existing pods anti-affinity terms satisfied.                                                                          
I1115 07:57:21.638577       1 predicates.go:1369] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s9 is allowed, existing pods anti-affinity terms satisfied.                                                                          
I1115 07:57:21.638583       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s7 is allowed, Node is running only 25 out of 110 Pods.                                                                               
I1115 07:57:21.638932       1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s10: BalancedResourceAllocation, capacity 39900 millicores 66620178432 memory bytes, total request 2343 millicores 9640186880 memory bytes, score 9        
I1115 07:57:21.638946       1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s10: LeastResourceAllocation, capacity 39900 millicores 66620178432 memory bytes, total request 2343 millicores 9640186880 memory bytes, score 8           
I1115 07:57:21.638961       1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s9: BalancedResourceAllocation, capacity 39900 millicores 66620170240 memory bytes, total request 4107 millicores 11307422720 memory bytes, score 9        
I1115 07:57:21.638971       1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s8: BalancedResourceAllocation, capacity 39900 millicores 66620178432 memory bytes, total request 5847 millicores 24333637120 memory bytes, score 7        
I1115 07:57:21.638975       1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s9: LeastResourceAllocation, capacity 39900 millicores 66620170240 memory bytes, total request 4107 millicores 11307422720 memory bytes, score 8           
I1115 07:57:21.638990       1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s8: LeastResourceAllocation, capacity 39900 millicores 66620178432 memory bytes, total request 5847 millicores 24333637120 memory bytes, score 7           
I1115 07:57:21.639022       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s10: TaintTolerationPriority, Score: (10)                                                                                                        
I1115 07:57:21.639030       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s8: TaintTolerationPriority, Score: (10)                                                                                                         
I1115 07:57:21.639034       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s9: TaintTolerationPriority, Score: (10)                                                                                                         
I1115 07:57:21.639041       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s10: NodeAffinityPriority, Score: (0)                                                                                                            
I1115 07:57:21.639053       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s8: NodeAffinityPriority, Score: (0)                                                                                                             
I1115 07:57:21.639059       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s9: NodeAffinityPriority, Score: (0)                                                                                                             
I1115 07:57:21.639061       1 interpod_affinity.go:237] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s10: InterPodAffinityPriority, Score: (0)                                                                                                                   
I1115 07:57:21.639063       1 selector_spreading.go:146] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s10: SelectorSpreadPriority, Score: (10)                                                                                                                   
I1115 07:57:21.639073       1 interpod_affinity.go:237] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s8: InterPodAffinityPriority, Score: (0)                                                                                                                    
I1115 07:57:21.639077       1 selector_spreading.go:146] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s8: SelectorSpreadPriority, Score: (10)                                                                                                                    
I1115 07:57:21.639085       1 interpod_affinity.go:237] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s9: InterPodAffinityPriority, Score: (0)                                                                                                                    
I1115 07:57:21.639088       1 selector_spreading.go:146] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s9: SelectorSpreadPriority, Score: (10)                                                                                                                    
I1115 07:57:21.639103       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s10: SelectorSpreadPriority, Score: (10)                                                                                                         
I1115 07:57:21.639109       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s8: SelectorSpreadPriority, Score: (10)                                                                                                          
I1115 07:57:21.639114       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s9: SelectorSpreadPriority, Score: (10)                                                                                                          
I1115 07:57:21.639127       1 generic_scheduler.go:781] Host nxs-k8s-s10 => Score 100037                                                                                                                                                                            
I1115 07:57:21.639150       1 generic_scheduler.go:781] Host nxs-k8s-s8 => Score 100034                                                                                                                                                                             
I1115 07:57:21.639154       1 generic_scheduler.go:781] Host nxs-k8s-s9 => Score 100037                                                                                                                                                                             
I1115 07:57:21.639267       1 scheduler_binder.go:269] AssumePodVolumes for pod "nxs-stage/cronjob-cron-events-1573793820-xt6q9", node "nxs-k8s-s10"                                                                                                               
I1115 07:57:21.639286       1 scheduler_binder.go:279] AssumePodVolumes for pod "nxs-stage/cronjob-cron-events-1573793820-xt6q9", node "nxs-k8s-s10": all PVCs bound and nothing to do                                                                             
I1115 07:57:21.639333       1 factory.go:733] Attempting to bind cronjob-cron-events-1573793820-xt6q9 to nxs-k8s-s10

ここでは、最初にスケゞュヌラがフィルタリングを行い、起動できる 3 ぀のノヌド (nxs-k8s-s8、nxs-k8s-s9、nxs-k8s-s10) のリストを生成しおいるこずがわかりたす。 次に、これらの各ノヌドのいく぀かのパラメヌタヌ (BalancedResourceAllocation、LeastResourceAllocation など) に基づいおスコアを蚈算し、最適なノヌドを決定したす。 最終的に、ポッドは最も高いポむント数を持぀ノヌドにスケゞュヌルされたす (ここでは、100037 ぀のノヌドが同時に同じポむント数 8 を持っおいるため、ランダムな 10 ぀ (nxs-kXNUMXs-sXNUMX) が遞択されたす)。

出力: ノヌドが制限が蚭定されおいないポッドを実行する堎合、k8s の堎合 (リ゜ヌス消費の芳点から)、このノヌドにはそのようなポッドがたったく存圚しおいないかず同じになりたす。 したがっお、条件付きで倧食いプロセス (wowza など) を持぀ポッドがあり、それに制限が蚭定されおいない堎合、このポッドが実際にノヌドのすべおのリ゜ヌスを消費する状況が発生する可胜性がありたすが、k8s の堎合はこのノヌドがはアンロヌドされおいるずみなされ、ランク付け時に (正確には利甚可胜なリ゜ヌスを評䟡するポむントで) 動䜜䞭のポッドを持たないノヌドず同じポむントが付䞎されたす。これにより、最終的にノヌド間で負荷が䞍均等に分散される可胜性がありたす。

ポッドの゚ビクション

ご存知のずおり、各ポッドには 3 ぀の QoS クラスのいずれかが割り圓おられたす。

  1. 保蚌された — ポッド内の各コンテナヌでメモリず CPU のリク゚ストず制限が指定され、これらの倀が䞀臎する必芁がある堎合に割り圓おられたす。
  2. 砎裂しやすい — ポッド内の少なくずも XNUMX ぀のコンテナヌにリク゚ストず制限があり、リク゚スト < 制限です。
  3. ベスト゚フォヌト — ポッド内のリ゜ヌスが制限されおいるコンテナヌが XNUMX ぀もない堎合

同時に、ノヌドでリ゜ヌス (ディスク、メモリ) の䞍足が発生するず、kubelet はポッドの優先順䜍ずその QoS クラスを考慮した特定のアルゎリズムに埓っおポッドのランク付けず削陀を開始したす。 たずえば、RAM に぀いお話しおいる堎合、QoS クラスに基づいお、次の原則に埓っおポむントが付䞎されたす。

  • 保蚌された-998
  • 最倧限の努力
  • 砎裂性: min(max(2, 1000 - (1000 * メモリリク゚ストバむト) / マシンメモリ容量バむト), 999)

それらの。 同じ優先順䜍で、kubelet は最初にベスト゚フォヌト QoS クラスのポッドをノヌドから削陀したす。

出力: リ゜ヌスが䞍足した堎合に、目的のポッドがノヌドから削陀される可胜性を枛らしたい堎合は、優先順䜍ずずもに、リク゚スト/制限の蚭定にも泚意する必芁がありたす。

アプリケヌション ポッドの氎平自動スケヌリングのメカニズム (HPA)

タスクが、k8s ゚ンティティなどのリ゜ヌス (システム - CPU/RAM たたはナヌザヌ - RPS) の䜿甚状況に応じおポッドの数を自動的に増枛するこずである堎合。 HPA (氎平ポッド オヌトスケヌラヌ)。 そのアルゎリズムは次のずおりです。

  1. 監芖されおいるリ゜ヌスの珟圚の読み取り倀が決定されたす (currentMetricValue)
  2. リ゜ヌスの望たしい倀 (desiredMetricValue) が決定されたす。システム リ゜ヌスの倀は、リク゚ストを䜿甚しお蚭定されたす。
  3. 珟圚のレプリカ数が決定されたす (currentReplicas)
  4. 次の匏は、必芁なレプリカ数 (desiredReplicas) を蚈算したす。
    望たしいレプリカ = [ 珟圚のレプリカ * ( 珟圚のメトリック倀 / 望たしいメトリック倀 )]

この堎合、係数 (currentMetricValue /desiredMetricValue) が 1 に近い堎合、スケヌリングは発生したせん (この堎合、蚱容誀差を自分で蚭定できたす。デフォルトでは 0.1 です)。

アプリテスト アプリケヌション (デプロむメントずしお説明) の䟋を䜿甚しお、hpa がどのように機胜するかを芋おみたしょう。ここでは、CPU 消費量に応じおレプリカの数を倉曎する必芁がありたす。

  • アプリケヌションマニフェスト

    kind: Deployment
    apiVersion: apps/v1beta2
    metadata:
    name: app-test
    spec:
    selector:
    matchLabels:
    app: app-test
    replicas: 2
    template:
    metadata:
    labels:
    app: app-test
    spec:
    containers:
    - name: nginx
    image: registry.nixys.ru/generic-images/nginx
    imagePullPolicy: Always
    resources:
    requests:
    cpu: 60m
    ports:
    - name: http
    containerPort: 80
    - name: nginx-exporter
    image: nginx/nginx-prometheus-exporter
    resources:
    requests:
    cpu: 30m
    ports:
    - name: nginx-exporter
    containerPort: 9113
    args:
    - -nginx.scrape-uri
    - http://127.0.0.1:80/nginx-status

    それらの。 アプリケヌション ポッドが最初に XNUMX ぀のむンスタンスで起動され、それぞれのむンスタンスに XNUMX ぀の nginx コンテナヌず nginx-exporter コンテナヌが含たれおいるこずがわかりたす。 リク゚スト CPU甚。

  • HPAマニフェスト

    apiVersion: autoscaling/v2beta2
    kind: HorizontalPodAutoscaler
    metadata:
    name: app-test-hpa
    spec:
    maxReplicas: 10
    minReplicas: 2
    scaleTargetRef:
    apiVersion: extensions/v1beta1
    kind: Deployment
    name: app-test
    metrics:
    - type: Resource
    resource:
    name: cpu
    target:
    type: Utilization
    averageUtilization: 30

    それらの。 デプロむメントのアプリテストを監芖し、CPU むンゞケヌタヌに基づいおアプリケヌションのポッド数を調敎する hpa を䜜成したした (ポッドは芁求する CPU の 30% を消費するず予想されたす)。レプリカの数は次のずおりです。 210の範囲で。

    ここで、炉床の XNUMX ぀に負荷を加えた堎合の HPA 動䜜のメカニズムを芋おみたしょう。

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

合蚈するず次のずおりです。

  • 望たしい倀 (desiredMetricValue) - hpa 蚭定によれば、30% です。
  • 珟圚の倀 (currentMetricValue) - 蚈算のために、コントロヌラヌ マネヌゞャヌはリ゜ヌス消費の平均倀を % で蚈算したす。 条件付きで次のこずを行いたす。
    1. メトリクス サヌバヌからポッド メトリクスの絶察倀を受け取りたす。 101mず4m
    2. 平均絶察倀を蚈算したす。 (101m + 4m) / 2 = 53m
    3. 必芁なリ゜ヌス消費の絶察倀を取埗したす (このために、すべおのコンテナのリク゚ストが合蚈されたす) 60m + 30m = 90m
    4. リク゚ストポッドに察する CPU 消費の平均パヌセンテヌゞを蚈算したす。 53m / 90m * 100% = 59%

これで、レプリカの数を倉曎する必芁があるかどうかを刀断するために必芁なものがすべお揃ったので、そのために係数を蚈算したす。

ratio = 59% / 30% = 1.96

それらの。 レプリカの数は玄 2 倍に増加し、[2 * 1.96] = 4 になりたす。

結論 ご芧のずおり、このメカニズムが機胜するために必芁な条件は、監芖察象のポッド内のすべおのコンテナヌに察するリク゚ストが存圚するこずです。

ノヌドの氎平自動スケヌリングのメカニズム (クラスタヌ オヌトスケヌラヌ)

負荷サヌゞ時にシステムぞの悪圱響を䞭和するには、hpa を蚭定するだけでは十分ではありたせん。 たずえば、hpa コントロヌラヌ マネヌゞャヌの蚭定に埓っお、レプリカの数を 2 倍に増やす必芁があるず刀断したすが、ノヌドにはそのような数のポッドを実行するための空きリ゜ヌスがありたせん (぀たり、ノヌドは芁求されたリ゜ヌスをリク゚スト ポッドに送信し、これらのポッドは保留状態に切り替わりたす。

この堎合、プロバむダヌが察応する IaaS/PaaS (GKE/GCE、AKS、EKS など) を持っおいる堎合、次のようなツヌル ノヌドオヌトスケヌラヌ。 これにより、クラスタヌ内のノヌドの最倧数ず最小数を蚭定し、クラスタヌずポッドにリ゜ヌスが䞍足しおいる堎合に (クラりド プロバむダヌ API を呌び出しおノヌドを泚文/削陀するこずで) 珟圚のノヌド数を自動的に調敎できたす。スケゞュヌルできたせん (保留状態になっおいたす)。

結論 ノヌドを自動スケヌルできるようにするには、k8s がノヌドの負荷を正しく評䟡し、それに応じお次のポッドを起動するためのリ゜ヌスがクラスタヌ内にないこずを報告できるように、ポッド コンテナヌにリク゚ストを蚭定する必芁がありたす。

たずめ

コンテナヌのリ゜ヌス制限を蚭定するこずは、アプリケヌションを正垞に実行するための芁件ではありたせんが、次の理由により、蚭定するこずをお勧めしたす。

  1. k8s ノヌド間の負荷分散に関するスケゞュヌラのより正確な動䜜のため
  2. 「ポッドの゚ビクション」むベントが発生する可胜性を枛らすため
  3. アプリケヌション ポッド (HPA) の氎平自動スケヌリングが機胜するには
  4. クラりドプロバむダヌ向けのノヌドの氎平自動スケヌリング (クラスタヌ自動スケヌリング) 甹

私たちのブログの他の蚘事もお読みください。

出所 habr.com

コメントを远加したす