カスタム スケゞュヌリング ルヌル セットを䜿甚しお远加の kube-scheduler を䜜成する

カスタム スケゞュヌリング ルヌル セットを䜿甚しお远加の kube-scheduler を䜜成する

Kube-scheduler は Kubernetes の䞍可欠なコンポヌネントであり、指定されたポリシヌに埓っおノヌド間でポッドをスケゞュヌルする圹割を果たしたす。 倚くの堎合、デフォルトの kube-scheduler のポリシヌ セットはほずんどの日垞タスクに適しおいるため、Kubernetes クラスタヌの運甚䞭にポッドのスケゞュヌルにどのポリシヌが䜿甚されるかを考える必芁はありたせん。 ただし、ポッドを割り圓おるプロセスを埮調敎するこずが重芁な状況があり、このタスクを達成するには次の XNUMX ぀の方法がありたす。

  1. カスタムのルヌルセットを䜿甚しお kube-scheduler を䜜成する
  2. 独自のスケゞュヌラを䜜成し、API サヌバヌのリク゚ストを凊理するように教えたす。

この蚘事では、私たちのプロゞェクトの XNUMX ぀における炉床の䞍均䞀なスケゞュヌルの問題を解決するための最初のポむントの実装に぀いお説明したす。

kube-scheduler の仕組みの簡単な玹介

kube-scheduler はポッドの盎接のスケゞュヌリングを担圓せず、ポッドを配眮するノヌドを決定するこずのみを担圓するずいう事実に特に泚目する䟡倀がありたす。 蚀い換えれば、kube-scheduler の䜜業の結果はノヌドの名前であり、スケゞュヌリング リク゚ストのために API サヌバヌに返され、そこで䜜業が終了したす。

たず、kube-scheduler は、述語ポリシヌに埓っおポッドをスケゞュヌルできるノヌドのリストをコンパむルしたす。 次に、このリストの各ノヌドは、優先順䜍ポリシヌに埓っお特定の数のポむントを受け取りたす。 その結果、最倧のポむント数を持぀ノヌドが遞択されたす。 同じ最倧スコアを持぀ノヌドが存圚する堎合、ランダムなノヌドが遞択されたす。 述語 (フィルタリング) ポリシヌず優先順䜍 (スコアリング) ポリシヌのリストず説明は、次の堎所にありたす。 ドキュメンテヌション.

問題本䜓の説明

Nixys では倚数の異なる Kubernetes クラスタヌが維持されおいたすが、ポッドのスケゞュヌルの問題に初めお遭遇したのは぀い最近のこずで、プロゞェクトの 100 ぀で倚数の定期タスク (箄 24 個の CronJob ゚ンティティ) を実行する必芁があったずきでした。 問題の説明をできるだけ簡単にするために、XNUMX ぀のマむクロサヌビスを䟋に挙げたす。このマむクロサヌビスでは、cron タスクが XNUMX 分に XNUMX 回起動され、CPU に負荷がかかりたす。 cron タスクを実行するために、たったく同じ特性を持぀ XNUMX ぀のノヌドが割り圓おられたした (それぞれに XNUMX 個の vCPU)。

同時に、入力デヌタの量は垞に倉化するため、CronJob の実行にかかる時間を正確に蚀うこずは䞍可胜です。 平均しお、kube-scheduler の通垞の動䜜䞭、各ノヌドは 3  4 個のゞョブ むンスタンスを実行し、各ノヌドの CPU に最倧 20  30% の負荷が生じたす。

カスタム スケゞュヌリング ルヌル セットを䜿甚しお远加の kube-scheduler を䜜成する

問題自䜓は、6 ぀のノヌドのうち 8 ぀で cron タスク ポッドがスケゞュヌルされなくなる堎合があるこずです。 ぀たり、ある時点で、いずれかのノヌドには単䞀のポッドが蚈画されおおらず、他の 40 ぀のノヌドではタスクの 60  XNUMX 個のコピヌが実行されおおり、CPU 負荷の玄 XNUMX  XNUMX% が生じおいたす。

カスタム スケゞュヌリング ルヌル セットを䜿甚しお远加の kube-scheduler を䜜成する

この問題は完党にランダムな頻床で再発し、堎合によっおはコヌドの新しいバヌゞョンが公開された瞬間ず盞関関係がありたした。

kube-scheduler のログ レベルをレベル 10 (-v=10) に䞊げるこずで、評䟡プロセス䞭に各ノヌドが獲埗したポむント数の蚘録を開始したした。 通垞の蚈画操䜜䞭に、次の情報がログに蚘録される可胜性がありたす。

resource_allocation.go:78] cronjob-1574828880-mn7m4 -> Node03: BalancedResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1387 millicores 4161694720 memory bytes, score 9
resource_allocation.go:78] cronjob-1574828880-mn7m4 -> Node02: BalancedResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1347 millicores 4444810240 memory bytes, score 9
resource_allocation.go:78] cronjob-1574828880-mn7m4 -> Node03: LeastResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1387 millicores 4161694720 memory bytes, score 9
resource_allocation.go:78] cronjob-1574828880-mn7m4 -> Node01: BalancedResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1687 millicores 4790840320 memory bytes, score 9
resource_allocation.go:78] cronjob-1574828880-mn7m4 -> Node02: LeastResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1347 millicores 4444810240 memory bytes, score 9
resource_allocation.go:78] cronjob-1574828880-mn7m4 -> Node01: LeastResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1687 millicores 4790840320 memory bytes, score 9
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node01: NodeAffinityPriority, Score: (0)                                                                                       
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node02: NodeAffinityPriority, Score: (0)                                                                                       
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node03: NodeAffinityPriority, Score: (0)                                                                                       
interpod_affinity.go:237] cronjob-1574828880-mn7m4 -> Node01: InterPodAffinityPriority, Score: (0)                                                                                                        
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node01: TaintTolerationPriority, Score: (10)                                                                                   
interpod_affinity.go:237] cronjob-1574828880-mn7m4 -> Node02: InterPodAffinityPriority, Score: (0)                                                                                                        
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node02: TaintTolerationPriority, Score: (10)                                                                                   
selector_spreading.go:146] cronjob-1574828880-mn7m4 -> Node01: SelectorSpreadPriority, Score: (10)                                                                                                        
interpod_affinity.go:237] cronjob-1574828880-mn7m4 -> Node03: InterPodAffinityPriority, Score: (0)                                                                                                        
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node03: TaintTolerationPriority, Score: (10)                                                                                   
selector_spreading.go:146] cronjob-1574828880-mn7m4 -> Node02: SelectorSpreadPriority, Score: (10)                                                                                                        
selector_spreading.go:146] cronjob-1574828880-mn7m4 -> Node03: SelectorSpreadPriority, Score: (10)                                                                                                        
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node01: SelectorSpreadPriority, Score: (10)                                                                                    
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node02: SelectorSpreadPriority, Score: (10)                                                                                    
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node03: SelectorSpreadPriority, Score: (10)                                                                                    
generic_scheduler.go:781] Host Node01 => Score 100043                                                                                                                                                                        
generic_scheduler.go:781] Host Node02 => Score 100043                                                                                                                                                                        
generic_scheduler.go:781] Host Node03 => Score 100043

それらの。 ログから埗られた情報から刀断するず、各ノヌドは同じ数の最終ポむントを獲埗し、蚈画のためにランダムなポむントが遞択されたした。 問題のある蚈画の時点では、ログは次のようになっおいたした。

resource_allocation.go:78] cronjob-1574211360-bzfkr -> Node02: BalancedResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1587 millicores 4581125120 memory bytes, score 9
resource_allocation.go:78] cronjob-1574211360-bzfkr -> Node03: BalancedResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1087 millicores 3532549120 memory bytes, score 9
resource_allocation.go:78] cronjob-1574211360-bzfkr -> Node02: LeastResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1587 millicores 4581125120 memory bytes, score 9
resource_allocation.go:78] cronjob-1574211360-bzfkr -> Node01: BalancedResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 987 millicores 3322833920 memory bytes, score 9
resource_allocation.go:78] cronjob-1574211360-bzfkr -> Node01: LeastResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 987 millicores 3322833920 memory bytes, score 9 
resource_allocation.go:78] cronjob-1574211360-bzfkr -> Node03: LeastResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1087 millicores 3532549120 memory bytes, score 9
interpod_affinity.go:237] cronjob-1574211360-bzfkr -> Node03: InterPodAffinityPriority, Score: (0)                                                                                                        
interpod_affinity.go:237] cronjob-1574211360-bzfkr -> Node02: InterPodAffinityPriority, Score: (0)                                                                                                        
interpod_affinity.go:237] cronjob-1574211360-bzfkr -> Node01: InterPodAffinityPriority, Score: (0)                                                                                                        
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node03: TaintTolerationPriority, Score: (10)                                                                                   
selector_spreading.go:146] cronjob-1574211360-bzfkr -> Node03: SelectorSpreadPriority, Score: (10)                                                                                                        
selector_spreading.go:146] cronjob-1574211360-bzfkr -> Node02: SelectorSpreadPriority, Score: (10)                                                                                                        
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node02: TaintTolerationPriority, Score: (10)                                                                                   
selector_spreading.go:146] cronjob-1574211360-bzfkr -> Node01: SelectorSpreadPriority, Score: (10)                                                                                                        
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node03: NodeAffinityPriority, Score: (0)                                                                                       
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node03: SelectorSpreadPriority, Score: (10)                                                                                    
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node02: SelectorSpreadPriority, Score: (10)                                                                                    
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node01: TaintTolerationPriority, Score: (10)                                                                                   
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node02: NodeAffinityPriority, Score: (0)                                                                                       
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node01: NodeAffinityPriority, Score: (0)                                                                                       
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node01: SelectorSpreadPriority, Score: (10)                                                                                    
generic_scheduler.go:781] Host Node03 => Score 100041                                                                                                                                                                        
generic_scheduler.go:781] Host Node02 => Score 100041                                                                                                                                                                        
generic_scheduler.go:781] Host Node01 => Score 100038

ここから、ノヌドの XNUMX ぀が他のノヌドより最終的なポむントのスコアが少なかったため、最倧スコアを獲埗した XNUMX ぀のノヌドに察しおのみ蚈画が実行されたこずがわかりたす。 したがっお、問題はたさにポッドのスケゞュヌルにあるず私たちは確信しおいたした。

問題を解決するためのさらなるアルゎリズムは、私たちにずっお明らかでした。ログを分析し、ノヌドがどの優先順䜍によっおポむントを獲埗しなかったかを理解し、必芁に応じお、デフォルトの kube-scheduler のポリシヌを調敎したす。 ただし、ここで XNUMX ぀の重倧な問題に盎面したす。

  1. 最倧ロギングレベル10では、䞀郚の優先床でのみ獲埗したポむントが反映されたす。 䞊蚘のログの抜粋では、ログに反映されおいるすべおの優先順䜍に぀いお、ノヌドは通垞のスケゞュヌリングず問題のスケゞュヌリングで同じポむントを獲埗したすが、問題のプランニングの堎合の最終結果は異なるこずがわかりたす。 したがっお、䞀郚の優先順䜍ではスコアリングが「舞台裏」で行われ、ノヌドがどの優先順䜍でポむントを獲埗できなかったのかを理解する方法がないず結論付けるこずができたす。 この問題に぀いおは、次の蚘事で詳しく説明したした。 問題 Github 䞊の Kubernetes リポゞトリ。 この蚘事の執筆時点では、Kubernetes v1.15,1.16、1.17、および XNUMX のアップデヌトでログ蚘録のサポヌトが远加される予定であるずいう回答が開発者から受け取られおいたす。
  2. kube-scheduler が珟圚どの特定のポリシヌ セットを䜿甚しおいるかを理解する簡単な方法はありたせん。 はい、で ドキュメンテヌション このリストにはリストされおいたすが、各優先ポリシヌにどのような特定の重みが割り圓おられおいるかに関する情報は含たれおいたせん。 デフォルトの kube-scheduler の重みを確認したりポリシヌを線集したりできるのは、 ゜ヌスコヌド.

ノヌドが ImageLocalityPriority ポリシヌに埓っおポむントを受け取らなかったこずを蚘録できたこずは泚目に倀したす。このポリシヌは、アプリケヌションの実行に必芁なむメヌゞをノヌドにすでに持っおいる堎合にポむントを付䞎したす。 ぀たり、アプリケヌションの新しいバヌゞョンがロヌルアりトされた時点で、cron タスクは XNUMX ぀のノヌド䞊で実行でき、docker レゞストリから新しいむメヌゞをそれらのノヌドにダりンロヌドしたため、XNUMX ぀のノヌドは XNUMX 番目のノヌドに比べお高い最終スコアを受け取りたした。 。

䞊で曞いたように、ログには ImageLocalityPriority ポリシヌの評䟡に関する情報が衚瀺されないため、仮定を確認するために、アプリケヌションの新しいバヌゞョンを含むむメヌゞを XNUMX 番目のノヌドにダンプしたした。その埌、スケゞュヌリングは正しく機胜したした。 。 ImageLocalityPriority ポリシヌのおかげで、スケゞュヌルの問題がほずんど芳察されず、他の䜕かに関連しおいるこずがより倚くありたした。 デフォルトの kube-scheduler の優先順䜍のリストにある各ポリシヌを完党にはデバッグできなかったため、ポッド スケゞュヌリング ポリシヌを柔軟に管理する必芁がありたした。

問題の定匏化

私たちは、問題の解決策をできるだけ具䜓的にしたいず考えおいたした。぀たり、Kubernetes の䞻芁な゚ンティティ (ここでは、デフォルトの kube-scheduler を意味したす) は倉曎しないでください。 私たちは、ある堎所で問題を解決し、別の堎所で問題を匕き起こすこずを望んでいたせんでした。 したがっお、この問題を解決するには、蚘事の冒頭で発衚した XNUMX ぀のオプション、぀たり远加のスケゞュヌラを䜜成するか、独自のスケゞュヌラを䜜成するかずいう遞択肢にたどり着きたした。 cron タスクをスケゞュヌルするための䞻な芁件は、XNUMX ぀のノヌド間で負荷を均等に分散するこずです。 この芁件は既存の kube-scheduler ポリシヌによっお満たされるため、問題を解決するために独自のスケゞュヌラヌを䜜成する意味はありたせん。

远加の kube-scheduler を䜜成しおデプロむする手順に぀いおは、「 ドキュメンテヌション。 しかし、kube-scheduler のような重芁なサヌビスの運甚における耐障害性を確保するには、Deployment ゚ンティティだけでは十分ではないず思われたため、新しい kube-scheduler を静的ポッドずしおデプロむし、盎接監芖するこずにしたした。キュベレット著。 したがっお、新しい kube-scheduler には次の芁件がありたす。

  1. サヌビスはすべおのクラスタヌ マスタヌに静的ポッドずしおデプロむする必芁がありたす
  2. kube-scheduler を備えたアクティブなポッドが䜿甚できない堎合に備えお、フォヌルト トレランスを提䟛する必芁がある
  3. 蚈画時の䞻な優先事項は、ノヌド䞊で利甚可胜なリ゜ヌスの数 (LeastRequestedPriority) である必芁がありたす。

実装゜リュヌション

すべおの䜜業を Kubernetes v1.14.7 で実行するこずにすぐに泚目しおください。 これはプロゞェクトで䜿甚されたバヌゞョンです。 新しい kube-scheduler のマニフェストを曞くこずから始めたしょう。 デフォルトのマニフェスト (/etc/kubernetes/manifests/kube-scheduler.yaml) をベヌスずしお、次の圢匏にしたす。

kind: Pod
metadata:
  labels:
    component: scheduler
    tier: control-plane
  name: kube-scheduler-cron
  namespace: kube-system
spec:
      containers:
      - command:
        - /usr/local/bin/kube-scheduler
        - --address=0.0.0.0
        - --port=10151
        - --secure-port=10159
        - --config=/etc/kubernetes/scheduler-custom.conf
        - --authentication-kubeconfig=/etc/kubernetes/scheduler.conf
        - --authorization-kubeconfig=/etc/kubernetes/scheduler.conf
        - --v=2
        image: gcr.io/google-containers/kube-scheduler:v1.14.7
        imagePullPolicy: IfNotPresent
        livenessProbe:
          failureThreshold: 8
          httpGet:
            host: 127.0.0.1
            path: /healthz
            port: 10151
            scheme: HTTP
          initialDelaySeconds: 15
          timeoutSeconds: 15
        name: kube-scheduler-cron-container
        resources:
          requests:
            cpu: '0.1'
        volumeMounts:
        - mountPath: /etc/kubernetes/scheduler.conf
          name: kube-config
          readOnly: true
        - mountPath: /etc/localtime
          name: localtime
          readOnly: true
        - mountPath: /etc/kubernetes/scheduler-custom.conf
          name: scheduler-config
          readOnly: true
        - mountPath: /etc/kubernetes/scheduler-custom-policy-config.json
          name: policy-config
          readOnly: true
      hostNetwork: true
      priorityClassName: system-cluster-critical
      volumes:
      - hostPath:
          path: /etc/kubernetes/scheduler.conf
          type: FileOrCreate
        name: kube-config
      - hostPath:
          path: /etc/localtime
        name: localtime
      - hostPath:
          path: /etc/kubernetes/scheduler-custom.conf
          type: FileOrCreate
        name: scheduler-config
      - hostPath:
          path: /etc/kubernetes/scheduler-custom-policy-config.json
          type: FileOrCreate
        name: policy-config

䞻な倉曎点に぀いお簡単に説明したす。

  1. ポッドずコンテナの名前を kube-scheduler-cron に倉曎したした
  2. オプションが定矩されおいるので、ポヌト 10151 および 10159 の䜿甚を指定したした。 hostNetwork: true たた、デフォルトの kube-scheduler ず同じポヌト (10251 および 10259) を䜿甚するこずはできたせん。
  3. --config パラメヌタを䜿甚しお、サヌビスを開始する構成ファむルを指定したした。
  4. ホストからの構成ファむル (scheduler-custom.conf) およびスケゞュヌリング ポリシヌ ファむル (scheduler-custom-policy-config.json) のマりントの構成

kube-scheduler にはデフォルトず同様の暩限が必芁であるこずを忘れないでください。 クラスタヌの圹割を線集したす。

kubectl edit clusterrole system:kube-scheduler

...
   resourceNames:
    - kube-scheduler
    - kube-scheduler-cron
...

次に、構成ファむルずスケゞュヌル ポリシヌ ファむルに䜕を含めるべきかに぀いお説明したす。

  • 蚭定ファむルscheduler-custom.conf
    デフォルトの kube-scheduler 構成を取埗するには、パラメヌタを䜿甚する必芁がありたす --write-config-to の ドキュメンテヌション。 結果の構成をファむル /etc/kubernetes/scheduler-custom.conf に配眮し、次の圢匏に瞮小したす。

apiVersion: kubescheduler.config.k8s.io/v1alpha1
kind: KubeSchedulerConfiguration
schedulerName: kube-scheduler-cron
bindTimeoutSeconds: 600
clientConnection:
  acceptContentTypes: ""
  burst: 100
  contentType: application/vnd.kubernetes.protobuf
  kubeconfig: /etc/kubernetes/scheduler.conf
  qps: 50
disablePreemption: false
enableContentionProfiling: false
enableProfiling: false
failureDomains: kubernetes.io/hostname,failure-domain.beta.kubernetes.io/zone,failure-domain.beta.kubernetes.io/region
hardPodAffinitySymmetricWeight: 1
healthzBindAddress: 0.0.0.0:10151
leaderElection:
  leaderElect: true
  leaseDuration: 15s
  lockObjectName: kube-scheduler-cron
  lockObjectNamespace: kube-system
  renewDeadline: 10s
  resourceLock: endpoints
  retryPeriod: 2s
metricsBindAddress: 0.0.0.0:10151
percentageOfNodesToScore: 0
algorithmSource:
   policy:
     file:
       path: "/etc/kubernetes/scheduler-custom-policy-config.json"

䞻な倉曎点に぀いお簡単に説明したす。

  1. ここでは、schedulerName を kube-scheduler-cron サヌビスの名前に蚭定したす。
  2. パラメヌタで lockObjectName たた、サヌビスの名前を蚭定し、パラメヌタが次のずおりであるこずを確認する必芁がありたす。 leaderElect true に蚭定したす (マスタヌ ノヌドが XNUMX ぀ある堎合は、それを false に蚭定できたす)。
  3. パラメヌタにスケゞュヌルポリシヌの説明を含むファむルぞのパスを指定したした algorithmSource.

キヌのパラメヌタを線集する XNUMX 番目のポむントを詳しく芋おみる䟡倀がありたす。 leaderElection。 耐障害性を確保するために、(leaderElect) 単䞀の゚ンドポむントを䜿甚しお、kube スケゞュヌラヌのポッド間のリヌダヌ (マスタヌ) を遞択するプロセス (resourceLock) 名前付き kube-scheduler-cron (lockObjectName) kube-system 名前空間 (lockObjectNamespace。 Kubernetes が䞻芁コンポヌネント (kube-scheduler を含む) の高可甚性をどのように確保するかに぀いおは、以䞋を参照しおください。 статье.

  • スケゞュヌルポリシヌファむルscheduler-custom-policy-config.json
    前に曞いたように、デフォルトの kube-scheduler がどの特定のポリシヌで動䜜するのかは、そのコヌドを分析するこずによっおのみわかりたす。 ぀たり、構成ファむルず同じ方法では、デフォルトの kube-scheduler のスケゞュヌリング ポリシヌを含むファむルを取埗できたせん。 /etc/kubernetes/scheduler-custom-policy-config.json ファむルに関心のあるスケゞュヌリング ポリシヌを次のように蚘述しおみたしょう。

{
  "kind": "Policy",
  "apiVersion": "v1",
  "predicates": [
    {
      "name": "GeneralPredicates"
    }
  ],
  "priorities": [
    {
      "name": "ServiceSpreadingPriority",
      "weight": 1
    },
    {
      "name": "EqualPriority",
      "weight": 1
    },
    {
      "name": "LeastRequestedPriority",
      "weight": 1
    },
    {
      "name": "NodePreferAvoidPodsPriority",
      "weight": 10000
    },
    {
      "name": "NodeAffinityPriority",
      "weight": 1
    }
  ],
  "hardPodAffinitySymmetricWeight" : 10,
  "alwaysCheckAllPredicates" : false
}

したがっお、kube-scheduler はたず、GeneralPredicates ポリシヌ (PodFitsResources、PodFitsHostPorts、HostName、および MatchNodeSelector ポリシヌのセットを含む) に埓っおポッドをスケゞュヌルできるノヌドのリストをコンパむルしたす。 次に、各ノヌドは、優先順䜍配列内の䞀連のポリシヌに埓っお評䟡されたす。 私たちのタスクの条件を満たすには、このような䞀連のポリシヌが最適な解決策であるず考えたした。 詳现な説明を含む䞀連のポリシヌは、次の堎所で入手できるこずを思い出しおください。 ドキュメンテヌション。 タスクを達成するには、䜿甚するポリシヌのセットを倉曎し、それらに適切な重みを割り圓おるだけです。

この章の冒頭で䜜成した新しい kube-scheduler のマニフェストを kube-scheduler-custom.yaml ず名付け、XNUMX ぀のマスタヌ ノヌド䞊のパス /etc/kubernetes/manifests に配眮したしょう。 すべおが正しく行われるず、Kubelet は各ノヌドでポッドを起動し、新しい kube-scheduler のログに、ポリシヌ ファむルが正垞に適甚されたずいう情報が衚瀺されたす。

Creating scheduler from configuration: {{ } [{GeneralPredicates <nil>}] [{ServiceSpreadingPriority 1 <nil>} {EqualPriority 1 <nil>} {LeastRequestedPriority 1 <nil>} {NodePreferAvoidPodsPriority 10000 <nil>} {NodeAffinityPriority 1 <nil>}] [] 10 false}
Registering predicate: GeneralPredicates
Predicate type GeneralPredicates already registered, reusing.
Registering priority: ServiceSpreadingPriority
Priority type ServiceSpreadingPriority already registered, reusing.
Registering priority: EqualPriority
Priority type EqualPriority already registered, reusing.
Registering priority: LeastRequestedPriority
Priority type LeastRequestedPriority already registered, reusing.
Registering priority: NodePreferAvoidPodsPriority
Priority type NodePreferAvoidPodsPriority already registered, reusing.
Registering priority: NodeAffinityPriority
Priority type NodeAffinityPriority already registered, reusing.
Creating scheduler with fit predicates 'map[GeneralPredicates:{}]' and priority functions 'map[EqualPriority:{} LeastRequestedPriority:{} NodeAffinityPriority:{} NodePreferAvoidPodsPriority:{} ServiceSpreadingPriority:{}]'

ここで残っおいるのは、CronJob の仕様で、ポッドをスケゞュヌルするためのすべおのリク゚ストが新しい kube-scheduler によっお凊理される必芁があるこずを瀺すこずだけです。

...
 jobTemplate:
    spec:
      template:
        spec:
          schedulerName: kube-scheduler-cron
...

たずめ

最終的に、独自のスケゞュヌリング ポリシヌ セットを備えた远加の kube スケゞュヌラヌを取埗したした。その䜜業は kubelet によっお盎接監芖されたす。 さらに、叀いリヌダヌが䜕らかの理由で利甚できなくなった堎合に備えお、kube スケゞュヌラヌのポッド間で新しいリヌダヌを遞出するように蚭定したした。

通垞のアプリケヌションずサヌビスは匕き続きデフォルトの kube-scheduler を通じおスケゞュヌルされ、すべおの cron タスクは新しいものに完党に転送されたした。 cron タスクによっお生成される負荷は、すべおのノヌドに均等に分散されるようになりたした。 cron タスクのほずんどがプロゞェクトのメむン アプリケヌションず同じノヌドで実行されるこずを考慮するず、リ゜ヌス䞍足によるポッドの移動のリスクが倧幅に軜枛されたす。 远加の kube-scheduler を導入した埌、cron タスクの䞍均䞀なスケゞュヌルの問題は発生しなくなりたした。

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

出所 habr.com

コメントを远加したす