web-dev-qa-db-fra.com

Comment forcer les pods/déploiements sur les nœuds maîtres?

J'ai configuré un cluster Kubernetes 1.5 avec les trois nœuds maîtres contaminés dédié = maître: NoSchedule . Maintenant, je souhaite déployer le contrôleur Nginx Ingress Controller sur les nœuds principaux uniquement. J'ai donc ajouté des tolérances:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-ingress-controller
  namespace: kube-system
  labels:
    kubernetes.io/cluster-service: "true"
spec:
  replicas: 3
  template:
    metadata:
      labels:
        k8s-app: nginx-ingress-lb
        name: nginx-ingress-lb
      annotations:
        scheduler.alpha.kubernetes.io/tolerations: |
          [
            {
              "key": "dedicated",
              "operator": "Equal",
              "value": "master",
              "effect": "NoSchedule"
            }
          ]
    spec:
    […]

Malheureusement, cela n'a pas l'effet souhaité: Kubernetes programme tous les pods sur les travailleurs. Lorsque vous réduisez le nombre de répliques à un nombre plus important, les pods sont également déployés sur les travailleurs. 

Comment puis-je obtenir une planification sur les nœuds maîtres uniquement?

Merci de votre aide.

8
Stephan

Une tolérance signifie non que le pod doit être planifié sur un nœud présentant de telles altérations. Cela signifie que le pod tolère une telle souillure. Si vous voulez que votre pod soit "attiré" par des nœuds spécifiques, vous devez associer un label à vos nœuds dédiés = maître et altéré, puis définir nodeSelector dans le pod pour rechercher ce libellé.

Attachez l'étiquette à chacun de vos nœuds d'utilisation spéciale:

kubectl label nodes name_of_your_node dedicated=master

Kubernetes 1.6 et la syntaxe ci-dessus

Ajoutez le nodeSelector à votre pod:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: nginx-ingress-controller
  namespace: kube-system
  labels:
    kubernetes.io/cluster-service: "true"
spec:
  replicas: 3
  template:
    metadata:
      labels:
        k8s-app: nginx-ingress-lb
        name: nginx-ingress-lb
      annotations:
    spec:
      nodeSelector:
        dedicated: master
      tolerations:
      - key: dedicated
        operator: Equal
        value: master
        effect: NoSchedule
    […]

Si vous n'aimez pas nodeSelector, vous pouvez ajouter affinity: sous spec: à la place:

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
        matchExpressions:
        - key: dedicated
          operator: Equal
          values: ["master"]

Syntaxe pré 1.6

Ajoutez le nodeSelector à votre pod:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-ingress-controller
  namespace: kube-system
  labels:
    kubernetes.io/cluster-service: "true"
spec:
  replicas: 3
  template:
    metadata:
      labels:
        k8s-app: nginx-ingress-lb
        name: nginx-ingress-lb
      annotations:
        scheduler.alpha.kubernetes.io/tolerations: |
          [
            {
              "key": "dedicated",
              "operator": "Equal",
              "value": "master",
              "effect": "NoSchedule"
            }
          ]
    spec:
      nodeSelector:
        dedicated: master
    […]

Si vous n'aimez pas nodeSelector, vous pouvez également ajouter une annotation comme celle-ci:

scheduler.alpha.kubernetes.io/affinity: >
  {
    "nodeAffinity": {
      "requiredDuringSchedulingIgnoredDuringExecution": {
        "nodeSelectorTerms": [
          {
            "matchExpressions": [
              {
                "key": "dedicated",
                "operator": "Equal",
                "values": ["master"]
              }
            ]
          }
        ]
      }
    }
  }

Gardez à l'esprit que NoSchedule n'expulsera pas les pods déjà programmés.

Les informations ci-dessus proviennent de https://kubernetes.io/docs/user-guide/node-selection/ et vous trouverez plus de détails à ce sujet.

15
Janos Lenart

vous voudrez peut-être plonger dans la documentation Assigning Pods to Nodes . En gros, vous devriez ajouter des étiquettes à vos nœuds avec sth comme ceci:

kubectl label nodes <node-name> <label-key>=<label-value>

et puis référencez cela dans votre spécification Pod comme ceci:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
  nodeSelector:
    label: value

Mais je ne suis pas sûr que cela fonctionne pour les addons non critiques lorsque le nœud spécifique est corrompu. Plus de détails pourraient être trouvés ici

0
pagid