PV、PVC、StorageClass
PV 与 PVC
Persistent Volume (PV)
PV 是实际的存储资源,可以是物理存储设备、云存储卷或网络存储资源。PV 代表集群中的一个可供使用的存储资源,它独立于 Pod 的生命周期。PV 由集群管理员进行创建和管理,然后供应用程序使用。PV 可以有不同的访问模式(读写一致性、只读、单独访问等)和存储类别(本地存储、网络存储等)。
Persistent Volume Claim (PVC)
PVC 是应用程序对持久性存储的请求。它类似于资源请求,但是针对的是存储资源而不是 CPU 或内存。应用程序通过创建 PVC 来请求特定的存储量、访问模式和存储类别。Kubernetes 控制器根据 PVC 的要求来动态分配对应的 PV。PVC 可以看作是应用程序对存储的“虚拟”请求,而 PV 则是实际的存储资源。
简而言之,PV 是实际的存储资源,而 PVC 是应用程序对存储资源的请求。通过这种方式,Kubernetes 提供了一个抽象层,使得应用程序可以独立于底层存储细节,从而更加灵活地管理和使用持久化存储。
查看 PV 的 yaml 文件,可以选择文件系统模式是本地存储还是远程存储以及读写模式等,此处配置hostPath
模式,就是 Pod 所在节点本机文件系统,PV 的主要目的是创建实际存储资源。
# cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: hostpath-pv
spec:
capacity:
storage: 1Gi
volumeMode: Filesystem # 文件系统模式
accessModes:
- ReadWriteOnce # 仅支持单节点读写
persistentVolumeReclaimPolicy: Retain # 保留数据
storageClassName: manual
hostPath:
path: /path/on/host # 指定本地节点上的路径
PVC 指定accessModes
与requests
,执行完成后它会自动匹配 PV,找到合适的后进行自动 Bond 工作,此时 Pod 就可以指定 PVC 实现挂在 Volume 功能。
# cat pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: hostpath-pvc
spec:
accessModes:
- ReadWriteOnce # 仅支持单节点读写
resources:
requests:
storage: 1Gi
storageClassName: manual
Pod 执行 PVC,因为使用的是 HostPath 模式,所以此时只有 Pod 所在 Node 节点才有文件存储,在使用 PV 时往往需要人工提前创建,在创建完成后才能够提供给 Pod 使用,所以就有了 StorageClass
# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pv-example-pod
spec:
containers:
- name: app-container
image: nginx # 替换为你想要的容器镜像
volumeMounts:
- name: pv-storage # 这个名称与下面的 volumes 中的名称一致
mountPath: /mnt/data # 容器内挂载路径
volumes:
- name: pv-storage # 这个名称与上面的 volumeMounts 中的名称一致
persistentVolumeClaim:
claimName: hostpath-pvc # 替换为你创建的 PVC 的名称
StorageClass
StorageClass 是 Kubernetes 中用于定义动态存储卷(Persistent Volume)的模板。它允许你在不同的存储提供商和存储类型之间抽象出统一的接口,使得应用程序可以在不关心底层存储细节的情况下请求存储资源。StorageClass 提供了动态卷分配的能力,这意味着在 PVC 创建时,Kubernetes 控制器会自动为你创建符合要求的 PV。
配置了 StorageClass 后,用户直接创建 PVC,StorageClass 会自动分配 PV 给 PVC 绑定,不需要管理员手动创建 PV
# cat pod.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-nfs
annotations:
volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Mi
---
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-container
image: busybox
command: ["/bin/sh", "-c"]
args: ["touch /mnt/SUCCESS && exit 0 || exit 1"]
volumeMounts:
- name: nfs-pvc
mountPath: "/mnt"
volumes:
- name: nfs-pvc
persistentVolumeClaim:
claimName: test-nfs