У меня есть кластер 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
- с немного другим синтаксисом вы не сможете устанавливать веса в правилах обязательного размещения, ...
[2] https://kubernetes.io/docs/concepts/configuration/assign-pod-node/