kubernetes PVC 共享单个 PV?

Cod*_*der 1 digital-ocean kubernetes

我正在尝试为 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: {}
Run Code Online (Sandbox Code Playgroud)

此旋转启动了默认存储类的存储集,在我的例子中是数字海洋的体积。所以它创建了一个 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"
Run Code Online (Sandbox Code Playgroud)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: pv1
  name: pv1
spec:
  storageClassName: manual
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
status: {}
Run Code Online (Sandbox Code Playgroud)

发布此信息后,我发现我的主张受到约束。

    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
Run Code Online (Sandbox Code Playgroud)

以下是我的问题,我希望得到答案/指示 -

  1. 上面的警告,找不到存储类,我需要创建一个吗?如果是这样,你能告诉我原因和方式吗?或任何指针。(不知何故,此链接没有指出 - https://kubernetes.io/docs/tasks/run-application/run-single-instance-stateful-application/

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

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

Pjo*_*erS 5

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

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

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

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

  • 如果您创建的 PVC 没有default storageclass,PVstorageClassName参数(据我所知kubeadm,未提供默认值storageclass) - PVC 将停留在Pendingevent: 上no persistent volumes available for this claim and no storage class is set
  • default storageclass如果您在集群上创建了设置但没有参数的 PVC,storageClassName它将基于 default 创建storageclass
  • 如果您创建带有参数的 PVC storageClassName(在 Cloud、Minikube 或 Microk8s 中的某个位置),PVC 也会遇到Pending此警告:storageclass.storage.k8s.io "manual" not found. 但是,如果您创建PV with the samestorageClassName` 参数,它将在一段时间后被绑定。

例子:

$ 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
Run Code Online (Sandbox Code Playgroud)

缺点manual provisioning是您必须为每个 PVC 创建 PV(只有 1:1 配对才有效)。如果你使用storageclass,你就可以创建PVC

如果是这样,你能告诉我原因和方式吗?或任何指针。

您可以使用文档示例或查看此处。当您使用为您设置了默认storageclass(或sc简称)的云提供商时,您可以通过以下方式将其导出到 yaml 文件:(
$ kubectl get sc -o yaml >> storageclass.yaml 然后您需要清理它,删除唯一的元数据,然后才能重新使用它)。

或者,如果您有多个sc,则必须指定是哪一个。的名称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 共享相同的光伏容量吗

遗憾的是,您无法将 1 个以上的 PVC 绑定到同一个 PV,因为 PVC 和 PV 之间的关系是 1:1,但您可以配置许多 pod 或部署以使用相同的 PVC(在同一命名空间内)。

我可以建议你看看这个案例,因为它AccessMode很好地解释了细节。

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

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