当前位置: 首页 > 知识库问答 >
问题:

kubernetes PVC共享一个PV?

厍兴腾
2023-03-14
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: pv1
  name: pv1
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
status: {}

这个旋转是默认storageclass设置的存储,在我的例子中是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

对于问题2)如果我必须为具有所需容量的不同PVC创建不同的PV,我是否也必须创建storageclass?或者相同的存储类并使用选择器来选择相应的PV?

共有1个答案

勾裕
2023-03-14

我试图复制所有的行为来回答你所有的问题。但是,我没有访问DigitalOcean的权限,所以我在GKE上测试了它。

上面的警告,存储类找不到,我需要创建一个吗?

根据文档和最佳实践,强烈建议创建StorageClass,然后在此基础上创建PV/PVC。然而,有一种东西叫做“手动供应”。你在这个案子里就是这么做的。

手动配置是指需要首先手动创建PV,然后手动创建具有匹配spec.storageClassName:字段的PVC。例子:

  • 如果您创建的PVC没有默认StorageClasspvStorageClassName参数(afaik kubeadm没有提供默认的StorageClass)-PVC将在Pending事件:没有可用于此声明的持久卷,也没有设置存储类。
  • 如果在群集上创建一个带有默认storageclass设置但没有StorageClassName参数的PVC,它将基于默认storageclass创建该PVC。
  • 如果使用StorageClassName参数创建PVC(位于云中的某个地方,Minikube或kubeadm)-PVC也将Pending,并发出警告:未找到StorageClass.storage.k8s.io“Manual”。但是,如果您使用相同的StorageClassName参数创建PV,它将在一段时间内被绑定。

示例:

$ 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

手动配置的缺点是必须为每个PVC创建PV。如果使用StorageClass,则只需创建PVC即可。

如果是,你能告诉我为什么和怎么做吗?或任何指针。

您可以使用文档示例或查看此处。当您使用默认的云StorageClass时,可以通过以下方式将其导出到yaml:
$kubectl get sc-oyaml>>StorageClass.yaml。或者如果您有多个,您必须指定哪一个。StorageClass的名称可以通过
$kubectl get sc获得。稍后,您可以参考K8s API来定制StorageClass

请注意PV的存储容量为10GI,PVC的请求容量为1GI,但PVC仍然被绑定为10GI容量?

我建议您看看这个stackoverflow案例,因为它很好地解释了AccessMode的细节。

如果我必须用所需的容量为不同的PVC创建不同的PV,我是否也必须创建storageclass?还是相同的存储类,并使用选择器选择相应的PV?

正如我之前提到的,如果您手动创建一个特定大小的PV,并与它绑定一个PVC,这要求更少,额外的空间将被浪费。因此,必须使用相同的资源请求创建PV和PVC,或者让StorageClass根据PVC请求调整存储。

 类似资料:
  • 问题内容: 我有多个具有相似构建步骤的项目,并且我正在研究在这些项目中重用Jenkinsfile管道。我很难找到有关如何实现这样的标准(我认为)设置的文档。 这是我的要求: 1)Jenkinsfile存储在回购中,在多个项目之间共享 2)每个项目都有其自己的参数:项目在仓库中的位置。 3)至少从用户角度来看,每个项目在Jenkins中都应独立,这意味着,例如,执行和日志可在Jenkins中的每个项

  • 问题内容: 我正在尝试建立一个共享库。让我们说libabc.so。它使用另一个.so文件,例如lib123.so(/ usr / local / lib中的一个lib)。现在我在我的应用程序中使用共享的liblibabc.so。说我的应用程序。我想知道我应该如何链接这些二进制文件?我不想直接将我的应用程序与lib123.so链接。my- app应该仅与libabc.so链接。我怎样才能做到这一点?

  • 本文向大家介绍system.reactive 共享一个订阅(发布),包括了system.reactive 共享一个订阅(发布)的使用技巧和注意事项,需要的朋友参考一下 示例 给定一个IObservable<Offer>的offers从商家购买或以固定价格出售某些类型的项目,我们可以按照如下匹配对买家和卖家的: 问题在于,每个订阅trades将订阅offers两次。我们可以sellers和buyer

  • 我有一个运行在400个TaskManager上的flink应用程序。在1小时的窗口时间内,我会更频繁地获得相同的密钥,比如说,在1500个唯一密钥中,有50个密钥会更频繁地出现。这使得很少有任务管理者单独处理的数量比其他人多。如果390个TaskManager每分钟处理50MB,那么其他10个TaskManager每分钟处理10GB。这使得系统速度非常慢。如果负载很高,我们可以与多个TaskMan

  • 我使用jsPlumb允许用户构建图形。我允许用户拖动这些元素,所以我为每个endpoint使用锚集合,让jsPlumb在建立连接时从该集合中为我选择“最佳”锚。我遇到的问题是,我可能有多达十几个连接来自任何给定的endpoint,所以当许多人最终选择相同的“最佳”锚点时,这些连接将在视觉上分散注意力——在图中造成拥塞的外观。为了解决这个问题,我想告诉jsPlumb限制任何两个连接在endpoint