Kubernetes - pod FailedScheduling из-за «Нет доступных узлов, которые соответствуют всем предикатам: MatchInterPodAffinity (1)». - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь создать развертывание, в котором создаются два модуля, IP-адреса узлов которых совпадают с двумя существующими модулями. Для этого я определяю PodAffinity как показано ниже

affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - {{ .Values.albId }}
        topologyKey: "{{ .Values.topologyKey }}"
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - {{ .Values.name }}
        topologyKey: "{{ .Values.topologyKey }}"

Поскольку пространство имен, в котором я хочу создавать новые модули, отличается от пространства имен, в котором я ссылаюсь на существующие модули, PodAffinity завершается ошибкой. Стручки остаются в состоянии ожидания, и когда я описываю стручок, я получаю ошибку ниже

Events:
  FirstSeen LastSeen    Count   From            SubObjectPath   Type        Reason          Message
  --------- --------    -----   ----            -------------   --------    ------          -------
  28s       13s     6   default-scheduler           Warning           FailedScheduling  No nodes are available that match all of the predicates: MatchInterPodAffinity (1).

Из k8s docs- https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#inter-pod-affinity-and-anti-affinity-alpha-feature обнаружил, что я должен определить пространства имен в PodAffinity и инициализировать его пустым списком, чтобы разрешить перекрестное пространство имен PodAffinity.

Но я не получил ни одного примера из сети на примере инициализации пространств имен в списке пустых файлов.

Пожалуйста, помогите по этому вопросу.

1 Ответ

0 голосов
/ 26 апреля 2018

Из документации вы связались:

В дополнение к labelSelector и topologyKey вы можете дополнительно указать список пространств имен пространств имен, с которыми должен совпадать labelSelector (это соответствует тому же уровню определения, что и labelSelector и topologyKey). Если опущено, по умолчанию используется пространство имен модуля, в котором появляется определение аффинности / анти-аффинности. Если определено, но пусто, это означает «все пространства имен»

Вот пример, основанный на вашем yaml:

affinity:
podAffinity:
  requiredDuringSchedulingIgnoredDuringExecution:
  - labelSelector:
      matchExpressions:
      - key: app
        operator: In
        values:
        - {{ .Values.albId }}
    topologyKey: "{{ .Values.topologyKey }}"
    namespaces: [] # empty array
podAntiAffinity:
  requiredDuringSchedulingIgnoredDuringExecution:
  - labelSelector:
      matchExpressions:
      - key: app
        operator: In
        values:
        - {{ .Values.name }}
    topologyKey: "{{ .Values.topologyKey }}"
    namespaces: []
...