J'ai configuré un nouveau k8s dans un seul nœud, qui est contaminé. Mais le PersistentVolume
ne peut pas être créé avec succès, lorsque j'essaye de créer un simple PostgreSQL.
Il y a quelques informations détaillées ci-dessous.
Le StorageClass
est copié à partir de la page officielle: https://kubernetes.io/docs/concepts/storage/storage-classes/#local
$ kubectl version Client Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.4", GitCommit:"c27b913fddd1a6c480c229191a087698aa92f0b1", GitTreeState:"clean", BuildDate:"2019-02-28T13:37:52Z", GoVersion:"go1.11.5", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.1", GitCommit:"eec55b9ba98609a46fee712359c7b5b365bdd920", GitTreeState:"clean", BuildDate:"2018-12-13T10:31:33Z", GoVersion:"go1.11.2", Compiler:"gc", Platform:"linux/amd64"}
Le StatefulSet
est:
$ kubectl describe pvc Name: postgres-data-postgres-0 Namespace: default StorageClass: local-storage Status: Pending Volume: Labels: app=postgres Annotations: <none> Finalizers: [kubernetes.io/pvc-protection] Capacity: Access Modes: VolumeMode: Filesystem Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal WaitForFirstConsumer <invalid> (x2 over <invalid>) persistentvolume-controller waiting for first consumer to be created before binding
À propos de la StorageClass
cours d'exécution:
$ kubectl describe storageclasses.storage.k8s.io Name: local-storage IsDefaultClass: No Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{},"name":"local-storage"},"provisioner":"kubernetes.io/no-provisioner","volumeBindingMode":"WaitForFirstConsumer"} Provisioner: kubernetes.io/no-provisioner Parameters: <none> AllowVolumeExpansion: <unset> MountOptions: <none> ReclaimPolicy: Delete VolumeBindingMode: WaitForFirstConsumer Events: <none>
À propos du PersistentVolumeClaim
cours d'exécution:
kind: StatefulSet apiVersion: apps/v1beta1 metadata: name: postgres spec: serviceName: postgres replicas: 1 ... volumeClaimTemplates: - metadata: name: postgres-data spec: storageClassName: local-storage accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
Versions K8s:
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer
3 Réponses :
L'application attend le pod, tandis que le pod attend un PersistentVolume
par un PersistentVolumeClaim
. Cependant, le PersistentVolume
doit être préparé par l'utilisateur avant utilisation.
Mes précédents YAML manquent d'un PersistentVolume
comme celui-ci:
kind: PersistentVolume apiVersion: v1 metadata: name: postgres-data labels: type: local spec: storageClassName: local-storage capacity: storage: 1Gi local: path: /data/postgres persistentVolumeReclaimPolicy: Retain accessModes: - ReadWriteOnce storageClassName: local-storage nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: app operator: In values: - postgres
Le chemin local /data/postgres
doit être préparé avant utilisation. Kubernetes ne le créera pas automatiquement.
Avez-vous besoin de nodeAffinity?
Pour un local-storage
, je pense que nodeAffinity
est nécessaire. Je ne veux pas que le PersistentVolume soit planifié n'importe où.
@YanQiDong Je ne peux pas le résoudre. 0/2 nodes are available: 1 node(s) didn't find available persistent volumes to bind, 1 node(s) had taints that the pod didn't tolerate
que 0/2 nodes are available: 1 node(s) didn't find available persistent volumes to bind, 1 node(s) had taints that the pod didn't tolerate
lors de la description du pod postgre. Pouvez-vous m'avoir?
Un conteneur ne peut être planifié que sur le nœud où se trouve la PV de stockage local.
La réponse acceptée n'a pas fonctionné pour moi. Je pense qu'il est parce que la clé de l' application ne sera pas fixé avant le sont déployés de pods StatefulSet, ce qui empêche la PersistentVolumeClaim pour correspondre à la nodeSelector (empêchant les pods de commencer par l'erreur didn't find available persistent volumes to bind.
). Pour résoudre ce blocage, j'ai défini un PersistentVolume pour chaque nœud (ce n'est peut-être pas idéal mais cela a fonctionné):
apiVersion: v1 kind: PersistentVolume metadata: name: postgres-data-node1 labels: type: local spec: [â¦] nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - node1
Je viens de rencontrer cela moi-même et j'ai été complètement jeté pour une boucle jusqu'à ce que je réalise que le VolumeBindingMode
StorageClass
était réglé sur WaitForFirstConsumer
ma valeur prévue de Immediate
. Cette valeur est immuable, vous devrez donc:
Obtenez la classe de stockage yaml:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: gp2 provisioner: kubernetes.io/aws-ebs parameters: type: gp2 reclaimPolicy: Delete allowVolumeExpansion: true mountOptions: - debug volumeBindingMode: Immediate
ou vous pouvez également simplement copier l'exemple de la documentation ici (assurez-vous que les noms de métadonnées correspondent). Voici ce que j'ai configuré:
kubectl get storageclasses.storage.k8s.io gp2 -o yaml > gp2.yaml
Et supprimez l'ancien StorageClass
avant de le recréer avec le nouveau volumeBindingMode
défini sur Immediate
.
Remarque: Le client EKS peut avoir besoin de perms pour créer des ressources cloud telles que EBS ou EFS. En supposant EBS, vous devriez être bon avec arn:aws:iam::aws:policy/AmazonEKSClusterPolicy
.
Après cela, vous ne devriez avoir aucun problème à créer et à utiliser des PV provisionnés dynamiquement .