nodeAffinity и nodeAntiAffinity игнорируются

У меня проблема, когда я пытаюсь ограничить развертывание работой над избегайте определенного пула узлов, а nodeAffinity и nodeAntiAffinity, похоже, не работают.

  • Мы используем DOKS (Digital Ocean Managed Kubernetes) v1.19.3
  • У нас есть два пула узлов: инфра и клиенты, причем узлы на обоих помечены как таковые.
  • В этом случае мы хотели бы избежать развертывания на узлах, помеченных как инфраструктура.

По какой-то причине кажется, что независимо от того, какую конфигурацию я использую, Kubernetes, кажется, случайным образом составляет расписание для обоих пулов узлов.

См. Конфигурацию ниже и результаты планирования.

фрагмент deployment.yaml

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  namespace: "test"
  labels:
    app: wordpress
    client: "test"
    product: hosted-wordpress
    version: v1
spec:
  replicas: 1
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
  selector:
    matchLabels:
      app: wordpress
      client: "test"
  template:
    metadata:
      labels:
        app: wordpress
        client: "test"
        product: hosted-wordpress
        version: v1
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                - key: doks.digitalocean.com/node-pool
                  operator: NotIn
                  values:
                  - infra

фрагмент описания узла обратите внимание на метку doks.digitalocean.com/node-pool=infra

kubectl describe node infra-3dmga

Name:               infra-3dmga
Roles:              <none>
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/instance-type=s-2vcpu-4gb
                    beta.kubernetes.io/os=linux
                    doks.digitalocean.com/node-id=67d84a52-8d08-4b19-87fe-1d837ba46eb6
                    doks.digitalocean.com/node-pool=infra
                    doks.digitalocean.com/node-pool-id=2e0f2a1d-fbfa-47e9-9136-c897e51c014a
                    doks.digitalocean.com/version=1.19.3-do.2
                    failure-domain.beta.kubernetes.io/region=tor1
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=infra-3dmga
                    kubernetes.io/os=linux
                    node.kubernetes.io/instance-type=s-2vcpu-4gb
                    region=tor1
                    topology.kubernetes.io/region=tor1
Annotations:        alpha.kubernetes.io/provided-node-ip: 10.137.0.230
                    csi.volume.kubernetes.io/nodeid: {"dobs.csi.digitalocean.com":"222551559"}
                    io.cilium.network.ipv4-cilium-host: 10.244.0.139
                    io.cilium.network.ipv4-health-ip: 10.244.0.209
                    io.cilium.network.ipv4-pod-cidr: 10.244.0.128/25
                    node.alpha.kubernetes.io/ttl: 0
                    volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Sun, 20 Dec 2020 20:17:20 -0800
Taints:             <none>
Unschedulable:      false
Lease:
  HolderIdentity:  infra-3dmga
  AcquireTime:     <unset>
  RenewTime:       Fri, 12 Feb 2021 08:04:09 -0800

иногда приводит к

kubectl get po -n test -o wide

NAME                         READY   STATUS    RESTARTS   AGE   IP             NODE          NOMINATED NODE   READINESS GATES
wordpress-5bfcb6f44b-2j7kv   5/5     Running   0          1h   10.244.0.107   infra-3dmga   <none>           <none>

в других случаях:

kubectl get po -n test -o wide

NAME                         READY   STATUS    RESTARTS   AGE   IP             NODE          NOMINATED NODE   READINESS GATES
wordpress-5bfcb6f44b-b42wj   5/5     Running   0          5m   10.244.0.107   clients-3dmem   <none>           <none>

Я пробовал использовать nodeAntiAffinity для аналогичного эффекта.

И, наконец, я даже попытался создать тестовые метки вместо использования встроенных этикеток из Digital Ocean, и у меня такой же эффект (Affinity, похоже, вообще не работает для меня).

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

Спасибо,


person Joel    schedule 12.02.2021    source источник
comment
Думали ли вы об использовании более простого решения, такого как nodeSelector? У вас уже есть правильные метки для обоих пулов узлов.   -  person Wytrzymały Wiktor    schedule 15.02.2021


Ответы (2)


Отличные новости!

Я наконец-то решил эту проблему.

Проблема, конечно же, заключалась в ошибке пользователя.

Далее в конфигурации была дополнительная строка Spec, которая была очень скрыта.

Первоначально, до перехода на StatefulSets, мы использовали Deployments, и у меня была запись имени хоста в спецификации пода, которая заменяла Spec в верхней части файла.

Спасибо, @ WytrzymałyWiktor и @ Manjul за предложения!

person Joel    schedule 18.02.2021

В файле развертывания вы упомянули operator: NotIn, который работает как анти-сродство.

Пожалуйста, используйте operator: In для достижения привязки узлов. Так, например, если мы хотим, чтобы поды использовали узел с clients метками.

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  namespace: "test"
  labels:
    app: wordpress
    client: "test"
    product: hosted-wordpress
    version: v1
spec:
  replicas: 1
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
  selector:
    matchLabels:
      app: wordpress
      client: "test"
  template:
    metadata:
      labels:
        app: wordpress
        client: "test"
        product: hosted-wordpress
        version: v1
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                - key: "doks.digitalocean.com/node-pool"
                  operator: In
                  values: ["clients"] ##Pls use correct label
person Manjul    schedule 12.02.2021
comment
Здравствуйте, спасибо за предложение, однако анти-сродство - это именно то, чего мы пытаемся достичь, другими словами, не планируйте ни одно из этих развертываний в пуле инфраузлов. Кроме того, я пробовал использовать сходство, как вы описали здесь, просто в качестве теста, и у меня та же проблема - он по-прежнему распределяется по обоим пулам узлов, независимо от того, каким образом мы его настраиваем. И я также пробовал использовать antiAffinity и In, и это дает тот же результат. - person Joel; 12.02.2021