kubernetes的PVCs共享一个PV?

ddarikpa  于 2023-05-22  发布在  Kubernetes
关注(0)|答案(2)|浏览(302)

我正在尝试为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?

vcirk6k6

vcirk6k61#

我试着重现所有的行为来回答你所有的问题。但是,我没有访问DigitalOcean的权限,所以我在GKE上测试了它。
上面的警告,存储类找不到,我需要创建一个吗?
根据文档和最佳实践,强烈建议创建storageclass,然后基于它创建PV / PVC。但是,有一种称为“手动配置”的方法。就像你在这个案子里做的。
手动配置是指您需要首先手动创建PV,然后创建具有匹配spec.storageClassName:字段的PVC。示例:

  • 如果您创建的PVC没有default storageclassPVstorageClassName参数(afaik kubeadm没有提供默认的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`参数,过一会儿就会绑定。

示例:

$ kubectl get pv,pvc
NAME                              CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
persistentvolume/task-pv-volume   10Gi       RWO            Retain           Available           manual                  4s

NAME                        STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/pv1   Pending                                      manual         4m12s

...

kubectl get pv,pvc
NAME                              CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM         STORAGECLASS   REASON   AGE
persistentvolume/task-pv-volume   10Gi       RWO            Retain           Bound    default/pv1   manual                  9s

NAME                        STATUS   VOLUME           CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/pv1   Bound    task-pv-volume   10Gi       RWO            manual         4m17s

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请求调整存储。

u3r8eeie

u3r8eeie2#

1.是的,你必须创建存储类check,但我猜digital-ocean提供了默认的存储类,你可以检查它:kubectl get storageclasses
1.您可以共享一个PV,但仅限于read-only访问,如果您需要对所有Pod进行写访问,则必须创建多个PV,请检查

相关问题