У меня есть правило антиаффинности, которое просит kubernetes планировать модули из одного и того же развертывания на разные узлы, мы успешно использовали его в течение длительного времени.
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- topologyKey: kubernetes.io/hostname
labelSelector:
matchExpressions:
- key: application
operator: In
values:
- {{ $appName }}
- key: proc
operator: In
values:
- {{ $procName }}
Я пытаюсь обновить свои правила сходства модулей, чтобы они были сильным предпочтением, а не жестким требованием, чтобы нам не нужно было расширять наш кластер, если для развертывания требуется больше реплик, чем доступно узлов.
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- topologyKey: kubernetes.io/hostname
weight: 100
labelSelector:
matchExpressions:
- key: application
operator: In
values:
- {{ $appName }}
- key: proc
operator: In
values:
- {{ $procName }}
Однако, когда я пытаюсь применить новые правила, я получаю непредвиденную ошибку с topologyKey:
Error: Deployment.apps "core--web" is invalid:
[spec.template.spec.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].podAffinityTerm.topologyKey: Required value: can not be empty,
spec.template.spec.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].podAffinityTerm.topologyKey: Invalid value: "": name part must be non-empty,
spec.template.spec.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].podAffinityTerm.topologyKey: Invalid value: "": name part must consist of alphanumeric characters, '-', '_' or '.', and must start and end with an alphanumeric character (e.g. 'MyName', or 'my.name', or '123-abc', regex used for validation is '([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9]')]
Кажется, что планировщик получает пустое строковое значение для ключа топологии, хотя все мои узлы имеют метку для указанного ключа, которая соответствует регулярному выражению:
$ kubectl describe nodes | grep kubernetes.io/hostname
kubernetes.io/hostname=ip-10-x-x-x.ec2.internal
kubernetes.io/hostname=ip-10-x-x-x.ec2.internal
kubernetes.io/hostname=ip-10-x-x-x.ec2.internal
kubernetes.io/hostname=ip-10-x-x-x.ec2.internal
Я не ожидал увидеть такую проблему от простого изменения с обязательного на предпочтительный. Что я напортачил, чтобы вызвать ошибку topologyKey?
Есть небольшая разница между синтаксисом обязательного и предпочтительного, обратите внимание на ссылку podAffinityTerm
в пути сообщения об ошибке:
spec.template.spec.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution[0].podAffinityTerm.topologyKey
Правильный синтаксис предпочтительного планирования:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
topologyKey: kubernetes.io/hostname
labelSelector:
matchExpressions:
- key: application
operator: In
values:
- {{ $appName }}
- key: proc
operator: In
values:
- {{ $procName }}
Обратите внимание, что weight
— это ключ верхнего уровня, с братом podAffinityTerm
, который содержит topologyKey
и labelSelector
.
@Justin Не похоже, что определенные правила сходства включены в вывод kubectl describe
, но вы можете увидеть их, используя kubectl get <pod/deployment> <name> -o yaml
.
Спасибо. У меня была именно эта проблема, когда я пытался понять синтаксис для
preferredDuringSchedulingIgnoredDuringExecution
. Однако, когда я описываю развертывание и модуль, я не вижу упоминания оAffinity
илиpodAntiAffinity
это ожидается?