Включена возможность динамического изменения CPU для контейнеров в Kubernetes с помощью фичи
InPlacePodVerticalScaling.Раньше подбор CPU был трудоемким: если установить слишком много — ресурс тратится впустую, слишком мало — приложение тормозит. Давайте рассмотрим подходы к динамическому изменению CPU.
Стратегия 1: всегда использовать 80% CPU
Если приложение загружено на 50%, увеличиваем до 80% — оставляем запас в 20 % для безопасности.
Работает отлично при уменьшении, но при увеличении — вопрос: если используем 100 %, стоит ли удвоить CPU или немного прибавить? Ответ неизвестен.
Стратегия 2: всегда использовать 80%, плюс экспоненциальный рост
Как и в стратегии 1 при уменьшении. При увеличении (при нагрузке между 80 и 100 %) используется формула:
new_cpu = average_cpu / 0.8 + (average_cpu / 0.8 * coeff)²
Экспоненциальное увеличение: сильно растем, если нагрузка 100 %, и умеренно — если 90 %. Эту стратегию легко применять: она используется в инструменте Kondense для подбора ресурсов в Kubernetes.
Стратегия 3: целевое использование 100% с учетом CPU-pressure
При уменьшении — устанавливаем на 100%, чтобы не терять ресурсы. При увеличении — смотрим на CPU pressure в микросекундах (время, которое контейнер не мог получить CPU). Чем выше давление, тем сильнее нужно увеличить CPU.
Теоретически это оптимально. Но на практике не всегда работает: порой CPU pressure высок, но увеличение CPU не помогает — зависит от характера приложения. Потребуется доработка формулы под конкретные кейсы.
Итог:
Динамическое изменение CPU — значительный шаг для Kubernetes. В будущем это позволит экономить ресурсы и развязывать руки администраторам. Уже сейчас стоит ознакомиться с инструментом Kondense, если планируете автоматизацию подбора ресурсов.
https://medium.com/@mathieuces/how-to-calculate-cpu-for-containers-in-k8s-dynamically-47a89e3886eb
#devops #девопс
Подпишись 👉@i_DevOps
