2015-12-15 17 views
5

这是由K8S维护者在https://github.com/kubernetes/kubernetes/issues/7438#issuecomment-97148195讨论:PVC可以绑定到特定的PV吗?

允许用户请求特定PV打破他们

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

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

我们使用NFS,PersistentVolume是一个方便的抽象,因为我们可以在那里保留server IP和path。但PersistentVolumeClaim会获得足够大小的任意 PV,阻止path重用。

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

回答

9

有今天预先绑定的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:1 PV到PVC映射的方式)。

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

+0

这是一个雄心勃勃的抽象当然。卷选择器是否有可能在体系结构检修之前进行日期预测,因为无论实施哪个建议,都可以完成此操作。 – solsson

+0

是的。请参阅https://github.com/kubernetes/kubernetes/issues/18359,它将独立解决实施问题。 –

+0

#18359将是完美的。 1.2即将到期,我想我们不得不希望这样做到1.3? – solsson

0

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

虽然只记录为proposal,label selectors在PVC中似乎与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 
+0

我认为Kubernetes 1.3.0中的PetSet(http://kubernetes.io/docs/user-guide/petset/)解决了没有标签选择器的确定性映射。它增加了我的原始用例。复制控制器或部署中的单元并非真正意味着具有持久性存储。 – solsson

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 
相关问题