Я пытаюсь создать 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" ] } ] } ] } } } ...
То, что у вас есть, мне кажется идеальным, если бы я догадался, почему это не сработало, вероятно, это произошло по одной из двух причин:
Я использую это (просто играюсь с чем-то в качестве эксперимента), что очень похоже на то, что у вас есть, и работает, как и ожидалось, для меня.
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