我正在尝试为3个pod部署一个永久卷,我想使用群集的节点存储,即而不是像EBS分拆的外部存储器。
为了达到上述目的,我做了以下实验--
1)我只应用了下面定义的PVC资源-
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
creationTimestamp: null
labels:
io.kompose.service: pv1
name: pv1
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
status: {}
这个旋转是默认存储类的存储集,在我的例子中是digital ocean的卷。所以它创建了一个1Gi卷。
2)创建了一个PV资源和PVC资源,如下所示-
apiVersion: v1
kind: PersistentVolume
metadata:
name: task-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
creationTimestamp: null
labels:
io.kompose.service: pv1
name: pv1
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
status: {}
我看到我的要求被约束。
pavan@p1:~$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pv1 Bound task-pv-volume 10Gi RWO manual 2m5s
pavan@p1:~$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
task-pv-volume 10Gi RWO Retain Bound default/pv1 manual 118m
pavan@p1:~$ kubectl describe pvc
Name: pv1
Namespace: default
StorageClass: manual
Status: Bound
Volume: task-pv-volume
Labels: io.kompose.service=pv1
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"creationTimestamp":null,"labels":{"io.kompose.service":"mo...
pv.kubernetes.io/bind-completed: yes
pv.kubernetes.io/bound-by-controller: yes
Finalizers: [kubernetes.io/pvc-protection]
Capacity: 10Gi
Access Modes: RWO
VolumeMode: Filesystem
Mounted By: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning ProvisioningFailed 28s (x8 over 2m2s) persistentvolume-controller storageclass.storage.k8s.io "manual" not found
下面是我的问题,我希望得到答案/指针-
1.上面的警告,存储类找不到,我需要创建一个吗?如果是这样,你能告诉我为什么和如何?或任何指针。(不知何故,这个链接没有说明-https://kubernetes.io/docs/tasks/run-application/run-single-instance-stateful-application/)
1.请注意,PV的存储容量为10 Gi,PVC的请求容量为1Gi,但PVC仍然绑定了10 Gi容量?我不能与其他PVC共享相同的PV容量吗?
对于问题2),如果我必须为具有所需容量的不同PVC创建不同的PV,是否也必须创建存储类?或相同的存储类并使用选择器选择相应的PV?
2条答案
按热度按时间vcirk6k61#
我试着重现所有的行为来回答你所有的问题。但是,我没有访问DigitalOcean的权限,所以我在GKE上测试了它。
上面的警告,存储类找不到,我需要创建一个吗?
根据文档和最佳实践,强烈建议创建
storageclass
,然后基于它创建PV / PVC。但是,有一种称为“手动配置”的方法。就像你在这个案子里做的。手动配置是指您需要首先手动创建PV,然后创建具有匹配
spec.storageClassName:
字段的PVC。示例:default storageclass
、PV
和storageClassName
参数(afaikkubeadm
没有提供默认的storageclass
)- PVC将被卡在Pending
上,事件为:no persistent volumes available for this claim and no storage class is set
。default storageclass
设置创建PVC,但不使用storageClassName
参数,则将基于默认storageclass
创建PVC。storageClassName
参数的PVC(在Cloud,Minikube或Microk 8 s中的某个地方),PVC也会卡住Pending
,并出现以下警告:storageclass.storage.k8s.io "manual" not found.
但是如果创建了PV with the same
storageClassName`参数,过一会儿就会绑定。示例:
manual provisioning
的缺点是必须为每个PVC创建PV(只有1:1配对才能工作)。如果使用storageclass
,则可以直接创建PVC
。如果是这样,你能告诉我为什么和如何?或任何指针。
您可以使用documentation示例或检查here。由于您使用的是为您设置了默认
storageclass
(或简称sc
)的云提供商,因此您可以通过以下方式将其导出到yaml文件:$ kubectl get sc -o yaml >> storageclass.yaml
(然后需要清理它,删除唯一的元数据,然后才能重用它)。或者,如果有多个
sc
,则必须指定是哪一个。storageclass
的名称可以通过以下方式获得$ kubectl get sc
,以后可以参考K8s API定制自己的storageclass
。请注意,PV的存储容量为10 Gi,PVC的请求容量为1Gi,但PVC仍然绑定了10 Gi容量?
您手动创建了一个具有10 Gi的PV,而PVC请求了1Gi。由于PVC和PV以1:1的比例彼此绑定,PVC搜索满足所有条件并已绑定到它的PV。PVC(“pv 1”)请求1Gi,而PV(“task-pv-volume”)满足这些要求,因此Kubernetes绑定了它们。不幸的是,在这种情况下,大部分空间都被浪费了。
我不能与其他PVC共享相同的PV容量吗
不幸的是,您不能将多个PVC绑定到同一个PV,因为PVC和PV之间的关系是1:1,但您可以配置多个Pod或部署使用同一个PVC(在同一个命名空间内)。
我可以建议你看看this SO case,因为它很好地解释了
AccessMode
的细节。如果我必须为具有所需容量的不同PVC创建不同的PV,是否也必须创建存储类?或相同的存储类并使用选择器选择相应的PV?
正如我之前提到的,如果您手动创建具有特定大小的PV并绑定到它的PVC,这需要较少的存储空间,那么额外的空间将被浪费。因此,您必须使用相同的资源请求创建PV和PVC,或者让
storageclass
根据PVC请求调整存储。u3r8eeie2#
1.是的,你必须创建存储类check,但我猜
digital-ocean
提供了默认的存储类,你可以检查它:kubectl get storageclasses
1.您可以共享一个PV,但仅限于
read-only
访问,如果您需要对所有Pod进行写访问,则必须创建多个PV,请检查