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

Как иметь другую конфигурацию NodeSelector на подах в StatefulSet

У меня есть кластер Openshift, охватывающий несколько центров обработки данных. В каждом центре обработки данных есть зона, настроенная таким образом, что с помощью NodeSelector можно выбрать, в каком центре обработки данных будет размещен модуль. У меня также есть StatefulSet, который настраивает 10 модулей.

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

Возможно ли это без реализации специального контроллера?

Вы ищете сродства / анти-сродства [1], [2]

Вы должны иметь возможность добавить в определение StatefulSet некоторое упоминание о правиле анти-сродства:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: openldap
spec:
  selector:
    matchLabels:
      name: openldap
  replicas: 3
  template:
    metadata:
      labels:
        name: openldap
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: name
                  operator: In
                  values: [ openldap ]
              topologyKey: kubernetes.io/hostname
            weight: 42
...

Вышеупомянутое гарантирует, что планировщик не разместит два модуля с name=openldap ярлык на машины, использующие тот же topologyKey.

Хотя общие образцы будут относиться к kubernetes.io/hostname в качестве ключа топологии вы вполне можете положиться на какую-нибудь специальную метку. Скажем, ваши узлы из DC-A имеют метку dc=a, и DC-B dc=b, тогда вы можете использовать dc как твой topologyKey.

Обратите внимание, что приведенный выше образец выражает предпочтение, а не обязательное правило. Вместо того preferredDuringSchedulingIgnoredDuringExecution (или preferredDuringSchedulingRequiredDuringExecution), вы можете использовать requiredDuringSchedulingIgnoredDuringExecution или requiredDuringSchedulingRequiredDuringExecution - с немного другим синтаксисом вы не сможете устанавливать веса в правилах обязательного размещения, ...

[1] https://docs.openshift.com/container-platform/3.11/admin_guide/scheduling/pod_affinity.html#admin-guide-sched-affinity-config-pod-pref

[2] https://kubernetes.io/docs/concepts/configuration/assign-pod-node/