Я часто обнаруживаю, что пытаюсь запустить новый модуль, но получаю сообщение об отсутствии доступного узла. Что-то вроде:
0/9 nodes are available: 1 node(s) had no available volume zone, 8 node(s) didn't match node selector.
Я всегда не понимаю, когда получаю эти сообщения. Как мне это отладить?
Вначале я советую взглянуть на Компонент планировщика Kubernetes:
Компонент на главном сервере, который наблюдает за вновь созданными модулями, которым не назначен узел, и выбирает узел, на котором они будут работать. [-] Факторы, принимаемые во внимание при принятии решений о планировании, включают индивидуальные и коллективные требования к ресурсам, аппаратные / программные / политические ограничения, сходство а также спецификации анти-сродства, локальность данных, взаимодействие между рабочими нагрузками и сроки.
Планировщик наблюдает за вновь созданными модулями, которым не назначен узел. Для каждого модуля, который обнаруживает планировщик, планировщик становится ответственным за поиск лучшего узла для этого модуля для запуска. Для каждого вновь созданного модуля или других незапланированных модулей kube-scheduler выбирает оптимальный узел, на котором они будут работать. Однако у каждого контейнера в подах разные требования к ресурсам, и у каждого пода также разные требования. Следовательно, существующие узлы необходимо фильтровать в соответствии с конкретными требованиями планирования.
Согласно документации:
В кластере узлы, отвечающие требованиям планирования для Pod, называются допустимыми узлами. Если ни один из узлов не подходит, модуль остается незапланированным до тех пор, пока планировщик не сможет его разместить.
kube-scheduler выбирает узел для модуля за 2 этапа. Стандартный kube-планировщик на основе Политики по умолчанию:
Изучая эти две политики, вы можете найти дополнительную информацию о том, где были приняты решения. Например:
for scoring at the stage CalculateAntiAffinityPriorityMap This policy helps implement pod anti-affinity.
Ниже вы можете найти быстрый обзор, основанный на влиянии Решения планировщика Kubernetes
Согласно k8s документация:
1. NodeName - простейшая форма ограничения выбора узла, но из-за ее ограничений обычно не используется. Некоторые из ограничений использования nodeName для выбора узлов:
2. В аффинность / антиаффинность функция, значительно расширяет типы ограничений, которые вы можете выразить. Ключевые улучшения: - Язык стал более выразительным (не просто «И для точного соответствия») - вы можете указать, что правило является «мягким» / «предпочтительным», а не жестким требованием, поэтому, если планировщик не может удовлетворить это, модуль все равно будет запланирован - вы можете ограничить метки на других модулях, работающих на узле (или другом топологическом домене), а не против меток на самом узле, что позволяет правила о том, какие модули могут и не могут быть совмещены
Функция близости состоит из двух типов близости: сходство узлов и межстабовое сродство / анти-сродство. Сходство узла похоже на существующий nodeSelector (но с первыми двумя преимуществами, перечисленными выше),
В настоящее время существует два типа аффинности и анти-аффинности стручков, называемых requiredDuringSchedulingIgnoredDuringExecution и предпочтительныйDuringSchedulingIgnoredDuringExecution которые обозначают «жесткие» и «мягкие» требования.
Надеюсь на эту помощь.
Дополнительные ресурсы: