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

时间:2015-12-15 06:48:38

标签: 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是一个方便的抽象,因为我们可以保留server IP和path。但PersistentVolumeClaim会获得足够大小的任何 PV,从而阻止path重用。

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

9 个答案:

答案 0 :(得分:24)

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

的示例

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

$ kubectl create -f pv.yaml
persistentvolume "pv0003" created

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

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

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

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

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

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

答案 1 :(得分:8)

可以使用关键字 volumeName:

来完成

例如

m = s.values == 0
w = np.flatnonzero(np.diff(np.append(True, m)))
pd.Series(np.diff(w)[::2], s.index[w[::2]])

2010-01-02 09:00:00    1
2010-01-02 11:00:00    4
2010-01-02 18:00:00    3
dtype: int64

将声明具体的PV apiVersion: "v1" kind: "PersistentVolumeClaim" metadata: name: "claimapp80" spec: accessModes: - "ReadWriteOnce" resources: requests: storage: "10Gi" volumeName: "app080"

答案 2 :(得分:2)

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

答案 3 :(得分:1)

我不认为@ jayme对原始答案的编辑是向前兼容的。

虽然只记录为proposal,但PVC中的label selectors似乎与Kubernetes 1.3.0一起使用。

我写了example,定义了两个除labels之外相同的卷。两者都满足任何权利要求,但当声明指定

selector:
    matchLabels:
      id: test2
很明显,其中一个从属吊舱不会启动,而且test1 PV保持未绑定状态。

可以使用以下代码minikube进行测试:

$ kubectl create -f volumetest.yml
$ sleep 5
$ kubectl get pods
NAME                              READY     STATUS    RESTARTS   AGE
volumetest1                       1/1       Running   0          8m
volumetest1-conflict              0/1       Pending   0          8m
$ kubectl get pv
NAME      CAPACITY   ACCESSMODES   STATUS      CLAIM          REASON    AGE
pv1       1Gi        RWO           Available                            8m
pv2       1Gi        RWO           Bound       default/test             8m

答案 4 :(得分:1)

现在我们可以使用storageClassName(至少来自kubernetes 1.7.x)

详见https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage

此处也复制了示例代码

kind: PersistentVolume
apiVersion: v1
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/tmp/data"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: task-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

答案 5 :(得分:1)

是的,您实际上可以在PVC中提供volumeName。它将精确绑定到volumeName中提供的PV名称(规范也应该同步)

答案 6 :(得分:1)

根据documentation


控制平面可以将 PersistentVolumeClaims 绑定到集群中匹配的 PersistentVolume。但是,如果你想让一个PVC绑定到一个特定的PV,你需要预先绑定它们。

通过在 PersistentVolumeClaim 中指定 PersistentVolume,您可以声明该特定 PV 和 PVC 之间的绑定。如果 PersistentVolume 存在并且没有通过它的 claimRef 字段保留 PersistentVolumeClaims,那么 PersistentVolume 和 PersistentVolumeClaim 将被绑定。

无论某些卷匹配标准如何,包括节点亲和性,绑定都会发生。控制平面仍会检查存储类别、访问模式和请求的存储大小是否有效。


尽管 StatefulSets are the resource used to manage stateful applications,我已经将他们提供的 pv/pvc 示例修改为部署示例(使用 nginx,至少与 minikube 兼容,请评论/编辑与云提供商的兼容性):

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: foo-pvc
spec:
  volumeName: foo-pv
  storageClassName: "standard"
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: "1Gi"
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: foo-pv
#  name: bar-pv
spec:
  storageClassName: "standard"
  capacity:
    storage: "1Gi"
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/test/"
#  claimRef:
#    name: foo-pvc
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: foo-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
        volumeMounts:
          - name: nginx-storage
            mountPath: /test/
      volumes:
      - name: nginx-storage
        persistentVolumeClaim:
          claimName: foo-pvc

因此,详细说明文档,如果填写 PV 的 spec.claimRef.name(作为 foo-pvc 或任何其他内容),您的 PVC 将处于待处理状态且不会绑定。 (我把它注释掉了。)但是你会注意到,如果你像上面那样在创建 PV 之后编辑它,使用 kubectl edit pv foo-pv,它是由控制平面设置的。

此外,我留下了一个备用 PV metadata.name(已注释掉),您可以切换注释行并查看如果该值与 PVC 指定的 spec.volumeName 不匹配,它将不会绑定。< /p>

附加说明:我发现如果您在部署上述内容之前没有创建 /mnt/test ,当您从容器内部写入时,它会创建该文件夹。

答案 7 :(得分:0)

最好同时指定volumeName中的pvcclaimRef中的pvc

通过在storageClassName: manualpv中同时使用pvc,我们可以相互绑定,但是不能保证是否有很多manual pv和pvc。

  

在PVC中指定volumeName不会阻止使用其他PVC   从绑定到指定PV之前。您的索赔将   保持待定状态,直到PV可用为止。

     

在PV中指定ClaimRef不会阻止指定的PVC   绑定到另一个PV。 PVC可以自由选择其他PV   根据正常的绑定过程进行绑定。因此,要避免   这些情况,并确保您的索赔与您的交易量相关   如果需要,必须确保同时指定了volumeName和claimRef。

     

您可以说您对volumeName和/或ClaimRef的设置   通过检查绑定的PV影响了匹配和绑定过程   和pv.kubernetes.io/bound-by-controller注释的PVC对。   在其中设置volumeName和/或ClaimRef的PV和PVC   将没有这样的注释,但是普通的PV和PVC将具有它   设置为“是”。

     

当PV将其ClaimRef设置为某些PVC名称和名称空间,并且为   根据保留回收政策对其进行了回收,其claimRef将   保持设置为相同的PVC名称和命名空间,即使PVC或   整个名称空间不再存在。

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

答案 8 :(得分:0)

标签选择器如何,如 kubernetes 文档中所述:

<块引用>

Claims 可以指定一个标签选择器来进一步过滤集合 卷。只能绑定标签匹配选择器的卷 到索赔。选择器可以包含两个字段:

matchLabels - 卷必须有一个带有这个值的标签
matchExpressions - 通过指定 key、list 提出的要求列表 值,以及关联键和值的运算符。有效的 运算符包括 In、NotIn、Exists 和DoesNotExist。