Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ kube-scheduler’a с кастомным Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΏΡ€Π°Π²ΠΈΠ» планирования

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ kube-scheduler’a с кастомным Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΏΡ€Π°Π²ΠΈΠ» планирования

Kube-scheduler являСтся Π½Π΅ΠΎΡ‚ΡŠΠ΅ΠΌΠ»Π΅ΠΌΡ‹ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ Kubernetes, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΎΠ² ΠΏΠΎ Π½ΠΎΠ΄Π°ΠΌ Π² соотвСтствии с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°ΠΌΠΈ. Π—Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ, Π² процСссС эксплуатации Kubernetes-кластСра Π½Π°ΠΌ Π½Π΅ приходится Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Ρ‚ΡŒΡΡ ΠΎ Ρ‚ΠΎΠΌ, ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°ΠΌ происходит ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΎΠ², Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π°Π±ΠΎΡ€ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ³ΠΎ kube-scheduler’a ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° повсСднСвных Π·Π°Π΄Π°Ρ‡. Однако Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ ситуации, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π²Π°ΠΆΠ½ΠΎ Ρ‚ΠΎΠ½ΠΊΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ процСссом распрСдСлСния ΠΏΠΎΠ΄ΠΎΠ², ΠΈ для выполнСния этой Π·Π°Π΄Π°Ρ‡ΠΈ Π΅ΡΡ‚ΡŒ Π΄Π²Π° ΠΏΡƒΡ‚ΠΈ:

  1. Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ kube-scheduler с кастомным Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΏΡ€Π°Π²ΠΈΠ»
  2. ΠΠ°ΠΏΠΈΡΠ°Ρ‚ΡŒ свой собствСнный scheduler ΠΈ Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с запросами API-сСрвСра

Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ я ΠΎΠΏΠΈΡˆΡƒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΡƒΠ½ΠΊΡ‚Π° для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π½Π΅Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ планирования ΠΏΠΎΠ΄ΠΎΠ² Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ².

ΠšΡ€Π°Ρ‚ΠΊΠ°Ρ вводная ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ kube-scheduler’a

Π‘Ρ‚ΠΎΠΈΡ‚ особо ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ kube-scheduler Π½Π΅ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° нСпосрСдствСнноС ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΎΠ² β€” ΠΎΠ½ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ΄Ρ‹, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄. Π˜Π½Π°Ρ‡Π΅ говоря, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ kube-scheduler’a β€” это имя Π½ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ API-сСрвСру Π½Π° запрос ΠΎ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈ Π½Π° этом Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Π° заканчиваСтся.

Π‘Π½Π°Ρ‡Π°Π»Π° kube-scheduler составляСт список Π½ΠΎΠ΄, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ ΠΏΠΎΠ΄ Π² соотвСтствии с ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°ΠΌΠΈ predicates. Π”Π°Π»Π΅Π΅ каТдая Π½ΠΎΠ΄Π° ΠΈΠ· этого списка ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ΅ количСство ΠΎΡ‡ΠΊΠΎΠ² Π² соотвСтствии с ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°ΠΌΠΈ priorites. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выбираСтся Π½ΠΎΠ΄Π°, Π½Π°Π±Ρ€Π°Π²ΡˆΠ°Ρ максимальноС количСство ΠΎΡ‡ΠΊΠΎΠ². Если Π΅ΡΡ‚ΡŒ Π½ΠΎΠ΄Ρ‹, Π½Π°Π±Ρ€Π°Π²ΡˆΠΈΠ΅ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π±Π°Π»Π», выбираСтся случайная. Π‘ΠΎ списком ΠΈ описаниСм ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ predicates (filtering) ΠΈ priorites (scoring) ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

ОписаниС Ρ‚Π΅Π»Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹

НСсмотря Π½Π° большоС количСство Ρ€Π°Π·Π½Ρ‹Ρ… Kubernetes кластСров Π½Π° обслуТивании Π² Nixys, Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ планирования ΠΏΠΎΠ΄ΠΎΠ² ΠΌΡ‹ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅Π΄Π°Π²Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² появилась Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ запуска большого количСства пСриодичСских Π·Π°Π΄Π°Ρ‡ (~100 сущностСй CronJob). Π§Ρ‚ΠΎΠ±Ρ‹ максимально ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ описаниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²ΠΎΠ·ΡŒΠΌΡ‘ΠΌ ΠΎΠ΄ΠΈΠ½ микросСрвис, Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ€Π°Π· Π² ΠΌΠΈΠ½ΡƒΡ‚Ρƒ запускаСтся cron-Π·Π°Π΄Π°Ρ‡Π°, ΡΠΎΠ·Π΄Π°ΡŽΡ‰Π°Ρ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Π½Π° CPU. Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ cron-Π·Π°Π΄Π°Ρ‡ΠΈ Π±Ρ‹Π»ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½Ρ‹ Ρ‚Ρ€ΠΈ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΏΠΎ характСристикам Π½ΠΎΠ΄Ρ‹ (24 vCPU Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ).

ΠŸΡ€ΠΈ этом нСльзя с Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ сколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ CronJob, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΡ‘ΠΌ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… постоянно мСняСтся. Π’ срСднСм, ΠΏΡ€ΠΈ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ kube-scheduler’a, Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½ΠΎΠ΄Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ 3-4 экзСмпляра задания, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ~20-30% Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½Π° CPU ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½ΠΎΠ΄Ρ‹:

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ kube-scheduler’a с кастомным Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΏΡ€Π°Π²ΠΈΠ» планирования

Π‘Π°ΠΌΠ° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΏΠΎΠ΄Ρ‹ cron-Π·Π°Π΄Π°Ρ‡ΠΈ пСрСставали ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° ΠΎΠ΄Π½Ρƒ ΠΈΠ· Ρ‚Ρ€Ρ‘Ρ… Π½ΠΎΠ΄. Π’ΠΎ Π΅ΡΡ‚ΡŒ, Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° ΠΎΠ΄Π½Ρƒ ΠΈΠ· Π½ΠΎΠ΄ Π½Π΅ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π»ΠΎΡΡŒ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π°, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π½Π° Π΄Π²ΡƒΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… Π½ΠΎΠ΄Π°Ρ… Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ ΠΏΠΎ 6-8 экзСмпляров задания создавая ~40-60% Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½Π° CPU:

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ kube-scheduler’a с кастомным Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΏΡ€Π°Π²ΠΈΠ» планирования

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΠ»Π°ΡΡŒ с Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ случайной ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈ ΠΈΠ·Ρ€Π΅Π΄ΠΊΠ° ΠΊΠΎΡ€Ρ€Π΅Π»ΠΈΡ€ΠΎΠ²Π°Π»Π° с ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠΌ Π²Ρ‹ΠΊΠ°Ρ‚ΠΊΠΈ Π½ΠΎΠ²ΠΎΠΉ вСрсии ΠΊΠΎΠ΄Π°.

ΠŸΠΎΠ²Ρ‹ΡΠΈΠ² ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ логирования kube-scheduler’a Π΄ΠΎ 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

Из ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· Π½ΠΎΠ΄ Π½Π°Π±ΠΈΡ€Π°Π»Π° мСньшС ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹Ρ… ΠΎΡ‡ΠΊΠΎΠ² Ρ‡Π΅ΠΌ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅, ΠΈ поэтому ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΎΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Π΄Π²Π΅ Π½ΠΎΠ΄Ρ‹, Π½Π°Π±Ρ€Π°Π²ΡˆΠΈΠ΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π±Π°Π»Π». Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ Ρ‚ΠΎΡ‡Π½ΠΎ ΡƒΠ±Π΅Π΄ΠΈΠ»ΠΈΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠΎΠ΄ΠΎΠ².

Π”Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π±Ρ‹Π» для нас ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½ β€” ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈ, ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρƒ Π½ΠΎΠ΄Π° Π½Π΅ Π΄ΠΎΠ±Ρ€Π°Π»Π° ΠΎΡ‡ΠΊΠΎΠ² ΠΈ, ΠΏΡ€ΠΈ нСобходимости, ΡΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ³ΠΎ kube-scheduler’а. Однако здСсь ΠΌΡ‹ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ с двумя сущСствСнными слоТностями:

  1. На максимальном ΡƒΡ€ΠΎΠ²Π½Π΅ логирования (10) отраТаСтся Π½Π°Π±ΠΎΡ€ ΠΎΡ‡ΠΊΠΎΠ² Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°ΠΌ. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΎΡ‚Ρ€Ρ‹Π²ΠΊΠ΅ Π»ΠΎΠ³ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎ всСм ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°ΠΌ, ΠΎΡ‚Ρ€Π°ΠΆΡ‘Π½Π½Ρ‹ΠΌ Π² Π»ΠΎΠ³Π°Ρ…, Π½ΠΎΠ΄Ρ‹ Π½Π°Π±ΠΈΡ€Π°ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ количСство ΠΎΡ‡ΠΊΠΎΠ² ΠΏΡ€ΠΈ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΌ ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠΌ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, ΠΎΠ΄Π½Π°ΠΊΠΎ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² случаС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠ³ΠΎ планирования отличаСтся. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°ΠΌ подсчёт ΠΎΡ‡ΠΊΠΎΠ² происходит β€œΠ·Π° кадром”, ΠΈ Ρƒ нас Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ возмоТности ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρƒ Π½ΠΎΠ΄Π° Π½Π΅ Π΄ΠΎΠ±Ρ€Π°Π»Π° ΠΎΡ‡ΠΊΠΈ. Π”Π°Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΌΡ‹ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ описали Π² issue рСпозитория Kubernetes Π½Π° Github. На ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания ΡΡ‚Π°Ρ‚ΡŒΠΈ Π±Ρ‹Π» ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ΠΎΡ‚Π²Π΅Ρ‚ ΠΎΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° логирования Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π² обновлСниях Kubernetes v1.15,1.16 ΠΈ 1.17.
  2. НСт простого способа ΠΏΠΎΠ½ΡΡ‚ΡŒ с ΠΊΠ°ΠΊΠΈΠΌ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ kube-scheduler. Π”Π°, Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ этот список пСрСчислСн, Π½ΠΎ Π² Π½Ρ‘ΠΌ Π½Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ вСса выставлСны ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ priorites. Π£Π²ΠΈΠ΄Π΅Ρ‚ΡŒ вСса ΠΈΠ»ΠΈ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ³ΠΎ kube-scheduler’a ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² исходниках.

Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π½Π°ΠΌ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½ΠΎΠ΄Π° Π½Π΅ Π΄ΠΎΠ±ΠΈΡ€Π°Π»Π° ΠΎΡ‡ΠΊΠΈ ΠΏΠΎ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ΅ ImageLocalityPriority, которая начисляСт ΠΎΡ‡ΠΊΠΈ Π½ΠΎΠ΄Π΅, Ссли Π½Π° Π½Π΅ΠΉ ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π·, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ для запуска прилоТСния. Π’. Π΅. Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ‹ΠΊΠ°Ρ‚ΠΊΠΈ Π½ΠΎΠ²ΠΎΠΉ вСрсии прилоТСния cron-Π·Π°Π΄Π°Ρ‡Π° успСвала Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ Π½Π° Π΄Π²ΡƒΡ… Π½ΠΎΠ΄Π°Ρ…, выкачивая Π½Π° Π½ΠΈΡ… Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π· ΠΈΠ· docker registry, ΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΄Π²Π΅ Π½ΠΎΠ΄Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π»ΠΈ бОльший ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ Π±Π°Π»Π» ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ.

Как я ΡƒΠΆΠ΅ писал Π²Ρ‹ΡˆΠ΅, Π² Π»ΠΎΠ³Π°Ρ… ΠΌΡ‹ Π½Π΅ Π²ΠΈΠ΄ΠΈΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± ΠΎΡ†Π΅Π½ΠΊΠ΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ ImageLocalityPriority, поэтому, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ своё ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΌΡ‹ спулили ΠΎΠ±Ρ€Π°Π· с Π½ΠΎΠ²ΠΎΠΉ вСрсиСй прилоТСния Π½Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ Π½ΠΎΠ΄Ρƒ, послС Ρ‡Π΅Π³ΠΎ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ. ИмСнно ΠΈΠ·-Π·Π° ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ ImageLocalityPriority ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° планирования наблюдалась достаточно Ρ€Π΅Π΄ΠΊΠΎ, Ρ‡Π°Ρ‰Π΅ ΠΎΠ½Π° Π±Ρ‹Π»Π° связана с Ρ‡Π΅ΠΌ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ. Из-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎ Π΄Π΅Π±Π°ΠΆΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΈΠ· ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ Π² спискС priorites Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ³ΠΎ kube-scheduler’a, Ρƒ нас появилась Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² Π³ΠΈΠ±ΠΊΠΎΠΌ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°ΠΌΠΈ планирования ΠΏΠΎΠ΄ΠΎΠ².

ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Ρ‡ΠΈ

ΠœΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π±Ρ‹Π»ΠΎ максимально Ρ‚ΠΎΡ‡Π΅Ρ‡Π½Ρ‹ΠΌ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ основныС сущности Kubernetes (Ρ‚ΡƒΡ‚ имССтся Π²Π²ΠΈΠ΄Ρƒ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹ΠΉ kube-scheduler) Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ. Нам Π½Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π² ΠΎΠ΄Π½ΠΎΠΌ мСстС ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π΅Ρ‘ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ ΠΏΡ€ΠΈΡˆΠ»ΠΈ ΠΊ Π΄Π²ΡƒΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΎΠ·Π²ΡƒΡ‡Π΅Π½Ρ‹ Π²ΠΎ Π²Π²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΊ ΡΡ‚Π°Ρ‚ΡŒΠ΅ β€” созданиС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ scheduler’a ΠΈΠ»ΠΈ написаниС своСго. ОсновноС Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ cron-Π·Π°Π΄Π°Ρ‡ β€” Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠ΅ распрСдСлСниС Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΏΠΎ Ρ‚Ρ€Ρ‘ΠΌ Π½ΠΎΠ΄Π°ΠΌ. Π­Ρ‚ΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΡŒ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°ΠΌΠΈ kube-scheduler’a, поэтому для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ нашСй Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π΅Ρ‚ смысла ΠΏΠΈΡΠ°Ρ‚ΡŒ свой собствСнный scheduler.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ создания ΠΈ Deployment Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ kube-scheduler’a описаны Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ. Однако, Π½Π°ΠΌ показалось, Ρ‡Ρ‚ΠΎ сущности Deployment нСдостаточно для обСспСчСния отказоустойчивости Π² Ρ€Π°Π±ΠΎΡ‚Π΅ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎΠ³ΠΎ сСрвиса ΠΊΠ°ΠΊ kube-scheduler, поэтому ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ kube-scheduler ΠΊΠ°ΠΊ Static Pod, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ нСпосрСдствСнно Kubelet. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρƒ нас слоТились ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ трСбования ΠΊ Π½ΠΎΠ²ΠΎΠΌΡƒ kube-scheduler’у:

  1. БСрвис Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π²Ρ‘Ρ€Π½ΡƒΡ‚ ΠΊΠ°ΠΊ Static Pod Π½Π° всСх мастСрах кластСра
  2. Π”ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ прСдусмотрСна ΠΎΡ‚ΠΊΠ°Π·ΠΎΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ Π½Π° случай нСдоступности Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π° с kube-scheduler’ом
  3. ΠžΡΠ½ΠΎΠ²Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ ΠΏΡ€ΠΈ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ количСство доступных рСсурсов Π½Π° Π½ΠΎΠ΄Π΅ (LeastRequestedPriority)

РСализация Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

Π‘Ρ‚ΠΎΠΈΡ‚ сразу ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ всС Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Π² Kubernetes v1.14.7, Ρ‚.ΠΊ. ΠΈΠΌΠ΅Π½Π½ΠΎ эта вСрсия использовалась Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅. Начнём с написания манифСста для нашСго Π½ΠΎΠ²ΠΎΠ³ΠΎ kube-scheduler’a. Π—Π° основу Π²ΠΎΠ·ΡŒΠΌΡ‘ΠΌ манифСст Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ³ΠΎ (/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’a Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ --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 (Π² случаС, Ссли Ρƒ вас ΠΎΠ΄Π½Π° мастСр-Π½ΠΎΠ΄Π°, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false).
  3. Π£ΠΊΠ°Π·Π°Π»ΠΈ ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ с описаниСм ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ планирования Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ algorithmSource.

Π‘Ρ‚ΠΎΠΈΡ‚ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΡƒΠ½ΠΊΡ‚Π΅, Π³Π΄Π΅ ΠΌΡ‹ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ для ΠΊΠ»ΡŽΡ‡Π° leaderElection. Для обСспСчСния отказоустойчивости ΠΌΡ‹ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ (leaderElect) процСсс Π²Ρ‹Π±ΠΎΡ€Π° Π²Π΅Π΄ΡƒΡ‰Π΅Π³ΠΎ (мастСра) ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΠ΄Π°ΠΌΠΈ нашСго kube-scheduler’a с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ использования Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ для Π½ΠΈΡ… endpoint (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). И Π΄Π°Π»Π΅Π΅ производится ΠΎΡ†Π΅Π½ΠΊΠ° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½ΠΎΠ΄Ρ‹ Π² соотвСтствии с Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ Π² массивС priorities. Для выполнСния условий нашСй Π·Π°Π΄Π°Ρ‡ΠΈ ΠΌΡ‹ посчитали, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ Π½Π°Π±ΠΎΡ€ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ. Напомню, Ρ‡Ρ‚ΠΎ Π½Π°Π±ΠΎΡ€ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ с ΠΈΡ… ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΌ описаниСм доступСн Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ. Для выполнСния своСй Π·Π°Π΄Π°Ρ‡ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ ΠΈ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ ΠΈΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ вСса.

ΠœΠ°Π½ΠΈΡ„Π΅ΡΡ‚ Π½ΠΎΠ²ΠΎΠ³ΠΎ kube-scheduler’а, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ создавали Π² Π½Π°Ρ‡Π°Π»Π΅ Π³Π»Π°Π²Ρ‹, Π½Π°Π·ΠΎΠ²Ρ‘ΠΌ kube-scheduler-custom.yaml ΠΈ размСстим ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΏΡƒΡ‚ΠΈ /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:{}]'

Π’Π΅ΠΏΠ΅Ρ€ΡŒ остаётся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π² spec’С нашСй CronJob’ы, Ρ‡Ρ‚ΠΎ всС запросы Π½Π° ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΅Ρ‘ pod’ов Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ наш Π½ΠΎΠ²Ρ‹ΠΉ kube-scheduler:

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

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ kube-scheduler с ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ планирования, Π·Π° Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ слСдит нСпосрСдствСнно kubelet. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ ΠΌΡ‹ настроили Π²Ρ‹Π±ΠΎΡ€Ρ‹ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π»ΠΈΠ΄Π΅Ρ€Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΠ΄Π°ΠΌΠΈ нашСго kube-scheduler’а Π² случаС, Ссли старый Π»ΠΈΠ΄Π΅Ρ€ ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ становится нСдоступСн.

ΠžΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ прилоТСния ΠΈ сСрвисы ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‡Π΅Ρ€Π΅Π· Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹ΠΉ kube-scheduler, Π° всС cron-Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Ρ‹ Π½Π° Π½ΠΎΠ²Ρ‹ΠΉ. Нагрузка, создаваСмая cron-Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ распрСдСляСтся ΠΏΠΎ всСм Π½ΠΎΠ΄Π°ΠΌ. Учитывая, Ρ‡Ρ‚ΠΎ большая Ρ‡Π°ΡΡ‚ΡŒ cron-Π·Π°Π΄Π°Ρ‡ выполняСтся Π½Π° Ρ‚Π΅Ρ… ΠΆΠ΅ Π½ΠΎΠ΄Π°Ρ…, Ρ‡Ρ‚ΠΎ ΠΈ основныС прилоТСния ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, это ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ риск ΠΏΠ΅Ρ€Π΅Π΅Π·Π΄Π° ΠΏΠΎΠ΄ΠΎΠ² ΠΈΠ·-Π·Π° Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ рСсурсов. ПослС внСдрСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ kube-scheduler’а, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с Π½Π΅Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΌ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ cron-Π·Π°Π΄Π°Ρ‡ большС Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΎ.

Π’Π°ΠΊΠΆΠ΅ Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ Π² нашСм Π±Π»ΠΎΠ³Π΅:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ