【问题标题】:kubernetes PVCs sharing a single PV?Kubernetes PVC 共享一个 PV?
【发布时间】:2020-01-10 09:21:32
【问题描述】:

我正在尝试为 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: {}

这个旋转是默认存储类的存储集,在我的例子中是数字海洋的体积。所以它创建了一个 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/

  2. 注意到 PV 的存储容量为 10Gi,PVC 的请求容量为 1Gi,但 PVC 还是绑定了 10Gi 的容量?我不能与其他 PVC 共享相同的 PV 容量吗?

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

【问题讨论】:

  • 问题仍然存在吗?

标签: kubernetes digital-ocean


【解决方案1】:

我试图重现所有行为以回答您的所有问题。但是,我无法访问 DigitalOcean,所以我在 GKE 上对其进行了测试。

以上警告,找不到存储类,是否需要 创建一个?

根据文档和最佳实践,强烈建议创建一个storageclass,然后基于它创建 PV/PVC。但是,有一种叫做“手动配置”的东西。你在这种情况下做了什么。

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

  • 如果你创建一个没有 default storageclassPVstorageClassName 参数的 PVC(afaik kubeadm 没有提供默认的 storageclass) - PVC 将卡在 Pending 上,并出现以下事件:没有可用的持久卷声明并且没有设置存储类。
  • 如果您使用default storageclass setup on cluster 但没有storageClassName 参数创建PVC,它将根据默认存储类创建它。
  • 如果您使用storageClassName 参数(在云端、Minikube 或 kubeadm 中的某个位置)创建 PVC - PVC 也将是 Pending 并带有警告: storageclass.storage.k8s.io "manual" not found。 但是,如果创建 PV 时使用相同的 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。如果你使用storageclass,你可以创建PVC

如果是这样,你能告诉我为什么以及如何?或任何指针。

您可以使用documentation 示例或查看here。当您使用默认 storageclass 的云时,您可以通过以下方式将其导出到 yaml:
$ kubectl get sc -oyaml &gt;&gt; storageclass.yaml。 或者,如果您有多个,则必须指定哪一个。 storageclass的名称可以通过
$ kubectl get sc获取。 稍后您可以参考K8s API 自定义您的storageclass

注意 PV 有 10Gi 的存储容量和请求的 PVC 1Gi的容量,但PVC还是绑定了10Gi的容量?

您手动创建了一个具有 10Gi 的 PV,而 PVC 请求了 1Gi。由于 PVC 和 PV 是 1:1 绑定的,PVC 会搜索满足所有条件的 PV 并绑定到它。 PVC (pv1) 请求 1Gi 并且 PV (task-pv-volume) 满足这些要求,因此 Kubernetes 绑定了它们。不幸的是,在这种情况下,大部分空间都被浪费了。

我不能与其他 PVC 共享相同的 PV 容量

很遗憾,由于 PVC 和 PV 之间的关系是 1:1,因此您不能将 2 个 PVC 绑定到 1 个 PV,但您可以配置多个 pod/deployment 以使用相同的 PVC。

我可以建议您查看this stackoverflow case,因为它很好地解释了AccessMode 的细节。

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

正如我之前提到的,如果您手动创建具有特定大小的 PV 和绑定到它的 PVC,请求较少,额外的空间将被浪费。所以,你必须创建 PV 和 PVC 的资源请求相同,或者让storageclass 根据 PVC 请求调整存储。

【讨论】:

    【解决方案2】:
    1. 是的,你必须创建存储类,check,但我猜digital-ocean 提供了默认存储类,你可以通过以下方式检查: kubectl get storageclasses

    2. 您可以共享一个 PV,但只能在 read-only 访问中,如果您需要对所有 pod 的写入权限,则必须创建多个 PV,check

    【讨论】:

    • "but only in" --- ReadWriteMany 怎么样?并不是说他们使用hostPath 两者都不支持。
    猜你喜欢
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多