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),但这没有任何区别。
答案 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映射。)
答案 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)
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)
控制平面可以将 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
中的pvc
和claimRef
中的pvc
。
通过在storageClassName: manual
和pv
中同时使用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。