我们可以在 k8s 中获得只有 PVC(没有 PV)的 Persistent Volume 吗?
Can we get Persistent Volume with only PVC (without PV) in k8s?
我刚刚在 postgres
容器中看到一个带有 PersistentVolumeClaim
和 volumeMounts
以及 volumes
和 persistentVolumeClaim
的 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 中提供以下信息
StorageClassName
请求的存储大小
访问模式
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 对象,但存储class 是集群范围内的 k8s 对象。所以当你没有在你的 pvc 中指定 storgaeclass 的名称时,你的 cluster.so 中总是有一个默认存储class,PV 将从默认存储class.
kubectl get sc,pvc,pv
会提供相关资料
实际上,
已经完成了
Dynamic provisioning of PersistentVolumes.
PersistentVolumes 和 PersistentVolumeClaims 使获得持久存储变得容易,开发人员无需处理底层使用的实际存储技术。但这仍然需要集群管理员预先 提供 实际存储。您认为,必须创建 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本书,完美总结了所有步骤。
我刚刚在 postgres
容器中看到一个带有 PersistentVolumeClaim
和 volumeMounts
以及 volumes
和 persistentVolumeClaim
的 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 中提供以下信息
StorageClassName
请求的存储大小
访问模式
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 对象,但存储class 是集群范围内的 k8s 对象。所以当你没有在你的 pvc 中指定 storgaeclass 的名称时,你的 cluster.so 中总是有一个默认存储class,PV 将从默认存储class.
kubectl get sc,pvc,pv
会提供相关资料
实际上,
已经完成了Dynamic provisioning of PersistentVolumes.
PersistentVolumes 和 PersistentVolumeClaims 使获得持久存储变得容易,开发人员无需处理底层使用的实际存储技术。但这仍然需要集群管理员预先 提供 实际存储。您认为,必须创建 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本书,完美总结了所有步骤。