我们可以在 k8s 中获得只有 PVC(没有 PV)的 Persistent Volume 吗?

Can we get Persistent Volume with only PVC (without PV) in k8s?

我刚刚在 postgres 容器中看到一个带有 PersistentVolumeClaimvolumeMounts 以及 volumespersistentVolumeClaim 的 Postgres yaml 文件。我找不到任何 PersistentVolume 定义。

然而,当 postgres 容器 pod 被启动时,我可以看到一个 PersistentVolume 绑定到 yaml 文件中定义的 persistentVolumeClaim

那么如果我们只定义PersistentVolumeClaim,k8s会创建PersistentVolume吗?

没错,所以当您的集群使用 storage-classes then you just need to provide the PVC 进行动态配置时,配置器将从 PVC 和 storageClass 获取相关信息,然后根据这些信息创建 PV。

  • PV 的配置是动态发生的

    When none of the static PVs the administrator created matches a user’s PersistentVolumeClaim, the cluster may try to dynamically provision a volume specially for the PVC. This provisioning is based on StorageClasses: the PVC must request a storage class and the administrator must have created and configured that class in order for dynamic provisioning to occur. dynamic-provisining

例如,您在 PVC 中提供以下信息

  1. StorageClassName

  2. 请求的存储大小

  3. 访问模式

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: task-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

在 StorageClass 中,您提供以下信息

  1. 供应商

  2. 其他信息

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: manual
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
reclaimPolicy: Retain
volumeBindingMode: Immediate
  • PVC 是命名空间范围内的 kubernetes 对象,但存储class 是集群范围内的 k8s 对象。所以当你没有在你的 pvc 中指定 storgaeclass 的名称时,你的 cluster.so 中总是有一个默认存储class,PV 将从默认存储class.

kubectl get sc,pvc,pv会提供相关资料

实际上,

已经完成了

Dynamic provisioning of PersistentVolumes.

PersistentVolumesPersistentVolumeClaims 使获得持久存储变得容易,开发人员无需处理底层使用的实际存储技术。但这仍然需要集群管理员预先 提供 实际存储。您认为,必须创建 PersistentVolumes,但不必一直这样。幸运的是,Kubernetes 还可以通过 PersistentVolumes 的动态配置自动执行此工作。

集群管理员可以部署一个 PersistentVolume provisioner 并定义一个或多个 StorageClass 对象来让用户选择,而不是创建 PersistentVolumes他们想要什么类型的 PersistentVolume。用户可以在他们的 PersistentVolumeClaims 中引用 StorageClass 并且配置者在配置持久存储时会考虑到这一点。

kubernetes 通过包含默认 StoregeClass 定义使其变得更简单。您不必像下面这样在 yaml 清单中指向 StorageClass

PVC yaml文件:

apiVersion: v1 
kind: PersistentVolumeClaim 
metadata:   
  name: postgresdb-pvc  
spec:   
  resources:
    requests:
      storage: 1Gi   
   accessModes:
    - ReadWriteOnce

此 PVC 定义仅包括存储大小请求和所需的访问模式,但不包括存储 class。创建 PVC 时,将使用任何标记为默认值的存储 class。

$ kubectl get pvc postgresdb-pvc

NAME            STATUS   VOLUME         CAPACITY   ACCESSMODES   STORAGECLASS
postgresdb-pvc  Bound    pvc-95a5ec12   1Gi        RWO           standard

$ kubectl get pv pvc-95a5ec12

NAME           CAPACITY  ACCESSMODES  RECLAIMPOLICY  STATUS    STORAGECLASS    
pvc-95a5ec12   1Gi       RWO          Delete         Bound     standard

这张图片来自Kubernetes In Action本书,完美总结了所有步骤。