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: {}
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
Il y a quelques choses qui peuvent causer cette erreur:
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.
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]
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."
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 point de départ de la recherche de la cause est la définition du nœud et du pod.