k8s存储介绍(五)PV与PVC
在 Kubernetes(k8s)中,持久化存储(Persistent Storage)是一个非常重要的概念,因为 Pod 本身是无状态的,重启后会丢失数据。为了支持有状态应用,Kubernetes 提供了持久化存储的机制,主要包括 PV(Persistent Volume,持久卷)和 PVC(Persistent Volume Claim,持久卷声明)。
1. 什么是 PV 和 PVC?
PV(Persistent Volume,持久卷) Persistent Volume(PV)是由管理员创建的存储资源,它代表了集群中的实际存储,可以是本地存储、NFS、云存储(如 AWS EBS、Google Persistent Disk)等。PV 是集群级别的资源,不属于特定的命名空间。
PVC(Persistent Volume Claim,持久卷声明) Persistent Volume Claim(PVC)是用户(开发者或应用)请求存储资源的方式。PVC 代表了对存储的需求,比如存储大小、访问模式等。Kubernetes 通过 PVC 绑定到合适的 PV,以满足用户的需求。
2. PV 和 PVC 的工作流程
-
管理员创建 PV:管理员在集群中定义一个 PV,并指定存储类型、大小、访问模式等。
-
用户创建 PVC:应用程序需要存储时,用户创建 PVC,声明所需的存储资源。
-
Kubernetes 进行绑定:Kubernetes 根据 PVC 的请求寻找合适的 PV,并进行绑定。
-
Pod 挂载 PVC:Pod 使用 PVC 来挂载存储,应用程序可以像使用本地存储一样访问数据。
3. PV 的定义示例
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: standard
hostPath:
path: "/mnt/data"
字段解释:
-
capacity
:指定存储容量,如 10Gi。 -
accessModes
:访问模式,包括:-
ReadWriteOnce
(RWO):单个节点可读写。 -
ReadOnlyMany
(ROX):多个节点只读。 -
ReadWriteMany
(RWX):多个节点可读写。
-
-
persistentVolumeReclaimPolicy
:回收策略:-
Retain
(保留):PV 释放后数据仍然保留。 -
Recycle
(回收):简单删除数据。 -
Delete
(删除):PV 释放后删除存储。
-
-
storageClassName
:存储类,允许动态存储。 -
hostPath
:表示本地存储路径。
4. PVC 的定义示例
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: example-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: standard
字段解释:
-
accessModes
:指定访问模式。 -
resources.requests.storage
:请求的存储大小。 -
storageClassName
:必须与 PV 的存储类匹配。
5. 在 Pod 中使用 PVC
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: app-container
image: nginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: storage
volumes:
- name: storage
persistentVolumeClaim:
claimName: example-pvc
说明:
-
volumeMounts
:将 PVC 挂载到容器内的/usr/share/nginx/html
目录。 -
volumes
:引用example-pvc
作为存储。
6. PV 绑定 PVC 的过程
-
管理员创建 PV,它可以是静态的或动态分配的。
-
用户创建 PVC,请求特定存储大小和访问模式。
-
Kubernetes 绑定 PVC 到合适的 PV。
-
Pod 挂载 PVC,并可以访问存储数据。
7. 应用场景
-
数据库存储:MySQL、PostgreSQL、MongoDB 等数据库需要持久化存储,以防止数据丢失。
-
日志存储:应用日志需要持久化存储,以便分析和调试,即使 Pod 重新调度,日志仍然可用。
-
文件共享:多个 Pod 共享数据,如 NFS 或云存储,多个应用可同时访问相同数据。
-
机器学习:训练数据集通常很大,需要持久化存储,以供模型训练和分析。
-
CI/CD 持久化:在持续集成/持续部署(CI/CD)流程中,构建缓存或构件存储需要持久化数据。