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 .