Распределение стручков Kubernetes среди узлов с предпочтительным режимом - PullRequest
1 голос
/ 05 ноября 2019

Я работаю над переносом своих приложений в Kubernetes. Я использую EKS.

Я хочу распределить свои модули по разным узлам, чтобы избежать единой точки отказа. Я читал о pod-affinity и anti-affinity и required и preferred режиме.

Этот ответ дает очень хороший способ для достижения этой цели.

Но я сомневаюсь, скажем, если у меня есть 3 узла, из которых 2 уже заполнены (с точки зрения ресурсов). Если я использую requiredDuringSchedulingIgnoredDuringExecution, k8s раскручивает новые узлы и распределяет модули для каждого узла. И если я использую preferredDuringSchedulingIgnoredDuringExecution, он проверит предпочтительные узлы и, не найдя другие узлы, развернет все модули только на третьем узле. В этом случае он снова станет единой точкой отказа.

Как мне решить это условие?

Один из способов, который я могу придумать, - это иметь кластер с избыточным выделением ресурсов, чтобывсегда есть некоторые дополнительные узлы.

Второй способ, я не уверен, как это сделать, но я думаю, что должен быть способ использования как requiredDuringSchedulingIgnoredDuringExecution, так и preferredDuringSchedulingIgnoredDuringExecution.

Кто-нибудь может мне с этим помочь? Я что-то пропустил? Как люди работают с этим условием?

Я новичок в Kubernetes, поэтому не стесняйтесь исправлять меня, если я ошибаюсь или что-то упускаю.

Заранее спасибо

Примечание:

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

1 Ответ

2 голосов
/ 08 ноября 2019

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

Невозможно создать жесткие требования, как это для планировщика kubernetes.

Планировщикприложит все усилия, чтобы запланировать ваше приложение как можно более равномерно, но в ситуации, когда у вас есть 2 узла без резервных ресурсов и 1 узел, на который будут запланированы все реплики pod, k8s может выполнить одно из следующих действий (в зависимости от конфигурации):

  1. планирование ваших модулей на одном узле (лучшее усилие / по умолчанию)
  2. запуск одного модуля и вообще не планирование остальных модулей (antiaffnity + requiredDuringSchedulingIgnoredDuringExecution)
  3. создавать новые узлы для модулей при необходимости (antiaffnity + requiredDuringSchedulingIgnoredDuringExecution + cluster autoscaler)
  4. начать удаление модулей из узлов, чтобы освободить ресурсы для модулей высокого приоритета (priority based preemption) и перепланируйте переопределенные модули, если это возможно

Также прочитайте эту статью , чтобы лучше понять, как планировщик принимает свои решения.

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

Бюджет прерывания не гарантирует, что указанное количество / процент пакетов будет всегдаup.

kubernetes примет это во внимание при принятии решений о планировании.

...