【问题标题】:Can we get Persistent Volume with only PVC (without PV) in k8s?我们可以在 k8s 中获得只有 PVC(没有 PV)的 Persistent Volume 吗?
【发布时间】:2019-06-04 19:37:38
【问题描述】:

我刚刚在 postgres 容器中看到了带有 PersistentVolumeClaimvolumeMountsvolumes 的 Postgres 的 yaml 文件以及带有 persistentVolumeClaimpersistentVolumeClaim。我找不到任何定义的PersistentVolume

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

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

【问题讨论】:

    标签: kubernetes persistent-volumes persistent-volume-claims


    【解决方案1】:

    是的,没错,所以当您的集群使用 storage-classes 进行动态配置时,您只需提供 PVC ,配置程序将从 PVC 和 storageClass 获取相关信息,然后根据这些信息创建 PV。

    • PV 的供应动态发生

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

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

    1. 存储类名

    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 对象,但存储类位于集群范围的 k8s 对象中。所以你的集群中总是有一个默认的存储类。所以当你没有在你的 pvc 中指定存储类的名称时,PV 将从默认的存储类中提供。

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

    【讨论】:

      【解决方案2】:

      其实已经做到了

      持久卷的动态配置

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

      集群管理员可以部署一个PersistentVolume provisioner并定义一个或多个StorageClass对象,让用户选择什么类型的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 定义仅包括存储大小请求和所需的访问模式,但不包括存储类。创建 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
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-24
        • 2020-05-31
        • 1970-01-01
        • 1970-01-01
        • 2021-12-25
        相关资源
        最近更新 更多