9
votes

WaitForFirstConsumer PersistentVolumeClaim attendant la création du premier consommateur avant la liaison

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


0 commentaires

3 Réponses :


11
votes

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.


4 commentaires

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.



0
votes

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


0 commentaires

2
votes

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:

  1. 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
    
  2. 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 .


0 commentaires