web-dev-qa-db-fra.com

Avertissement Kubernetes Pod: 1 noeud (s) avait (s) un conflit d'affinité entre noeud de volume

J'essaie de configurer le cluster Kubernetes. Les classes Perspective Volomue, Persistent Volume Claim et Storage sont toutes configurées et en cours d'exécution, mais lorsque je souhaite créer un module à partir du déploiement, ce dernier est créé mais se bloque à l'état En attente. Après avoir décrit, je n’obtiens que ce warnig "1 nœud (s) avait (ont) un conflit d’affinité entre les nœuds de volume." Quelqu'un peut-il me dire ce qui me manque dans la configuration de mon volume?

apiVersion: v1
kind: PersistentVolume
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: mariadb-pv0
  name: mariadb-pv0
spec:
  volumeMode: Filesystem
  storageClassName: local-storage
  local:
    path: "/home/gtcontainer/applications/data/db/mariadb"
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 2Gi
  claimRef:
    namespace: default
    name: mariadb-claim0
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/cvl-gtv-42.corp.globaltelemetrics.eu
            operator: In
            values:
            - master

status: {}
15
Krzysztof

L'erreur "conflit d'affinité entre les noeuds de volume" se produit lorsque le volume persistant prétend que le pod est utilisé sur différentes zones plutôt que sur une seule zone. Le pod n'a donc pas pu être programmé car il ne peut pas se connecter au volume. une autre zone. Pour vérifier cela, vous pouvez voir les détails de tous les volumes persistants. Pour vérifier cela, commencez par obtenir vos PVC:

$ kubectl get pvc -n <namespace>

Obtenez ensuite les détails des volumes persistants (pas les revendications de volume)

$  kubectl get pv

Trouvez les PV correspondant à vos PVC et décrivez-les.

$  kubectl describe pv <pv1> <pv2>

Vous pouvez vérifier l'ID de source.Volume pour chaque PV. Il est probable que leur zone de disponibilité sera différente et votre pod donnera l'erreur d'affinité. Pour résoudre ce problème, créez une classe de magasin pour une seule zone et utilisez cette classe de magasin dans votre PVC.

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: region1storageclass
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
  encrypted: "true" # if encryption required
volumeBindingMode: WaitForFirstConsumer
allowedTopologies:
- matchLabelExpressions:
  - key: failure-domain.beta.kubernetes.io/zone
    values:
    - eu-west-2b # this is the availability zone, will depend on your cloud provider
    # multi-az can be added, but that defeats the purpose in our scenario
17
Sownak Roy

Il y a quelques choses qui peuvent causer cette erreur:

  1. Le nœud n’est pas étiqueté correctement. J'ai eu ce problème sur AWS alors que mon nœud de travail ne possédait pas d'étiquettes appropriées (le maître les avait cependant) comme ça:

    échec-domaine.beta.kubernetes.io/region=us-east-2

    fail-domain.beta.kubernetes.io/zone=us-east-2c

    Après avoir corrigé le nœud avec les étiquettes, l’erreur "1 nœud (s) avait (nt) un conflit d’affinité entre les nœuds de volume" a été supprimée, de sorte que PV, PVC avec un pod ont été déployés correctement. La valeur de ces étiquettes dépend du fournisseur de cloud. Fondamentalement, c'est le travail du fournisseur de cloud (avec l'option de fournisseur de cloud définie dans le contrôleur de cube, le serveur d'API, le kubelet) de définir ces étiquettes. Si les étiquettes appropriées ne sont pas définies, vérifiez que votre intégration CloudProvider est correcte. J'ai utilisé kubeadm, il est donc fastidieux à installer, mais avec d'autres outils, comme kops, par exemple, il fonctionne tout de suite.

  2. En fonction de votre définition PV et de l’utilisation du champ nodeAffinity, vous essayez d’utiliser un volume local (lisez ici lien de description du volume local, documentation officielle ), puis assurez-vous de définir le "champ NodeAffinity". comme ça (ça a fonctionné dans mon cas sur AWS):

    nodeAffinity:

         required:
          nodeSelectorTerms:
           - matchExpressions:
             - key: kubernetes.io/hostname
               operator: In
               values:
               - my-node  # it must be the name of your node(kubectl get nodes)
    

Ainsi, après la création de la ressource et l'exécution en cours, il apparaîtra comme ceci:

         Required Terms:  
                    Term 0:  kubernetes.io/hostname in [your node name]
  1. La définition StorageClass (nommée local-storage, qui n'est pas publiée ici) doit être créée avec volumeBindingMode défini sur WaitForFirstConsumer pour que le stockage local fonctionne correctement. Reportez-vous à l'exemple ici description locale de la classe de stockage, doc officiel pour comprendre la raison derrière cela.
4
Alex

presque le même problème décrit ici ... https://github.com/kubernetes/kubernetes/issues/6162

"Si vous utilisez des volumes locaux et que le nœud se bloque, votre pod ne peut pas être replanifié sur un autre nœud. Il doit être planifié sur le même nœud. C’est l’avantage de l’utilisation du stockage local, votre pod reste lié à jamais à un nœud."

0
jitendra

L'erreur "1 noeud (s) avait (s) un conflit d'affinité de noeud de volume" est créée par le planificateur car il ne peut pas programmer votre pod sur un noeud conforme à la persistenvolume.spec.nodeAffinity champ dans votre volume persistant (PV).

En d’autres termes, vous indiquez dans votre PV qu’un pod utilisant ce PV doit être planifié sur un nœud portant l’étiquette kubernetes.io/cvl-gtv-42.corp.globaltelemetrics.eu = master, mais ce n'est pas possible pour une raison quelconque.

Il peut y avoir plusieurs raisons pour lesquelles votre pod ne peut pas être planifié sur un tel nœud:

  • Le pod a des affinités de nœud, des affinités de pod, etc. en conflit avec le nœud cible.
  • Le noeud cible est corrompu
  • Le noeud cible a atteint sa limite de "nombre maximal de pods par noeud"
  • Il n'y a pas de noeud avec l'étiquette donnée

Le point de départ de la recherche de la cause est la définition du nœud et du pod.

0
weibeld