持久卷与声明不匹配

Persistent volume isn't matched with a claim

我创建了一个简单的本地存储卷。像这样:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: vol1
spec:
  capacity:
    storage: 1Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /srv/volumes/vol1
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - my-node

我创建一个声明:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage:1Gi

由于未知原因,他们没有得到匹配项。我做错了什么?

我想通了。我只需要一个用户。只要我有一个用户,一切都完美无缺。

您应该在您的 PVC 中指定 volumeName 以将其专门绑定到您刚刚创建的 PV:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteOnce
  volumeName: "vol1"
  resources:
    requests:
      storage:1Gi

此外,如果您在 PVC 中指定 storageClassName,您的 PVC 也会绑定到符合该规范的 PV(尽管它不保证它会绑定到您的 "vol1" PV 如果该存储有超过 1 个 PV class)。

希望对您有所帮助!

关于本地存储值得注意的是:

Using local storage ties your application to that specific node, making your application harder to schedule. If that node or local volume encounters a failure and becomes inaccessible, then that pod also becomes inaccessible. In addition, many cloud providers do not provide extensive data durability guarantees for local storage, so you could lose all your data in certain scenarios.

这是针对 Kubernetes 1.10. In Kubernetes 1.14 本地持久卷成为 GA。

您发布了一个用户需要的答案。只是为了澄清您的意思是用户,例如 pod、deployment、statefullset 等。 因此,仅使用一个简单的 pod 定义将使您的 PV 成为绑定:

kind: Pod
apiVersion: v1
metadata:
  name: mypod
spec:
  containers:
    - name: myfrontend
      image: nginx
      volumeMounts:
      - mountPath: "/var/www/html"
        name: mypd
  volumes:
    - name: mypd
      persistentVolumeClaim:
        claimName: myclaim

现在,当您删除 pod 并尝试 运行 另一个时,问题就出现了。在这种情况下,如果您或其他人想要寻找解决方案,它已在 GitHub issue 中进行了描述。

希望这能解决问题。