PVC可以绑定到特定的PV吗?

sol*_*son 28 kubernetes

k8s维护者在https://github.com/kubernetes/kubernetes/issues/7438#issuecomment-97148195中对此进行了讨论:

允许用户询问特定PV会破坏它们之间的分离

我不买.我们允许用户选择一个节点.这不是常见的情况,但它存在是有原因的.

它是怎么结束的?什么是> 1 PV和PVC的预期方式,如https://github.com/kubernetes/kubernetes/tree/master/examples/nfs中的那个?

我们使用NFS,而PersistentVolume是一个方便的抽象,因为我们可以保留serverIP和path那里.但PersistentVolumeClaim得到任何具有足够的规模PV,防止path重复使用.

可以设置volumeName在PVC spec块中(参见https://github.com/kubernetes/kubernetes/pull/7529),但没有区别.

Saa*_*Ali 35

今天有一种方法可以将PV预先绑定到PVC,这里有一个示例显示如何:

1)使用ClaimRef字段创建一个PV对象,该字段引用随后将创建的PVC:

$ kubectl create -f pv.yaml
persistentvolume "pv0003" created
Run Code Online (Sandbox Code Playgroud)

其中pv.yaml包括:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv0003
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  claimRef:
    namespace: default
    name: myclaim
  nfs:
    path: /tmp
    server: 172.17.0.2
Run Code Online (Sandbox Code Playgroud)

2)然后创建具有相同名称的PVC:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
Run Code Online (Sandbox Code Playgroud)

3)PV和PVC应立即绑定:

$ kubectl get pvc
NAME      STATUS    VOLUME    CAPACITY   ACCESSMODES   AGE
myclaim   Bound     pv0003    5Gi        RWO           4s
$ ./cluster/kubectl.sh get pv
NAME      CAPACITY   ACCESSMODES   STATUS    CLAIM             REASON    AGE
pv0003    5Gi        RWO           Bound     default/myclaim             57s
Run Code Online (Sandbox Code Playgroud)

我们还计划引入"卷选择器",这将使用户能够根据某些特定于实现的特性(特定机架,例如,或在您的情况下,强制执行1:1 PV到PVC映射的方式)选择特定存储.

请参阅https://github.com/kubernetes/kubernetes/issues/18333.


小智 14

可以使用关键字volumeName来完成:

例如

apiVersion: "v1"
kind: "PersistentVolumeClaim"
metadata:
  name: "claimapp80"
spec:
  accessModes:
    - "ReadWriteOnce"
  resources:
    requests:
      storage: "10Gi"
  volumeName: "app080"
Run Code Online (Sandbox Code Playgroud)

将要求特定PV app080

  • 您也应该将 storageClass 设置为 ""。请参阅此示例 https://cloud.google.com/kubernetes-engine/docs/how-to/persistent-volumes/preexisting-pd (2认同)

小智 12

PV和PVC中的storageClassName应该相同。在PVC中添加持久卷名称作为volumeName,将PVC绑定到特定的PV。

喜欢:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-name
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 40Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-name
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  volumeName: pv-name
Run Code Online (Sandbox Code Playgroud)


Thi*_*ina 10

最好同时指定volumeNameinpvcclaimRefin pvc

通过使用storageClassName: manual两个pvpvc我们可以彼此结合,但如果有很多不保证manualPV和PVC的。

在您的 PVC 中指定一个 volumeName 不会阻止不同的 PVC 在您之前绑定到指定的 PV。在 PV 可用之前,您的索赔将一直处于待处理状态。

在 PV 中指定 claimRef 不会阻止指定的 PVC 绑定到不同的 PV。PVC 可以根据正常绑定过程自由选择另一个 PV 进行绑定。因此,为了避免这些情况并确保您的声明绑定到您想要的卷,您必须确保指定了 volumeName 和 claimRef。

您可以通过检查 pv.kubernetes.io/bound-by-controller 注释的绑定 PV 和 PVC 对来判断您的 volumeName 和/或 claimRef 设置影响了匹配和绑定过程。您自己设置 volumeName 和/或 claimRef 的 PV 和 PVC 将没有此类注释,但普通 PV 和 PVC 会将其设置为“是”。

当 PV 将它的 claimRef 设置为某个 PVC 名称和命名空间,并根据 Retain 回收策略进行回收时,即使 PVC 或整个命名空间不再存在,它的 claimRef 仍将设置为相同的 PVC 名称和命名空间。

来源:https : //docs.openshift.com/container-platform/3.11/dev_guide/persistent_volumes.html