Назад | Перейти на главную страницу

Как nodeAffinity работает в DaemonSets?

Я пытаюсь создать DaemonSet с определенной привязкой, я хочу, чтобы он создавал только модули на узлах с type = prod. Я использую следующий тестовый код:

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: test0
  namespace: kube-system
spec:
  template:
    metadata:
      labels:
        app: test0
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: type
                operator: In
                values:
                - prod
      containers:
      - name: test0
        image: gcr.io/google_containers/pause:2.0

Однако kubectl завершается со следующей ошибкой:

error: error validating "test.yaml": error validating data: found invalid field affinity for v1.PodSpec; if you choose to ignore these errors, turn validation off with --validate=false

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

Я должен отметить, что кластер по-прежнему Kubernetes 1.4.8. Affinity является частью Kubernetes начиная с версии 1.2, поэтому я не думаю, что это будет проблемой?

Сам нашел решение, по-видимому, мне нужно вместо этого использовать аннотацию:

...
spec:
  template:
    metadata:
      labels:
        app: test0
      annotations:
          scheduler.alpha.kubernetes.io/affinity: >
            {
              "nodeAffinity": {
                "requiredDuringSchedulingIgnoredDuringExecution": {
                  "nodeSelectorTerms": [
                    {
                      "matchExpressions": [
                        {
                          "key": "type",
                          "operator": "In",
                          "values": [ "prod" ]
                        }
                      ]
                    }
                  ]
                }
              }
            }
...

То, что у вас есть, мне кажется идеальным, если бы я догадался, почему это не сработало, вероятно, это произошло по одной из двух причин:

  1. nodeAffinity тогда не работала для демонов (другой контроллер) / тогда работали только явные селекторы узлов.
  2. или это была какая-то альфа-функция, которая тогда нуждалась в флагах функций, включенных на сервере api.

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

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: ingress-node
  namespace: ingress
  labels:
    ingress-node: healthz
spec:
  selector:
    matchLabels:
      ingress-node: healthz
  template:
    metadata:
      labels:
        ingress-node: healthz
    spec:
      containers:
      - name: ingress-node-identifier
        image: gcr.io/google-containers/healthz-server:1.0 
      affinity:
        nodeAffinity: 
          requiredDuringSchedulingIgnoredDuringExecution: 
            nodeSelectorTerms: 
            - matchExpressions: 
              - key: tier
                operator: In
                values:
                - ingress-east-us-1a
                - ingress-east-us-1b