我们可以在 k8s 中仅使用 PVC(没有 PV)获得 Persistent Volume 吗?

inj*_*joy 3 kubernetes persistent-volumes persistent-volume-claims

我刚才看到Postgres的YAML文件与PersistentVolumeClaimvolumeMountsvolumespersistentVolumeClaimpostgres容器中。我找不到任何PersistentVolume定义。

但是,当postgres容器 pod 被启动时,我可以看到与 yaml 文件中定义的 PersistentVolume绑定persistentVolumeClaim

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

fgu*_*gul 12

事实上,它已经由

PersistentVolume 的动态配置

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

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

kubernetes 通过包含默认的StoregeClass定义使其变得更加简单。您不必在 yaml 清单中指向 StorageClass,如下所示:

PVC yaml 文件:

apiVersion: v1 
kind: PersistentVolumeClaim 
metadata:   
  name: postgresdb-pvc  
spec:   
  resources:
    requests:
      storage: 1Gi   
   accessModes:
    - ReadWriteOnce
Run Code Online (Sandbox Code Playgroud)

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

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

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

在此输入图像描述


Sur*_*noi 8

是的,这是正确的,所以当您的集群具有存储类的动态配置时, 您只需要提供PVC,配置器将从 PVC 和 storageClass 获取相关信息,然后根据这些信息创建 PV。

  • PV 的供应是动态发生的

    当管理员创建的静态 PV 都与用户的 PersistentVolumeClaim 不匹配时,集群可能会尝试专门为 PVC 动态配置卷。此供应基于 StorageClasses:PVC 必须请求存储类,并且管理员必须已创建并配置该类才能进行动态供应。 动态供应

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

  1. 存储类名

  2. 请求的存储大小

  3. 访问模式

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: task-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
Run Code Online (Sandbox Code Playgroud)

在 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
Run Code Online (Sandbox Code Playgroud)
  • PVC 是一个命名空间范围的 kubernetes 对象,但在集群范围的 k8s 对象中是存储类。所以你的集群中总是有一个默认的存储类。所以当你没有在你的 pvc 中指定 storgae 类的名称时,PV 将从默认的存储类中提供。

kubectl get sc,pvc,pv 将提供相关信息