Развертывание завершается ошибкой из-за правила анти-аффинити с topologyKey: kubernetes.io/hostname — обязательное значение: не может быть пустым

У меня есть правило антиаффинности, которое просит 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?

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
2
0
4 046
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть небольшая разница между синтаксисом обязательного и предпочтительного, обратите внимание на ссылку 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.

Спасибо. У меня была именно эта проблема, когда я пытался понять синтаксис для preferredDuringSchedulingIgnoredDuringExecution. Однако, когда я описываю развертывание и модуль, я не вижу упоминания о Affinity или podAntiAffinity это ожидается?

Justin 15.02.2021 22:35

@Justin Не похоже, что определенные правила сходства включены в вывод kubectl describe, но вы можете увидеть их, используя kubectl get <pod/deployment> <name> -o yaml.

Brad Koch 15.02.2021 22:47

Другие вопросы по теме