持久卷与声明不匹配
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 中进行了描述。
希望这能解决问题。
我创建了一个简单的本地存储卷。像这样:
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 中进行了描述。
希望这能解决问题。