CPU-Π»ΠΈΠΌΠΈΡ‚Ρ‹ ΠΈ агрСссивный Ρ‚Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³ Π² Kubernetes

ΠŸΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π².: эта ΠΏΠΎΡƒΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ история Omio β€” СвропСйского Π°Π³Ρ€Π΅Π³Π°Ρ‚ΠΎΡ€Π° ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΈΠΉ β€” ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΎΡ‚ Π±Π°Π·ΠΎΠ²ΠΎΠΉ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ Π΄ΠΎ ΡƒΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… практичСских тонкостСй Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Kubernetes. Знакомство с Ρ‚Π°ΠΊΠΈΠΌΠΈ случаями ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ ΠΊΡ€ΡƒΠ³ΠΎΠ·ΠΎΡ€, Π½ΠΎ ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

CPU-Π»ΠΈΠΌΠΈΡ‚Ρ‹ ΠΈ агрСссивный Ρ‚Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³ Π² Kubernetes

Π”ΠΎΠ²ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π»ΠΈ Π²Π°ΠΌ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Ρ‚ΡŒΡΡ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ «застрСвало» Π½Π° мСстС, пСрСставало ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π½Π° запросы ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ состояния (health check’ΠΈ) ΠΈ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ Ρ‚Π°ΠΊΠΎΠ³ΠΎ повСдСния? Одно ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… объяснСний связано с Π»ΠΈΠΌΠΈΡ‚ΠΎΠΌ ΠΊΠ²ΠΎΡ‚ Π½Π° рСсурсы CPU. О Π½Π΅ΠΌ ΠΈ ΠΏΠΎΠΉΠ΄Π΅Ρ‚ Ρ€Π΅Ρ‡ΡŒ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅.

TL;DR:
ΠœΡ‹ Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ CPU limit’ΠΎΠ² Π² Kubernetes (ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊΠ²ΠΎΡ‚Ρ‹ CFS Π² Kubelet), Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ вСрсия ядра Linux с ошибкой CFS-ΠΊΠ²ΠΎΡ‚. Π’ ядрС имССтся ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹ΠΉ ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ извСстный Π±Π°Π³, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΠΌΡƒ Ρ‚Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³Ρƒ ΠΈ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°ΠΌ
.

Π’ Omio вся инфраструктура управляСтся Kubernetes. ВсС наши stateful- ΠΈ stateless-Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π° Kubernetes (ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Google Kubernetes Engine). Π’ послСдниС ΠΏΠΎΠ»Π³ΠΎΠ΄Π° ΠΌΡ‹ стали Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ Ρ€Π°Π½Π΄ΠΎΠΌΠ½Ρ‹Π΅ подтормаТивания. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π·Π°Π²ΠΈΡΠ°ΡŽΡ‚ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°ΡŽΡ‚ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π½Π° health check’ΠΈ, Ρ‚Π΅Ρ€ΡΡŽΡ‚ связь с ΡΠ΅Ρ‚ΡŒΡŽ ΠΈ Ρ‚.ΠΏ. ПодобноС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»Π³ΠΎ ставило нас Π² Ρ‚ΡƒΠΏΠΈΠΊ, ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π·Π°Π½ΡΡ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Π²ΠΏΠ»ΠΎΡ‚Π½ΡƒΡŽ.

ΠšΡ€Π°Ρ‚ΠΊΠΎΠ΅ содСрТаниС ΡΡ‚Π°Ρ‚ΡŒΠΈ:

  • НСсколько слов ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ… ΠΈ Kubernetes;
  • Как Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ CPU request’Ρ‹ ΠΈ limit’Ρ‹;
  • Как CPU limit Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² срСдах с нСсколькими ядрами;
  • Как ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³ CPU;
  • РСшСниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ Π½ΡŽΠ°Π½ΡΡ‹.

НСсколько слов ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ… ΠΈ Kubernetes

Kubernetes, ΠΏΠΎ сути, являСтся соврСмСнным стандартом Π² ΠΌΠΈΡ€Π΅ инфраструктуры. Π•Π³ΠΎ основная Π·Π°Π΄Π°Ρ‡Π° β€” оркСстровка ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ².

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹

Π’ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ Π½Π°ΠΌ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Ρ‹ Π²Ρ€ΠΎΠ΄Π΅ Java JAR’ΠΎΠ²/WAR’ΠΎΠ², Python Egg’ΠΎΠ² ΠΈΠ»ΠΈ исполняСмых Ρ„Π°ΠΉΠ»ΠΎΠ² для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ запуска Π½Π° сСрвСрах. Однако, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΠΏΡ€ΠΎΠ΄Π΅Π»Ρ‹Π²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ: ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ срСду выполнСния (Java/Python), Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π² Π½ΡƒΠΆΠ½Ρ‹Ρ… мСстах, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ вСрсиСй ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы ΠΈ Ρ‚.Π΄. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΡƒΠ΄Π΅Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΈΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ конфигурациями (Ρ‡Ρ‚ΠΎ часто слуТило ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ Ρ€Π°Π·Π΄ΠΎΡ€ΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ ΠΈ систСмными администраторами).

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ всё ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΎΠΌ выступаСт ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π·. Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ этакого Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ³ΠΎ исполняСмого Ρ„Π°ΠΉΠ»Π°, содСрТащСго Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π½ΠΎ ΠΈ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΡƒΡŽ срСду выполнСния (Java/Python/…), Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹/ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, прСдустановлСнныС ΠΈ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ ΠΊ запуску. ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… сСрвСрах Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… дСйствий.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π² собствСнном ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ-пСсочницС. Π£ Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ свой собствСнный Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ сСтСвой Π°Π΄Π°ΠΏΡ‚Π΅Ρ€, своя файловая систСма с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌ доступом, своя иСрархия процСссов, свои ограничСния Π½Π° CPU ΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ Ρ‚. Π΄. ВсС это Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ благодаря особой подсистСмС ядра Linux β€” namespaces (пространства ΠΈΠΌΠ΅Π½).

Kubernetes

Как Π±Ρ‹Π»ΠΎ сказано Ρ€Π°Π½Π΅Π΅, Kubernetes β€” это оркСстратор ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ². Он Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: Π²Ρ‹ прСдоставляСтС Π΅ΠΌΡƒ ΠΏΡƒΠ» машин, Π° Π·Π°Ρ‚Π΅ΠΌ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅: Β«Π­ΠΉ, Kubernetes, запусти-ΠΊΠ° Π΄Π΅ΡΡΡ‚ΡŒ экзСмпляров ΠΌΠΎΠ΅Π³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° с 2 процСссорами ΠΈ 3 Π“Π± памяти Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ, ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΠΉ ΠΈΡ… Π² Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ состоянии!Β». Kubernetes позаботится ΠΎΠ±ΠΎ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΌ. Он Π½Π°ΠΉΠ΄Π΅Ρ‚ свободныС мощности, запустит ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΈΡ… ΠΏΡ€ΠΈ нСобходимости, Π²Ρ‹ΠΊΠ°Ρ‚ΠΈΡ‚ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ смСнС вСрсий ΠΈ Ρ‚.Π΄. По сути, Kubernetes позволяСт Π°Π±ΡΡ‚Ρ€Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠΉ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ всС Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠ΅ систСм ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹ΠΌ для развСртывания ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

CPU-Π»ΠΈΠΌΠΈΡ‚Ρ‹ ΠΈ агрСссивный Ρ‚Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³ Π² Kubernetes
Kubernetes с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния простого обыватСля

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ request’Ρ‹ ΠΈ limit’Ρ‹ Π² Kubernetes

ОкСй, ΠΌΡ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ с ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ ΠΈ Kubernetes. Π’Π°ΠΊΠΆΠ΅ ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ нСсколько ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ машинС.

МоТно провСсти аналогию с ΠΊΠΎΠΌΠΌΡƒΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠ²Π°Ρ€Ρ‚ΠΈΡ€ΠΎΠΉ. БСрСтся просторноС ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ (ΠΌΠ°ΡˆΠΈΠ½Ρ‹/ΡƒΠ·Π»Ρ‹) ΠΈ сдаСтся нСскольким Π°Ρ€Π΅Π½Π΄Π°Ρ‚ΠΎΡ€Π°ΠΌ (ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌ). Kubernetes выступаСт Π² Ρ€ΠΎΠ»ΠΈ риэлтора. Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос, ΠΊΠ°ΠΊ ΡƒΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠ²Π°Ρ€Ρ‚ΠΈΡ€Π°Π½Ρ‚ΠΎΠ² ΠΎΡ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ? Π§Ρ‚ΠΎ, Ссли ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ…, скаТСм, Ρ€Π΅ΡˆΠΈΡ‚ Π·Π°Π½ΡΡ‚ΡŒ Π²Π°Π½Π½ΡƒΡŽ ΠΊΠΎΠΌΠ½Π°Ρ‚Ρƒ Π½Π° полдня?

ИмСнно здСсь Π² ΠΈΠ³Ρ€Ρƒ Π²ΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ request’Ρ‹ ΠΈ limit’Ρ‹. CPU Request Π½ΡƒΠΆΠ΅Π½ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ для планирования. Π­Ρ‚ΠΎ Π½Π΅Ρ‡Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ «списка ΠΆΠ΅Π»Π°Π½ΠΈΠΉΒ» ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠ½ для ΠΏΠΎΠ΄Π±ΠΎΡ€Π° самого подходящСго ΡƒΠ·Π»Π°. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя CPU Limit ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ с Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΎΠΌ Π°Ρ€Π΅Π½Π΄Ρ‹ β€” ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹ ΠΏΠΎΠ΄Π±Π΅Ρ€Π΅ΠΌ ΡƒΠ·Π΅Π» для ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, Ρ‚ΠΎΡ‚ Π½Π΅ смоТСт Π²Ρ‹ΠΉΡ‚ΠΈ Π·Π° установлСнныС ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹. И Π²ΠΎΡ‚ Ρ‚ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ проблСма…

Как Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ request’Ρ‹ ΠΈ limit’Ρ‹ Π² Kubernetes

Kubernetes ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ встроСнный Π² ядро ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ‚Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³Π° (пропуска Ρ‚Π°ΠΊΡ‚ΠΎΠ²) для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ CPU limit’ΠΎΠ². Если ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ Π»ΠΈΠΌΠΈΡ‚, Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Ρ‚Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³ (Ρ‚.Π΅. ΠΎΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ мСньшС Ρ‚Π°ΠΊΡ‚ΠΎΠ² CPU). Request’Ρ‹ ΠΈ limit’Ρ‹ для памяти ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΈΠ½Π°Ρ‡Π΅, поэтому ΠΈΡ… Π»Π΅Π³Ρ‡Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ. Для этого достаточно ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ послСдний статус пСрСзапуска pod’Π°: Π½Π΅ являСтся Π»ΠΈ ΠΎΠ½ Β«OOMKilledΒ». Π‘ Ρ‚Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³ΠΎΠΌ CPU всС Π½Π΅ Ρ‚Π°ΠΊ просто, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ K8s Π΄Π΅Π»Π°Π΅Ρ‚ доступными Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ ΠΏΠΎ использованию, Π° Π½Π΅ ΠΏΠΎ cgroups.

CPU Request

CPU-Π»ΠΈΠΌΠΈΡ‚Ρ‹ ΠΈ агрСссивный Ρ‚Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³ Π² Kubernetes
Как Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ CPU request

Для простоты Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим процСсс Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ с 4-ядСрным CPU.

K8s ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Π³Ρ€ΡƒΠΏΠΏ (cgroups) для управлСния распрСдСлСниСм рСсурсов (памяти ΠΈ процСссора). Для Π½Π΅Π³ΠΎ доступна иСрархичСская модСль: ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ наслСдуСт limit’Ρ‹ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ распрСдСлСния хранятся Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС (/sys/fs/cgroup). Π’ случаС процСссора это /sys/fs/cgroup/cpu,cpuacct/*.

K8s ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ„Π°ΠΉΠ» cpu.share для распрСдСлСния рСсурсов процСссора. Π’ нашСм случаС корнСвая ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ Π³Ρ€ΡƒΠΏΠΏΠ° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ 4096 Π΄ΠΎΠ»Π΅ΠΉ рСсурсов CPU β€” 100% доступной мощности процСссора (1 ядро = 1024; это фиксированноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅). ΠšΠΎΡ€Π½Π΅Π²Π°Ρ Π³Ρ€ΡƒΠΏΠΏΠ° распрСдСляСт рСсурсы ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ Π² зависимости ΠΎΡ‚ Π΄ΠΎΠ»Π΅ΠΉ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ², прописанных Π² cpu.share, Π° Ρ‚Π΅, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ со своими ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°ΠΌΠΈ, ΠΈ Ρ‚.Π΄. Π’ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎΠΌ ΡƒΠ·Π»Π΅ Kubernetes корнСвая ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ Π³Ρ€ΡƒΠΏΠΏΠ° ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Ρ€ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°: system.slice, user.slice ΠΈ kubepods. Π”Π²Π΅ ΠΏΠ΅Ρ€Π²Ρ‹Ρ… ΠΏΠΎΠ΄Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для распрСдСлСния рСсурсов ΠΌΠ΅ΠΆΠ΄Ρƒ критичСски Π²Π°ΠΆΠ½Ρ‹ΠΌΠΈ систСмными Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ°ΠΌΠΈ ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ Π²Π½Π΅ K8s. ПослСдняя β€” kubepods β€” создаСтся Kubernetes’ΠΎΠΌ для распрСдСлСния рСсурсов ΠΌΠ΅ΠΆΠ΄Ρƒ pod’Π°ΠΌΠΈ.

На схСмС Π²Ρ‹ΡˆΠ΅ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ пСрвая ΠΈ вторая ΠΏΠΎΠ΄Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΏΠΎ 1024 Π΄ΠΎΠ»ΠΈ, ΠΏΡ€ΠΈ этом ΠΏΠΎΠ΄Π³Ρ€ΡƒΠΏΠΏΠ΅ kuberpod Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ 4096 Π΄ΠΎΠ»Π΅ΠΉ. Как Ρ‚Π°ΠΊΠΎΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ: вСдь ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΠ΅ доступны всСго 4096 Π΄ΠΎΠ»Π΅ΠΉ, Π° сумма Π΄ΠΎΠ»Π΅ΠΉ Π΅Π΅ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ это число (6144)? Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ логичСский смысл, поэтому ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ Linux (CFS) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ для ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ распрСдСлСния рСсурсов CPU. Π’ нашСм случаС ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π΅ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ΠΏΠΎ 680 Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄ΠΎΠ»Π΅ΠΉ (16,6% ΠΎΡ‚ 4096), Π° kubepod ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ 2736 Π΄ΠΎΠ»Π΅ΠΉ. Π’ случаС простоя ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π΅ Π³Ρ€ΡƒΠΏΠΏΡ‹ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ рСсурсы.

К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Π² ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ΅ Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… рСсурсов CPU. Он ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Β«ΠΏΡ€ΠΎΡΡ‚Π°ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅Β» мощности Π² Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡƒΠ», ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ΠΈ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎ Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌ, Π½ΡƒΠΆΠ΄Π°ΡŽΡ‰ΠΈΠΌΡΡ Π² Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… мощностях процСссора (ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° происходит партиями, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΡ‚Π΅Ρ€ΡŒ ΠΎΡ‚ округлСния). Аналогичный ΠΌΠ΅Ρ‚ΠΎΠ΄ примСняСтся ΠΈ ΠΊΠΎ всСм ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°ΠΌ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ².

Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ обСспСчиваСт справСдливоС распрСдСлСниС мощностСй процСссора ΠΈ слСдит Π·Π° Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ процСсс Π½Π΅ Β«Π²ΠΎΡ€ΠΎΠ²Π°Π»Β» рСсурсы Ρƒ Π΄Ρ€ΡƒΠ³ΠΈΡ….

CPU Limit

НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ limit’ΠΎΠ² ΠΈ request’ΠΎΠ² Π² K8s выглядят ΠΏΠΎΡ…ΠΎΠΆΠ΅, ΠΈΡ… рСализация ΠΊΠ°Ρ€Π΄ΠΈΠ½Π°Π»ΡŒΠ½ΠΎ отличаСтся: это самая вводящая Π² Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΈ Π½Π°ΠΈΠΌΠ΅Π½Π΅Π΅ задокумСнтированная Ρ‡Π°ΡΡ‚ΡŒ.

K8s задСйствуСт ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΊΠ²ΠΎΡ‚ CFS для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π»ΠΈΠΌΠΈΡ‚ΠΎΠ². Π˜Ρ… настройки Π·Π°Π΄Π°ΡŽΡ‚ΡΡ Π² Ρ„Π°ΠΉΠ»Π°Ρ… cfs_period_us ΠΈ cfs_quota_us Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ cgroup (Ρ‚Π°ΠΌ ΠΆΠ΅ располоТСн Ρ„Π°ΠΉΠ» cpu.share).

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ cpu.share, ΠΊΠ²ΠΎΡ‚Π° основана Π½Π° ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π° Π½Π΅ Π½Π° доступной мощности процСссора. cfs_period_us Π·Π°Π΄Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° (эпохи) β€” это всСгда 100000 мкс (100 мс). Π’ K8s Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½Π° ΠΏΠΎΠΊΠ° доступна Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π°Π»ΡŒΡ„Π°-вСрсии. ΠŸΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ эпоху для пСрСзапуска ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠ²ΠΎΡ‚. Π’Ρ‚ΠΎΡ€ΠΎΠΉ Ρ„Π°ΠΉΠ», cfs_quota_us, Π·Π°Π΄Π°Π΅Ρ‚ доступноС врСмя (ΠΊΠ²ΠΎΡ‚Ρƒ) Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ эпохС. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Ρ‚Π°ΠΊΠΆΠ΅ указываСтся Π² микросСкундах. ΠšΠ²ΠΎΡ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ эпохи; Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ большС 100 мс.

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π΄Π²Π° сцСнария Π½Π° 16-ядСрных ΠΌΠ°ΡˆΠΈΠ½Π°Ρ… (Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнный Ρ‚ΠΈΠΏ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ² Ρƒ нас Π² Omio):

CPU-Π»ΠΈΠΌΠΈΡ‚Ρ‹ ΠΈ агрСссивный Ρ‚Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³ Π² Kubernetes
Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ 1: 2 ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ Π»ΠΈΠΌΠΈΡ‚ Π² 200 мс. Π‘Π΅Π· Ρ‚Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³Π°

CPU-Π»ΠΈΠΌΠΈΡ‚Ρ‹ ΠΈ агрСссивный Ρ‚Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³ Π² Kubernetes
Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ 2: 10 ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ Π»ΠΈΠΌΠΈΡ‚ Π² 200 мс. Π’Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³ начинаСтся послС 20 мс, доступ ΠΊ рСсурсам процСссора возобновляСтся Π΅Ρ‰Π΅ Ρ‡Π΅Ρ€Π΅Π· 80 мс

Допустим, Π²Ρ‹ установили CPU limit Π½Π° 2 ядра; Kubernetes ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Ρ‚ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² 200 мс. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ максимум 200 мс процСссорного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π±Π΅Π· Ρ‚Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³Π°.

И здСсь начинаСтся самоС интСрСсноС. Как Π±Ρ‹Π»ΠΎ сказано Π²Ρ‹ΡˆΠ΅, доступная ΠΊΠ²ΠΎΡ‚Π° составляСт 200 мс. Если Ρƒ вас ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π΄Π΅ΡΡΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π° 12-ядСрной машинС (см. ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ ΠΊ ΡΡ†Π΅Π½Π°Ρ€ΠΈΡŽ 2), ΠΏΠΎΠΊΠ° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ pod’Ρ‹ ΠΏΡ€ΠΎΡΡ‚Π°ΠΈΠ²Π°ΡŽΡ‚, ΠΊΠ²ΠΎΡ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ исчСрпана всСго Ρ‡Π΅Ρ€Π΅Π· 20 мс (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ 10 * 20 мс = 200 мс), ΠΈ всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π΄Π°Π½Π½ΠΎΠ³ΠΎ pod’Π° «зависнут» (throttle) Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ 80 мс. УсугубляСт ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ ΡƒΠΆΠ΅ упомянутый Π±Π°Π³ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ°, ΠΈΠ·-Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ случаСтся ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ Ρ‚Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³ ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΄Π°ΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‰ΡƒΡŽΡΡ ΠΊΠ²ΠΎΡ‚Ρƒ.

Как ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ Ρ‚Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³ Π² pod’Π°Ρ…?

ΠŸΡ€ΠΎΡΡ‚ΠΎ Π²ΠΎΠΉΠ΄ΠΈΡ‚Π΅ Π² pod ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ cat /sys/fs/cgroup/cpu/cpu.stat.

  • nr_periods β€” ΠΎΠ±Ρ‰Π΅Π΅ число ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΎΠ² ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ°;
  • nr_throttled β€” число throttled-ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΎΠ² Π² составС nr_periods;
  • throttled_time β€” совокупноС throttled-врСмя Π² наносСкундах.

CPU-Π»ΠΈΠΌΠΈΡ‚Ρ‹ ΠΈ агрСссивный Ρ‚Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³ Π² Kubernetes

Π§Ρ‚ΠΎ ΠΆΠ΅ Π½Π° самом Π΄Π΅Π»Π΅ происходит?

Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ высокий Ρ‚Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³ Π²ΠΎ всСх прилоТСниях. Иногда ΠΎΠ½ Π² ΠΏΠΎΠ»Ρ‚ΠΎΡ€Π° Ρ€Π°Π·Π° сильнСС расчСтного!

Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ ошибкам β€” сбоям ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ готовности (readiness), зависаниям ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ², Ρ€Π°Π·Ρ€Ρ‹Π²Π°ΠΌ сСтСвых ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Π°ΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ сСрвисных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². Π’ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счСтС это выраТаСтся Π² ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ΅ ΠΈ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΠΈ количСства ошибок.

РСшСниС ΠΈ послСдствия

Π’ΡƒΡ‚ всС просто. ΠœΡ‹ ΠΎΡ‚ΠΊΠ°Π·Π°Π»ΠΈΡΡŒ ΠΎΡ‚ limit’ΠΎΠ² CPU ΠΈ занялись ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ ядра ОБ Π² кластСрах Π½Π° ΡΠ°ΠΌΡƒΡŽ ΡΠ²Π΅ΠΆΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±Π°Π³ Π±Ρ‹Π» исправлСн. Число ошибок (HTTP 5xx) Π² Π½Π°ΡˆΠΈΡ… сСрвисах сразу ΠΆΠ΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΠ°Π»ΠΎ:

Ошибки HTTP 5xx

CPU-Π»ΠΈΠΌΠΈΡ‚Ρ‹ ΠΈ агрСссивный Ρ‚Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³ Π² Kubernetes
Ошибки HTTP 5xx ΠΎΠ΄Π½ΠΎΠ³ΠΎ критичСски Π²Π°ΠΆΠ½ΠΎΠ³ΠΎ сСрвиса

ВрСмя ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° p95

CPU-Π»ΠΈΠΌΠΈΡ‚Ρ‹ ΠΈ агрСссивный Ρ‚Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³ Π² Kubernetes
Π—Π°Π΄Π΅Ρ€ΠΆΠΊΠ° запросов критичСски Π²Π°ΠΆΠ½ΠΎΠ³ΠΎ сСрвиса, 95-я ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ΠΈΠ»ΡŒ

Расходы Π½Π° ΡΠΊΡΠΏΠ»ΡƒΠ°Ρ‚Π°Ρ†ΠΈΡŽ

CPU-Π»ΠΈΠΌΠΈΡ‚Ρ‹ ΠΈ агрСссивный Ρ‚Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³ Π² Kubernetes
Число ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… экзСмпляро-часов

Π’ Ρ‡Π΅ΠΌ ΠΏΠΎΠ΄Π²ΠΎΡ…?

Как Π±Ρ‹Π»ΠΎ сказано Π² Π½Π°Ρ‡Π°Π»Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ:

МоТно провСсти аналогию с ΠΊΠΎΠΌΠΌΡƒΠ½Π°Π»ΡŒΠ½ΠΎΠΉ квартирой… Kubernetes выступаСт Π² Ρ€ΠΎΠ»ΠΈ риэлтора. Но ΠΊΠ°ΠΊ ΡƒΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠ²Π°Ρ€Ρ‚ΠΈΡ€Π°Π½Ρ‚ΠΎΠ² ΠΎΡ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ? Π§Ρ‚ΠΎ, Ссли ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ…, скаТСм, Ρ€Π΅ΡˆΠΈΡ‚ Π·Π°Π½ΡΡ‚ΡŒ Π²Π°Π½Π½ΡƒΡŽ ΠΊΠΎΠΌΠ½Π°Ρ‚Ρƒ Π½Π° полдня?

Π’ΠΎΡ‚ Π² Ρ‡Π΅ΠΌ ΠΏΠΎΠ΄Π²ΠΎΡ…. Один Π½Π΅Ρ€Π°Π΄ΠΈΠ²Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ³Π»ΠΎΡ‚ΠΈΡ‚ΡŒ всС доступныС рСсурсы процСссора Π½Π° машинС. Если Ρƒ вас Ρ‚ΠΎΠ»ΠΊΠΎΠ²Ρ‹ΠΉ стСк ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ настроСны JVM, Go, Node VM), Ρ‚ΠΎΠ³Π΄Π° это Π½Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Ρ‚Π°ΠΊΠΈΡ… условиях Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Но Ссли прилоТСния ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΏΠ»ΠΎΡ…ΠΎ ΠΈΠ»ΠΈ совсСм Π½Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ (FROM java:latest), ситуация ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ·-ΠΏΠΎΠ΄ контроля. Π£ нас Π² Omio ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ Dockerfiles с Π°Π΄Π΅ΠΊΠ²Π°Ρ‚Π½Ρ‹ΠΌΠΈ настройками ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для стСка основных языков, поэтому ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π½Π΅ сущСствовало.

ΠœΡ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ Π·Π° ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°ΠΌΠΈ USE (использованиС, насыщСниС ΠΈ ошибки), Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°ΠΌΠΈ API ΠΈ частотой появлСния ошибок. Π‘Π»Π΅Π΄ΠΈΡ‚Π΅ Π·Π° Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ соотвСтствовали оТиданиям.

Бсылки

Π’Π°ΠΊΠΎΠ²Π° наша история. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ сильно ΠΏΠΎΠΌΠΎΠ³Π»ΠΈ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ происходит:

ΠžΡ‚Ρ‡Π΅Ρ‚Ρ‹ ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Kubernetes:

Π‘Ρ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡŒ Π»ΠΈ Π²Ρ‹ с ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ Π² своСй ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΈΠ»ΠΈ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚Π΅ ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ, связанным с Ρ‚Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³ΠΎΠΌ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… production-срСдах? ΠŸΠΎΠ΄Π΅Π»ΠΈΡ‚Π΅ΡΡŒ своСй историСй Π² коммСнтариях!

P.S. ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°

Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π² нашСм Π±Π»ΠΎΠ³Π΅:

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