在 Kubernetes 生态系统中,PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 是用于管理持久化存储的核心组件。它们使得应用程序的数据能够安全地保存并在容器重启或迁移时继续可用,极大地增强了系统的可靠性和灵活性。本文将深入探讨 PV 和 PVC 的概念、工作原理及其配置方法,帮助您更好地掌握这一关键技术。
什么是 PV 和 PVC?
PersistentVolume (PV)
PV 是集群中的某块存储资源,它可以由管理员提前创建好,并提供给用户使用。PV 的定义通常包含以下几个方面:
- 容量:指定该 PV 可用的存储空间大小。
- 访问模式:定义了 PV 支持的访问类型,例如
ReadWriteOnce
(只允许一个节点以读写方式挂载)、ReadOnlyMany
(允许多个节点以只读方式挂载)和ReadWriteMany
(允许多个节点以读写方式挂载)。 - 存储类:标识了 PV 所属的存储类别,默认为
default
。不同的存储类可以对应不同的后端存储解决方案。 - 回收策略:指定了当 PVC 被删除后如何处理 PV 中的数据,包括
Retain
(保留)、Recycle
(循环利用)和Delete
(删除)三种选项。
PersistentVolumeClaim (PVC)
PVC 是用户对存储资源的需求声明。它描述了应用程序所需的存储特性,如大小和访问模式等。一旦提交了一个 PVC 请求,Kubernetes 将根据这些需求自动寻找合适的 PV 进行绑定。如果找不到匹配的 PV,则会等待直到有符合条件的资源出现。通过这种方式,实现了存储资源的按需分配。
PV 和 PVC 的工作流程
理解 PV 和 PVC 的工作流程对于正确使用它们至关重要。一般来说,这个过程分为以下几个步骤:
- 创建 PV:集群管理员预先定义了一组 PV,每个 PV 都代表一块具体的存储资源,并设置了相应的属性。
- 创建 PVC:用户提交了一个 PVC 请求,指明了所需存储资源的具体要求。
- 绑定 PV 和 PVC:Kubernetes 控制器会尝试从现有的 PV 中找到一个与 PVC 匹配的资源,并建立两者之间的绑定关系。一旦绑定成功,该 PVC 就可以被 Pod 使用了。
- 使用 PVC:Pod 在启动时可以通过挂载 PVC 来访问其对应的存储资源。即使 Pod 重启或迁移,只要 PVC 存在,数据就不会丢失。
- 释放和回收:当不再需要某个 PVC 时,用户可以选择将其删除。此时,根据 PV 的回收策略,数据可能会被保留、清理或者直接删除,以便其他 PVC 可以再次使用这块存储资源。
实战演练
接下来我们将通过几个实际的例子来展示如何使用 PV 和 PVC 管理 Kubernetes 中的持久化存储。
创建静态 PV
假设我们有一个 NFS 服务器作为后端存储,现在要为 Kubernetes 创建一块名为 pv0003
的 PV,容量为 5GiB,并支持单个节点以读写方式挂载。首先,编辑一个名为 pv.yaml
的 YAML 文件:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0003
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
nfs:
server: 172.17.0.2
path: "/exports"
persistentVolumeReclaimPolicy: Retain
然后使用 kubectl apply
命令将其应用于集群:
kubectl apply -f pv.yaml
这段代码将在集群中创建一个名为 pv0003
的 PV,它指向 NFS 服务器上的 /exports
目录,并且设置了回收策略为 Retain
,即当 PVC 被删除时,PV 不会被自动清理。
动态创建 PV
除了静态创建 PV 外,Kubernetes 还支持动态供应机制。这意味着当用户提交了一个 PVC 请求但没有找到合适的 PV 时,Kubernetes 可以根据预定义的存储类自动创建新的 PV。为了启用这一功能,我们需要先定义一个 StorageClass:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
在这个例子中,我们定义了一个名为 fast
的 StorageClass,它使用 AWS EBS 作为后端存储,并设置了默认的回收策略为 Delete
。此外,volumeBindingMode
字段确保了 PV 的创建是在 Pod 实际调度到节点之后才进行的,从而避免了潜在的冲突问题。
创建 PVC 并绑定到 PV
现在我们可以创建一个 PVC,请求 3GiB 的存储空间并支持单个节点以读写方式挂载。编辑一个名为 pvc.yaml
的 YAML 文件:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
storageClassName: "fast" # 如果使用的是动态供应,这里指定存储类名称
应用此配置:
kubectl apply -f pvc.yaml
根据是否启用了动态供应,Kubernetes 会尝试找到一个已存在的 PV 或者创建一个新的 PV 来满足这个 PVC 的需求。
使用 PVC 在 Pod 中挂载存储
最后一步是修改 Pod 配置以使用新创建的 PVC。假设我们要部署一个 Nginx 应用程序,并让它使用上述 PVC 来保存静态文件。编辑一个名为 nginx-pod.yaml
的 YAML 文件:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.14.2
volumeMounts:
- mountPath: /usr/share/nginx/html/data
name: data-volume
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: myclaim
再次应用这些配置:
kubectl apply -f nginx-pod.yaml
现在,Nginx Pod 将使用我们刚刚创建的 PVC 对应的持久化存储来保存静态文件。即使 Pod 重启或迁移,这些数据也不会丢失。
注意事项
尽管 PV 和 PVC 提供了很多好处,但在实际应用中也需要注意一些问题:
- 存储类的选择:不同类型的存储类可能具有不同的性能特征和成本结构。因此,在选择存储类之前,请务必评估您的应用需求和技术栈特点。
- 回收策略的影响:不同的回收策略会对数据的安全性和资源利用率产生影响。请根据实际情况谨慎选择。
- 权限管理:确保只有授权用户才能创建和管理 PV/PVC,以防止滥用存储资源。
- 监控和维护:定期检查 PV 和 PVC 的状态,及时处理异常情况,如未绑定的 PVC 或者无法使用的 PV。
结语
感谢您的阅读!如果您对 PV/PVC 或 Kubernetes 有任何疑问或见解,欢迎继续探讨。