存储与持久卷
理解 PV、PVC、StorageClass 的关系
掌握持久卷的创建与使用
区分有状态和无状态存储
核心讲解
Pod 是临时的,数据不能存在容器里,需要持久化存储系统来管理数据。
(1)核心概念
PV(PersistentVolume):持久卷,集群里的一块存储资源,由管理员创建,或者动态供给
PVC(PersistentVolumeClaim):用户的存储申请,声明要多大、什么类型,系统自动匹配 PV
StorageClass:存储类,定义存储类型、动态供给 PV,不用手动创建 PV
(2)三种访问模式
ReadWriteOnce:单节点读写,最常用ReadOnlyMany:多节点只读ReadWriteMany:多节点读写,需要特定存储支持
(3)回收策略
Retain:保留,手动回收
Delete:删除,PVC 删了 PV 也删
Recycle:回收再利用,基本不用了
(4)动态供给
配置 StorageClass 后,创建 PVC 自动创建对应 PV,不用管理员手动建 PV,生产环境标准方案。
操作示例
# pvc-demo.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: standard
# 挂载使用
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-data
spec:
replicas: 1
selector:
matchLabels:
app: nginx-data
template:
metadata:
labels:
app: nginx-data
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: data
mountPath: /usr/share/nginx/html
volumes:
- name: data
persistentVolumeClaim:
claimName: data-pvc
# 创建 PVC
kubectl apply -f pvc-demo.yaml
# 查看 PV 和 PVC 绑定
kubectl get pv
kubectl get pvc
# 创建挂载的部署
kubectl apply -f nginx-data.yaml
# 验证数据持久化
# 进入容器写文件,删除重建Pod,再进去看数据还在不在
常见误区
PVC 就是存储本身:PVC 是申请单,真正存储的是 PV
PV 和 PVC 一一对应:一个 PV 只能绑定一个 PVC,绑定后就专属了
Deployment 挂载了就是有状态:Deployment 挂载存储也只能单副本读写,多副本会冲突,有状态要用 StatefulSet
删除 PVC 数据就没了:取决于回收策略,Retain 的话 PV 还在,数据还在
课后练习
创建一个 1G 的 PVC
在 Deployment 中挂载这个 PVC
测试数据持久化:写文件,删 Pod,重建验证数据还在
说明 PV、PVC、StorageClass 三者的关系
