Назад | Перейти на главную страницу

Пул узлов Kubernetes не будет автоматически масштабироваться до 0 узлов

У меня довольно дорогая рабочая нагрузка, которую иногда приходится выполнять некоторым коллегам в будний день (не по какому-либо установленному графику). Я использую Google Cloud Kubernetes.

Он состоит из трех наборов состояний, каждый с одной репликой.

Я проинструктировал их, как «включить» и «выключить». Чтобы включить его, они масштабируют каждый набор состояний до 1 реплики. Чтобы отключить его, они масштабируют каждый набор состояний до 0 реплик.

Первоначально у меня был один пул узлов автомасштабирования с размером по умолчанию в три узла (каждый набор состояний потребляет почти весь объем ЦП и ОЗУ). Я заметил, что даже после масштабирования до 0 по крайней мере один (а иногда и два) узла останется через час или два. Я ожидал, что в конце концов все узлы умрут, но этого не произошло.

Я заметил, что у запущенных узлов все еще есть несколько модулей, только в другом пространстве имен. Остальные капсулы находятся в kube-system пространство имен, за исключением одного в custom-metrics пространство имен.

Тогда я подумал, хорошо - может быть, Kubernetes хочет запустить другие сервисы, даже если нет пользовательских рабочих нагрузок / модулей. Итак, я создал еще один пул узлов с одним очень маленьким, но адекватным узлом. Этот узел достаточно велик, чтобы запускать все, что сообщает Kubernetes, в этих не-default пространства имен.

После того, как новый пул узлов работал с одним узлом, я приступил к ручному изменению размера исходного пула узлов до 0. Это было нормально. Я надеялся на этом этапе, что у меня есть "системный" пул узлов для запуска kube-system и прочее, а также пул «пользовательских» узлов для запуска моих собственных вещей.

Поэтому для следующего теста я увеличил масштаб только одной реплики с набором состояний. В конце концов, узел подключился, и модуль с набором состояний был запущен / готов. Затем я снова уменьшил его до 0 и ждал ... и ждал ... и узел не исчезал.

Что нужно для того, чтобы пул узлов автомасштабирования фактически достиг 0 узлов? Ясно, что мне чего-то не хватает (или чего-то большего), но мне было трудно найти информацию о том, что необходимо, чтобы средство масштабирования узлов уменьшило размер пула узлов до 0.

Любой совет приветствуется.

Дополнительная информация

Когда я смотрю, что работает на узле в пуле узлов, я хочу перейти на 0, вот что я вижу

  Namespace                  Name                                                   CPU Requests  CPU Limits  Memory Requests  Memory Limits  AGE
  ---------                  ----                                                   ------------  ----------  ---------------  -------------  ---
  kube-system                fluentd-gcp-v3.1.1-mfkxf                               100m (0%)     1 (3%)      200Mi (0%)       500Mi (0%)     28m
  kube-system                kube-proxy-gke-tileperformance-pool-1-14d3671d-jl76    100m (0%)     0 (0%)      0 (0%)           0 (0%)         28m
  kube-system                prometheus-to-sd-htvnw                                 1m (0%)       3m (0%)     20Mi (0%)        20Mi (0%)      28m

Если я попытаюсь drain узел жалуется, что они управляются через DaemonSet, поэтому я мог бы заставить его, но, очевидно, я пытаюсь никоим образом не вмешиваться вручную.

Взломать

Чтобы автомасштабирование "работало" и уменьшилось до 0, я временно добавил nodeSelector ко всем kube-system развертывания, поэтому они назначаются в отдельный пул для kube-system прочее. Но ведь должен быть способ получше?

Автомасштабирование не уменьшит ваш пул узлов до 0.

Примечание: Если вы укажете минимум ноль узлов, пул простаивающих узлов можно полностью уменьшить. Однако для запуска системных модулей в кластере всегда должен быть доступен хотя бы один узел.

- Google Cloud: автоматическое масштабирование кластера движка Kubernetes

Однако автомасштабирование кластера не может полностью уменьшить до нуля весь кластер. Для запуска системных модулей в кластере всегда должен быть доступен хотя бы один узел. Итак, вам нужно сохранить хотя бы один узел. Но это не значит, что вам нужно оставить его дорого узел работает в режиме ожидания.

- Medium.com: масштабируйте кластер kubernetes почти до нуля с помощью gke autoscaler

Вы можете явно уменьшить свой пул узлов до ноль (0) с командой:

$ gcloud container clusters resize CLUSTER_NAME --node-pool NAME_OF_THE_POOL --num-nodes 0

Но знайте, что у такого подхода будет недостаток.

Представьте себе ситуацию, когда:

  • Вы уменьшаете кластер до нуль узлы с командой выше
  • Вы создаете рабочую нагрузку в кластере, у которого есть нуль узлы

Autoscaler не сможет увеличить количество узлов из нуль. У него не будет возможности определить, требуются ли дополнительные ресурсы. Поды, которые работали в kube-system на этих узлах было важно определить, требуется ли еще один узел.

Есть статья с вариантом использования, похожим на ваш. Взгляни, пожалуйста: Medium.com: масштабируйте кластер kubernetes почти до нуля с помощью gke autoscaler

Другой способ сделать это - сметить расходы на отключение контейнеров. Ознакомьтесь с ресурсами ниже:


Возможные причины, которые могут помешать автоматическому масштабированию кластера удалить узел:

  • Пакеты с ограниченным бюджетом PodDisruptionBudget.
  • Модули Kube-system, которые:
  • Модули, которые не поддерживаются объектом контроллера (поэтому они не создаются путем развертывания, набора реплик, задания, набора с отслеживанием состояния и т. Д.).
  • Поды с локальным хранилищем.
  • Поды, которые нельзя переместить в другое место из-за различных ограничений (нехватка ресурсов, несовпадающие селекторы узлов или сродство, соответствие анти-сродства и т. Д.)
  • Поды, для которых заданы следующие аннотации: "cluster-autoscaler.kubernetes.io/safe-to-evict": "false"

Если модуль не имеет следующей аннотации (поддерживается в CA 1.0.3 или новее):

"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"

- Github.com: автоматическое масштабирование Kubernetes: какие типы модулей могут помешать CA удалить узел

CA не удаляет недостаточно используемые узлы, если на них работают поды, которые не следует выселять

Другие возможные причины отказа от уменьшения:

  • группа узлов уже имеет минимальный размер,
  • произошла неудачная попытка удалить этот конкретный узел, и в этом случае Cluster Autoscaler будет ждать дополнительных 5 минут, прежде чем снова рассматривать его для удаления,

- Github.com: у меня есть пара узлов с низким коэффициентом использования, но они не уменьшены, почему