Распространение модулей по кластеру
Текущее использование политики автоматического масштабирования AWS для запуска рабочих узлов EKS (минимум + желаемое 10, максимум 15) в фиксированное время каждый день. Есть 120 подов и 30 развертываний.
Очевидно, сначала будет запущен только один узел. Потом второй узел. После этого будет запущен последний узел. По этой причине Kubernetes добавляет все модули в первые узлы. Есть ли способ, чтобы поды были равномерно распределены в сценарии?
Ответы
Взгляните на Descheduler . Этот проект работает как задание Kubernetes, которое направлено на уничтожение подов, когда он считает, что кластер неуравновешен.
LowNodeUtilizationСтратегия кажется, подходит вашему случаю:
Эта стратегия находит узлы, которые недостаточно используются, и выселяет модули, если это возможно, из других узлов в надежде, что воссоздание удаленных модулей будет запланировано на этих недостаточно загруженных узлах.
Другой вариант - применить немного хаотической инженерии вручную, принудительно выполнив непрерывное обновление в вашем развертывании, и, надеюсь, планировщик исправит проблему баланса при воссоздании подов.
Вы можете использовать расширение kubectl rollout restart my-deployment
. Это намного лучше, чем просто удалить модули с помощью kubectl delete pod
, поскольку развертывание обеспечит доступность во время «ребалансировки» (хотя полное удаление модулей увеличивает ваши шансы на лучшую перебалансировку).
Вы должны изучить сродство и анти-сродство, поскольку это позволяет вам контролировать, какие поды переходят на какой узел. Вы можете сделать так, чтобы с анти-сродством на узле был только 1 модуль каждого развертывания. Это немного излишне и не сработает для вас, хотя IIRC вы можете иметь несколько модулей на узле только с ограничением.
https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity/