27.5. 卷和 Claim Pre-binding
如果您知道您希望 PersistentVolumeClaim
绑定到的 PersistentVolume
,您可以使用 volumeName
字段在 PVC 中指定 PV。此方法跳过了正常的匹配和绑定进程。PVC 只会绑定到在 volumeName
中指定的同名的 PV。如果这个 PV 存在且为 Available
,则 PV 和 PVC 将受到绑定,无论 PV 是否满足 PVC 的标签选择器、访问模式和资源请求。
例 27.1. 使用 volumeName 的持久性卷声明对象定义
apiVersion: "v1" kind: "PersistentVolumeClaim" metadata: name: "claim1" spec: accessModes: - "ReadWriteOnce" resources: requests: storage: "1Gi" volumeName: "pv0001"
设置 claimRefs
的功能是针对上述用例的一个临时临时解决方案。用于限制某个卷在开发中的长期解决方案。
在代表用户设置 claimRefs
前,集群管理员应首先考虑配置 selector-label 卷绑定。
您可能还希望集群管理员只为声明"reserve"卷,以便其他 nobody 的声明可以在您的操作之前绑定到它。在这种情况下,管理员可以使用 claimRef
字段在 PV 中指定 PVC。PV 只能绑定到一个 PVC,其名称和命名空间在 claimRef
中指定。PVC 的访问模式和资源请求必须仍满足,这样才能绑定 PV 和 PVC,但标签选择器被忽略。
使用 claimRef 的持久性卷对象定义
apiVersion: v1 kind: PersistentVolume metadata: name: pv0001 spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce nfs: path: /tmp server: 172.17.0.2 persistentVolumeReclaimPolicy: Retain claimRef: name: claim1 namespace: default
在 PVC 中指定 volumeName
不会阻止不同的 PVC 在操作前绑定到指定的 PV。您的声明将保持 Pending
,直到 PV 处于 Available
状态。
在 PV 中指定 claimRef
不会阻止指定的 PVC 绑定到不同的 PV。PVC 可以自由选择另外一个 PV,以根据常规绑定过程绑定。因此,为了避免这些情况,并确保您的声明绑定到您想要的卷,您必须确保同时指定了 volumeName
和 claimRef
。
您可以通过检查 pv.kubernetes.io/bound-by-controller
注解的 Bound
PV 和 PVC 对,告知设置 volumeName
和/或 claimRef
会影响匹配的和绑定过程。在您设置 volumeName
和/或 claimRef
的 PV 和 PVC 没有这个注解,但普通 PV 和 PVC 会被设置为 "yes"
。
当 PV 的 claimRef
设置为某些 PVC 名称和命名空间时,并根据 Retain
重新声明策略重新声明,则其 claimRef
仍会保留为同一个 PVC 名称和命名空间,即使 PVC 或整个命名空间不再存在。