【问题标题】:Can we get Persistent Volume with only PVC (without PV) in k8s?我们可以在 k8s 中获得只有 PVC(没有 PV)的 Persistent Volume 吗?
【发布时间】:2019-06-04 19:37:38
【问题描述】:
我刚刚在 postgres 容器中看到了带有 PersistentVolumeClaim 和 volumeMounts 和 volumes 的 Postgres 的 yaml 文件以及带有 persistentVolumeClaim 的 persistentVolumeClaim。我找不到任何定义的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 中提供以下信息
存储类名
请求的存储大小
访问模式
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: task-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
在 StorageClass 中您提供以下信息
供应商
其他信息
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】:
其实已经做到了
持久卷的动态配置。
PersistentVolumes 和 PersistentVolumeClaims 让开发人员无需处理底层使用的实际存储技术即可轻松获得持久存储。但这仍然需要集群管理员预先提供实际存储。您认为,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书,总结了所有步骤,完美。