Kubernetes собирается планировать модули Daemonset на узлах в автоматическом масштабировании пула узлов GKE
Мы видим проблему с тем, что планировщик GKE kubernetes не может или не желает планировать модули Daemonset на узлах в пуле узлов с автоматическим масштабированием.
У нас есть три пула узлов в кластере, однако pool-x
пул используется исключительно для планирования отдельного развертывания, поддерживаемого HPA, с узлами, для которых в этом пуле применяется пометка "node-use=pool-x:NoSchedule". Мы также развернули набор файлов Beat Daemonset, для которого мы установили очень мягкие спецификации допусков operator: Exists
(надеюсь, это правильно), чтобы гарантировать, что Daemonset запланирован на каждом узле в кластере.
Мы предполагаем, что, как pool-x
автоматически масштабируется, Daemonset filebeat будет запланирован на узле до планирования любого из модулей, назначенных на этом узле. Тем не менее, мы замечаем, что, поскольку новые узлы добавляются в пул, модульные элементы не могут быть размещены на узле и находятся в постоянном состоянии "Ожидание". Вот пример описанного вывода (усеченного) одного файла Beat Daemonset:
Number of Nodes Scheduled with Up-to-date Pods: 108
Number of Nodes Scheduled with Available Pods: 103
Number of Nodes Misscheduled: 0
Pods Status: 103 Running / 5 Waiting / 0 Succeeded / 0 Failed
И события для одного из "ожидающих" файловых модулей:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 18m (x96 over 68m) default-scheduler 0/106 nodes are available: 105 node(s) didn't match node selector, 5 Insufficient cpu.
Normal NotTriggerScaleUp 3m56s (x594 over 119m) cluster-autoscaler pod didn't trigger scale-up (it wouldn't fit if a new node is added): 6 node(s) didn't match node selector
Warning FailedScheduling 3m14s (x23 over 15m) default-scheduler 0/108 nodes are available: 107 node(s) didn't match node selector, 5 Insufficient cpu.
Как вы можете видеть, узлу не хватает ресурсов для составления расписания запросов ЦП модулей пакетов из-за того, что другие модули работают на узле. Тем не менее, почему модуль Daemonset не размещается на узле до планирования каких-либо других модулей. Похоже, само определение Daemonset требует планирования приоритетов.
Также следует отметить, что если я удаляю модуль на узле, где filebeat является "ожидающим" планированием из-за неспособности удовлетворить запросы CPU, filebeat сразу же запланируется на этом узле, указывая, что наблюдается некоторый приоритет планирования.
В конечном счете, мы просто хотим убедиться, что Daemonset может планировать pod на каждом узле кластера, и этот приоритет прекрасно работает с нашим автоматическим масштабированием кластера и HPA. Любые идеи о том, как мы можем достичь этого?
Мы хотели бы избежать использования Pod Priority, поскольку это очевидно альфа-функция в GKE, и мы не можем использовать его в настоящее время.
2 ответа
Ожидаемое поведение модулей DaemonSet, планируемых первыми на узле, больше не является реальностью (с 1.12). Начиная с 1.12, модули DaemonSet обрабатываются планировщиком по умолчанию и полагаются на приоритет модуля для определения порядка, в котором запланированы модули. Вы можете рассмотреть возможность создания priorityCLass, специфичного для DaemonSets с относительно высокимvalue
чтобы убедиться, что они запланированы раньше, чем большинство других ваших модулей.
До того, как набор демонов kubernetes 1.12 был запланирован его собственным контроллером, после этой версии развертывание daemonset осуществлялось планировщиком по умолчанию в надежде, что приоритет, приоритет и допуск охватывают все случаи. Если вы хотите, чтобы расписание наборов демонов управлялось планировщиком daemonset, проверьте функцию ScheduleDaemonSetPods.
https://kubernetes.io/docs/reference/command-line-tools-reference/feature-gates/