我有一个看起来简单的 PV 和 PVC:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: www-pvc
spec:
storageClassName: ""
volumeName: www-pv
accessModes:
- ReadOnlyMany
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: www-pv
spec:
storageClassName: ""
claimRef:
name: www-pvc
capacity:
storage: 1Mi
accessModes:
- ReadOnlyMany
nfs:
server: 192.168.1.100
path: "/www"
Run Code Online (Sandbox Code Playgroud)
由于某种原因,它们不会相互绑定,并且 PVC 永远保持“挂起”状态:
$ kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/www-pv 1Mi ROX Retain Available /www-pvc 107m
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/www-pvc Pending www-pv 0 107m
Run Code Online (Sandbox Code Playgroud)
如何调试匹配?k3s中匹配的是哪个服务?我会查看 k3s 二进制文件的日志(在 Debian 下作为服务运行)吗?
Pjo*_*erS 13
在有关持久卷的 Kubernetes 文档中,您可以找到以下信息:
\n\n\n(
\nPersistentVolumePV) 是集群中的一块存储,由管理员配置或使用 动态配置Storage Classes。( PVC
\nPersistentVolumeClaim)是用户的存储请求。它类似于 Pod。Pod 消耗节点资源,PVC 消耗 PV 资源。
在绑定部分您有信息:
\n\n\n如果不存在匹配的卷,声明将无限期地保持不受约束。当匹配的数量变得可用时,索赔将受到约束。例如,配置有许多 50Gi PV 的集群与请求 100Gi 的 PVC 不匹配。当集群中添加100Gi PV时,即可绑定PVC。
\n
在Openshift 文档 - 卷和声明预绑定中,您可以找到在使用时pre-binding跳过某些匹配的信息。
\n\n如果您确切地知道希望 PersistentVolumeClaim 绑定到哪个 PersistentVolume,则可以使用 volumeName 字段在 PVC 中指定 PV。该方法跳过正常的匹配和绑定过程。PVC 只能绑定到具有在volumeName 中指定的相同名称的PV。如果具有该名称的 PV 存在且可用,则无论 PV 是否满足 PVC\xe2\x80\x99s 标签选择器、访问模式和资源请求,PV 和 PVC 都会绑定。
\n
第1期
\n在您的PV配置中设置
capacity:\n storage: 1Mi\nRun Code Online (Sandbox Code Playgroud)\n这意味着您拥有 1Mi 的存储空间,即约 1.04 MB。
\n您的PVC配置为请求 1Gi,即 ~ 1.07GB。
resources:\n requests:\n storage: 1Gi\nRun Code Online (Sandbox Code Playgroud)\n您PV没有满足您的PVC要求。
您可以拥有许多PV示例存储,但如果请求高于,5Gi则它们都不会受到绑定,例如。但是,如果存储较高而请求较低,则它会受到限制,但会被浪费。PVC5Gi6GiPV6GiPVC5Gi1Gi
第2期
\n如果您描述您的情况,PVC您会发现Warning以下内容:
Events:\n Type Reason Age From Message\n ---- ------ ---- ---- -------\n Warning FailedBinding 2s (x2 over 17s) persistentvolume-controller volume "www-pv" already bound to a different claim.\nRun Code Online (Sandbox Code Playgroud)\n在您的配置中,您正在使用您在和中Pre-Binding指定的名称。volumeNamePVCclaimRefPV
OpenShift 文档 - 使用持久卷中对此示例进行了详细描述。在您当前的设置中,您已使用claimRef.name但未指定claimRef.namespace.
$ kubectl get pv,pvc\nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\npersistentvolume/www-pv 1Gi ROX Retain Available /www-pvc 4m28s\n\nNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\npersistentvolumeclaim/www-pvc Pending www-pv 0 4m28s\nRun Code Online (Sandbox Code Playgroud)\n但当你添加claimRef.namespace它就会起作用。
$ kubectl get pv,pvc\nNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\npersistentvolume/www-pv 1Gi ROX Retain Bound default/www-pvc 7m3s\n\nNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\npersistentvolumeclaim/www-pvc Bound www-pv 1Gi ROX 7m3s\nRun Code Online (Sandbox Code Playgroud)\n您应该在原样资源中指定PVC\'s名称空间。PV\'s spec.claimRef.namespacePVCnamespaced
$ kubectl api-resources | grep pv\npersistentvolumeclaims pvc true PersistentVolumeClaim\npersistentvolumes pv false PersistentVolume\nRun Code Online (Sandbox Code Playgroud)\n在您PV更改spec.capacity.storage为1Gi.
在您的PV添加中spec.claimRef.namespace: default,如下例所示:
spec:\n storageClassName: ""\n claimRef:\n name: www-pvc\n namespace: default # adding namespace: defaults\n capacity:\n storage: 1Gi # changed storage size\nRun Code Online (Sandbox Code Playgroud)\n如果您能够绑定PV和,请告诉我PVC。
我认为问题在于PVC正在尝试获得 aPV的大小1Gi,但你的PVis 的大小1M。
因此,绑定失败。您可以通过增加PV大小或减小PVC大小来解决此问题。
用于kubectl describe pvc获取有关事件和失败原因的更多信息。
为了进一步澄清,aPVC是对存储的请求,因此如果您说您需要1G声明存储但您只提供1M实际存储,则 PVC 将保持状态Pending。基于此,中定义的大小PVC应始终小于或等于PV大小。
| 归档时间: |
|
| 查看次数: |
17041 次 |
| 最近记录: |