GKE не будет уменьшаться до одного узла

#kubernetes #google-kubernetes-engine

#kubernetes #google-kubernetes-engine

Вопрос:

Я видел другие подобные вопросы, но, насколько я могу судить, ни один из них не касается нашего конкретного случая.

У нас есть кластер, в котором мы запускаем среды разработки. В идеале, когда мы не работаем, этот кластер должен уменьшаться до одного узла. На данный момент никто не работает, и я вижу, что есть один узел, где CPU / Mem / Disk практически равны 0 процентам, и на нем есть только системные модули. На другом узле есть кое-что.

Кластер настроен на автоматическое масштабирование до 1. Почему он этого не сделает?

Он автоматически масштабируется до нужного нам количества, когда мы запускаем новые среды, и до 2 без проблем. Но до 1? Нет кубиков. Когда я вручную удаляю узел только с системными модулями и в основном с использованием 0, кластер запускает новый. Я не могу понять, почему.

Обновление / уточнение:

Я немного повозился с конфигурацией, поэтому не уверен точно, какие системные модули были запущены, но я почти уверен, что все они управлялись набором демонов. Таким образом, даже после ручного уничтожения узла, перепланирования всего несистемного, новый узел все равно появится без каких-либо рабочих нагрузок, специально вызывающих масштабирование до 2.

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

Ответ №1:

Похоже, вы, возможно, не проверили ограничение секции уменьшения масштаба GKE. Никаких проблем, пожалуйста, проверьте и прочитайте один раз, возможно, вам потребуется один раз изменить PDB (Pod distribution budget).

Иногда автоскалер кластера не может полностью уменьшить масштаб, и после уменьшения масштаба появляется дополнительный узел. Это может произойти, когда требуемые системные модули запланированы на разных узлах, поскольку нет триггера для перемещения любого из этих модулей на другой узел. Видите ли, у меня есть пара узлов с низким уровнем использования, но они не уменьшены. Почему?. Чтобы обойти это ограничение, вы можете настроить бюджет сбоев Pod.

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

 kubectl create poddisruptionbudget <pdb name> --namespace=kube-system --selector app=<app name> --max-unavailable 1
 

Вы можете прочитать больше по адресу: https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#how-to-set-pdbs-to-enable-ca-to-move-kube-system-pods

Не забудьте проверить ограничение масштабирования GKE: https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-autoscaler#limitations

Комментарии:

1. Я думаю, что видел это (документ, специфичный для GKE), и я не уверен, что понимаю это в этом контексте. Я думаю, что единственными запущенными системными модулями были управляемые DaemonSet. Что сбивает с толку, так это то, что я уничтожил второй узел, и все, что не контролировалось набором демонов, было перепланировано. Но новый узел все равно появился. Может быть, я неправильно понял или неправильно прочитал документ, который вы отправили? Я мог бы понять, если бы я не уничтожил узел, и на нем были запущены какие-то вещи. Кроме того, если это уместно, я использую профиль автоматического масштабирования с оптимизацией использования. (Я говорю «были», потому что я только что перенастроил вещи)

2. вы проверили конфигурацию PDB? это может быть возможно из-за того, что модуль снова масштабируется, а ваш новый узел присоединяется к кластеру.

3. Я считаю, что PDB для системных модулей решат проблему с настройкой, которая у вас есть / была, но в качестве альтернативы вы можете захотеть использовать автоматическое выделение узлов, а не пул узлов с автоматическим масштабированием кластера. Вы также можете попробовать использовать Autopilot, так как в этом случае вы будете платить только за ресурсы, потребляемые запущенными модулями, а не за вычислительные ресурсы самих узлов.