pod hat ungebundene PersistentVolumeClaims

84

Wenn ich meine Bereitstellungen aus irgendeinem Grund pushe, wird auf meinen Pods der folgende Fehler angezeigt:

pod hat ungebundene PersistentVolumeClaims

Hier sind meine YAML unten:

Dies wird lokal ausgeführt, nicht auf einer Cloud-Lösung.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: kompose convert
    kompose.version: 1.16.0 ()
  creationTimestamp: null
  labels:
    io.kompose.service: ckan
  name: ckan
spec:
  replicas: 1
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        io.kompose.service: ckan
    spec:
      containers:
        image: slckan/docker_ckan
        name: ckan
        ports:
        - containerPort: 5000
        resources: {}
        volumeMounts:
            - name: ckan-home
              mountPath: /usr/lib/ckan/
              subPath: ckan
      volumes:
      - name: ckan-home
        persistentVolumeClaim:
          claimName: ckan-pv-home-claim
      restartPolicy: Always
status: {}

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: ckan-pv-home-claim
  labels:
    io.kompose.service: ckan
spec:
  storageClassName: ckan-home-sc
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Mi
  volumeMode: Filesystem
---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: ckan-home-sc
provisioner: kubernetes.io/no-provisioner
mountOptions:
  - dir_mode=0755
  - file_mode=0755
  - uid=1000
  - gid=1000
Soniccool
quelle

Antworten:

86

Sie haben eine definieren PersistentVolume Bereitstellung Scheibenraum durch die verbraucht werden PersistentVolumeClaim .

Bei Verwendung von storageClassKubernetes wird "Dynamic Volume Provisioning" aktiviert, das nicht mit dem lokalen Dateisystem funktioniert.


So lösen Sie Ihr Problem:

  • Geben Sie ein PersistentVolume an , das die Einschränkungen des Anspruchs erfüllt (eine Größe> = 100Mi).
  • Entfernen Sie die storageClass-line aus dem PersistentVolumeClaim
  • Entfernen Sie die StorageClass aus Ihrem Cluster

Wie spielen diese Stücke zusammen?

Bei der Erstellung der Beschreibung des Bereitstellungsstatus ist normalerweise bekannt, welche Art von Speicher (Menge, Geschwindigkeit, ...) die Anwendung benötigt.
Um eine Bereitstellung vielseitig zu gestalten, möchten Sie eine starke Abhängigkeit vom Speicher vermeiden. Mit der Kubernetes-Volume-Abstraktion können Sie Speicher auf standardisierte Weise bereitstellen und nutzen.

Der PersistentVolumeClaim wird verwendet, um neben der Bereitstellung einer Anwendung eine Speicherbeschränkung bereitzustellen.

Das PersistentVolume bietet clusterweite Volume-Instanzen, die zum Konsumieren bereit sind (" bound"). Ein PersistentVolume ist an einen Anspruch gebunden . Da aber mehrere Instanzen dieser Anspruch kann auf mehreren Knoten ausgeführt werden, dass Volumen kann zugegriffen durch mehrere Knoten.

Ein PersistentVolume ohne StorageClass wird als statisch betrachtet .

"Dynamic Volume Provisioning" zusammen mit einer StorageClass ermöglicht es dem Cluster, PersistentVolumes bei Bedarf bereitzustellen . Um diese Arbeit zu machen, muss der angegebene Speicheranbieter unterstützt Provisioning - dies ermöglichtden Cluster die Bereitstellung eines „neuen“ anfordern PersistentVolume , wenn ein unbefriedigt PersistentVolumeClaim erscheint.


Beispiel PersistentVolume

Um herauszufinden, wie Sie Dinge angeben können, sollten Sie sich die API für Ihre Kubernetes-Version ansehen. Das folgende Beispiel basiert auf der API-Referenz von K8S 1.17 :

apiVersion: v1
kind: PersistentVolume
metadata:
  name: ckan-pv-home
  labels:
    type: local
spec:
  capacity:
    storage: 100Mi
  hostPath:
    path: "/mnt/data/ckan"

Mit der PersistentVolumeSpec können wir mehrere Attribute definieren. Ich habe ein hostPathVolume ausgewählt, das ein lokales Verzeichnis als Inhalt für das Volume abbildet. Die Kapazität ermöglicht es dem Ressourcenplaner, dieses Volume als im Hinblick auf den Ressourcenbedarf zutreffend zu erkennen.


Zusätzliche Ressourcen:

Florian Neumann
quelle
3
Sie können StorageClass möglicherweise nicht entfernen. Es reicht aus, nur den Wert des Speicherklassennamens durch eine leere Zeichenfolge zu ersetzen, z. B. StorageClass: ""
mrvol
Wie soll das PersistentVolume definiert werden?
Victor Zuanazzi
1
@ VictorZuanazzi gute Frage - es scheint, dass sich die Dokumente leicht geändert haben, ich habe ein Beispiel hinzugefügt. Das Eintauchen in die API ist am Anfang ziemlich schwierig. Glücklicherweise gibt es häufig Querverweise von den API-Dokumenten zu den Handbüchern und umgekehrt. Ich hoffe das hilft dir weiterzumachen.
Florian Neumann