【Kubernetes】Kubernetes 如何管理存储?PV 和 PVC 是如何工作的?
在 Kubernetes 中,存储管理是通过 Persistent Volume (PV) 和 Persistent Volume Claim (PVC) 来实现的。
- 它们为容器化应用提供持久化存储,使得应用在重启或重新调度时仍然能够访问数据。
1. 存储管理概述
Kubernetes 的存储管理是基于 持久化卷 (Persistent Volume) 和 持久化卷声明 (Persistent Volume Claim) 的模型。这个模型将存储的生命周期与 Pod 的生命周期分开,允许存储资源在 Pod 之间共享和复用。
-
Persistent Volume (PV):代表集群中的存储资源。它是由集群管理员预先配置的存储资源。PV 可以是本地磁盘、NFS、iSCSI、云存储(如 AWS EBS、Google Cloud Persistent Disk 等)等多种类型。
-
Persistent Volume Claim (PVC):是用户对存储的请求,声明了需要多少存储空间、访问模式等。Pod 使用 PVC 来请求存储资源,Kubernetes 会根据 PVC 的要求动态地绑定到合适的 PV 上。
-
StorageClass:在某些存储后端(如云提供商的块存储)中,可以使用
StorageClass
来动态创建 PV。当 PVC 被创建时,如果没有指定具体的 PV,Kubernetes 会根据 PVC 的要求和StorageClass
动态地为 PVC 创建合适的 PV。
2. PV 和 PVC 的工作原理
1. Persistent Volume (PV)
PV 是集群中的存储资源。集群管理员预先配置和创建 PV,通常在 YAML 配置文件中定义。PV 的配置包含以下信息:
- 存储的容量
- 存储类型(如 NFS、iSCSI、云块存储)
- 访问模式(ReadWriteOnce、ReadOnlyMany、ReadWriteMany)
- 绑定方式(静态绑定或动态绑定)
例如,创建一个 NFS 类型的 PV:
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs-storage
nfs:
path: /mnt/data
server: nfs-server.example.com
- capacity:定义了 PV 的存储容量(如
5Gi
)。 - accessModes:定义了 PV 的访问模式,通常有:
ReadWriteOnce (RWO)
:只能由一个节点以读写方式挂载。ReadOnlyMany (ROX)
:可以由多个节点以只读方式挂载。ReadWriteMany (RWX)
:可以由多个节点以读写方式挂载。
- persistentVolumeReclaimPolicy:定义 PV 被释放后如何处理,常见的选项有:
Retain
:保留 PV,等待管理员手动处理。Recycle
:回收 PV。Delete
:删除 PV。
- nfs:定义了 NFS 类型的存储服务器和路径。
2. Persistent Volume Claim (PVC)
PVC 是用户对存储的请求,指定了所需的存储容量、访问模式等。PVC 是 Pod 中存储卷的需求,Kubernetes 根据 PVC 的请求动态绑定到合适的 PV。
例如,创建一个 PVC 请求 5Gi 的存储空间:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: nfs-storage
- accessModes:指定存储卷的访问模式,必须与 PV 的访问模式兼容。
- resources.requests.storage:指定 PVC 请求的存储容量。
- storageClassName:指定存储类,如果没有明确指定,Kubernetes 将使用默认的存储类(如果有的话)。
3. PVC 与 PV 的绑定
当 PVC 被创建时,Kubernetes 会尝试找到一个满足以下条件的 PV:
- 存储容量足够。
- 存储类型与 PVC 请求的类型匹配。
- 访问模式与 PVC 请求的访问模式匹配。
如果满足条件,Kubernetes 会将 PVC 与 PV 进行绑定。这个绑定是 动态的,并且一旦绑定,PVC 就会引用该 PV,直到 PVC 被删除或释放。
4. StorageClass 和动态卷供应
如果没有预先配置 PV,Kubernetes 可以使用 StorageClass 来动态创建 PV。StorageClass
定义了存储提供商和存储类型的信息。通过定义不同的 StorageClass
,用户可以请求不同类型的存储(如云存储或本地存储)。
例如,创建一个 StorageClass 来使用 AWS EBS 存储:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-storage
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
当 PVC 被创建时,如果指定了 StorageClass
,Kubernetes 会根据该 StorageClass
动态创建 PV,并将 PVC 绑定到该 PV 上。
5. Pod 使用 PVC
一旦 PVC 被绑定到 PV,Pod 就可以使用 PVC 来访问存储。Pod 使用 PVC 作为存储卷的引用,通过在 spec.volumes
中挂载 PVC:
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: my-container
image: my-image
volumeMounts:
- mountPath: /data
name: my-storage
volumes:
- name: my-storage
persistentVolumeClaim:
claimName: my-pvc
在这个示例中,Pod 使用 my-pvc
PVC 来挂载存储卷,容器可以通过 /data
路径访问存储。
3. PV 和 PVC 的生命周期
- PV 生命周期:PV 是由管理员预先创建的,可以通过静态或动态方式绑定到 PVC。一旦 PVC 被删除,PV 会进入释放状态(根据 PV 的
persistentVolumeReclaimPolicy
决定是否删除或保留)。 - PVC 生命周期:PVC 是由用户创建的,它表示存储的需求。PVC 的生命周期由 Pod 的生命周期决定,Pod 删除时,PVC 也会被删除(除非手动删除 PVC)。
4. 总结
- Persistent Volume (PV) 是 Kubernetes 集群中的存储资源,它可以是多种类型的存储后端(如 NFS、云存储等)。
- Persistent Volume Claim (PVC) 是用户请求存储的资源,Kubernetes 会根据 PVC 来绑定适当的 PV。
- StorageClass 可以用于动态创建 PV,允许用户根据不同的存储需求动态请求存储。
- 通过 PV 和 PVC,Kubernetes 提供了一种灵活且持久的存储方式,使得容器化应用在重启或重新调度时能够持续访问数据。
https://github.com/0voice