第6课:存储卷和持久化存储
掌握Kubernetes中的存储管理和持久化数据方案
🎯 学习目标
- 理解存储卷的概念和作用
- 掌握不同类型存储卷的特点和应用场景
- 学习持久化存储的实现方式
- 了解StorageClass和动态存储供应
- 掌握存储管理的最佳实践和性能优化
6.1 存储卷基础
🎯 为什么需要存储卷?
在Kubernetes中,容器的文件系统是临时的,当容器重启或销毁时,数据会丢失。存储卷(Volume)提供了持久化存储的能力,解决了以下问题:
- 数据持久化:容器重启后数据不丢失
- 数据共享:多个容器之间共享数据
- 外部存储:使用集群外部的存储系统
- 状态管理:为有状态应用提供稳定存储
🏗️ 存储卷架构图
存储卷与Pod生命周期绑定,为容器提供持久化存储能力
6.2 存储卷类型详解
📦 基础存储卷类型
💾 emptyDir
临时存储卷,与Pod生命周期相同,适用于临时数据和容器间共享。
# emptyDir示例
volumes:
- name: temp-volume
emptyDir: {}
🖥️ hostPath
挂载节点上的文件或目录,适用于需要访问节点文件系统的场景。
# hostPath示例
volumes:
- name: host-volume
hostPath:
path: /data
type: Directory
🌐 nfs
挂载NFS共享目录,适用于需要网络共享存储的场景。
# nfs示例
volumes:
- name: nfs-volume
nfs:
server: nfs-server
path: /shared
☁️ 云存储卷类型
🔷 awsElasticBlockStore
AWS EBS卷,适用于AWS云环境。
🟢 gcePersistentDisk
GCP持久磁盘,适用于GCP云环境。
🔵 azureDisk
Azure磁盘,适用于Azure云环境。
💾 持久化存储卷
🔍 什么是持久卷(PV)?
持久卷(PersistentVolume,PV)是集群级别的存储资源,由管理员创建和管理,独立于Pod的生命周期。
🔍 什么是持久卷声明(PVC)?
持久卷声明(PersistentVolumeClaim,PVC)是用户对存储资源的请求,类似于Pod对计算资源的请求。
6.3 持久化存储实现
📋 持久卷(PV)配置
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-example
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
- ReadOnlyMany
persistentVolumeReclaimPolicy: Retain
storageClassName: standard
hostPath:
path: /mnt/data
📋 持久卷声明(PVC)配置
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-example
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: standard
🔧 Pod使用PVC
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: nginx
volumeMounts:
- name: app-storage
mountPath: /usr/share/nginx/html
volumes:
- name: app-storage
persistentVolumeClaim:
claimName: pvc-example
6.4 StorageClass和动态存储供应
🎯 什么是StorageClass?
StorageClass定义了存储资源的类型和供应方式,支持动态创建PV,无需管理员手动创建。
📋 StorageClass配置
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
encrypted: "true"
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- debug
volumeBindingMode: Immediate
6.5 存储访问模式
🔄 存储访问模式说明
| 访问模式 |
说明 |
适用场景 |
| ReadWriteOnce (RWO) |
只能被一个节点以读写方式挂载 |
单节点应用 |
| ReadOnlyMany (ROX) |
可以被多个节点以只读方式挂载 |
共享配置文件 |
| ReadWriteMany (RWX) |
可以被多个节点以读写方式挂载 |
多节点共享存储 |
| ReadWriteOncePod (RWOP) |
只能被一个Pod以读写方式挂载 |
需要独占存储的Pod |
6.6 实战操作示例
# 1. 创建持久卷
cat > pv.yaml << EOF
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-example
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /mnt/data
storageClassName: standard
EOF
kubectl apply -f pv.yaml
# 2. 创建持久卷声明
cat > pvc.yaml << EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-example
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: standard
EOF
kubectl apply -f pvc.yaml
# 3. 创建使用PVC的Pod
cat > pod.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: nginx
volumeMounts:
- name: app-storage
mountPath: /usr/share/nginx/html
volumes:
- name: app-storage
persistentVolumeClaim:
claimName: pvc-example
EOF
kubectl apply -f pod.yaml
# 4. 验证存储
kubectl exec app-pod -- touch /usr/share/nginx/html/test.txt
kubectl exec app-pod -- echo "Hello from persistent storage" > /usr/share/nginx/html/index.html
# 5. 测试持久化
kubectl delete pod app-pod
kubectl apply -f pod.yaml
kubectl exec app-pod -- cat /usr/share/nginx/html/index.html
# 6. 清理
kubectl delete pod app-pod
kubectl delete pvc pvc-example
kubectl delete pv pv-example
# 7. 使用StorageClass动态创建
cat > storageclass.yaml << EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
EOF
kubectl apply -f storageclass.yaml
6.7 存储最佳实践
💡 存储选择建议
- 临时数据:使用emptyDir或memory存储卷
- 配置文件:使用ConfigMap或hostPath
- 持久数据:使用PV/PVC和合适的存储后端
- 数据库:使用支持RWO的持久化存储
- 共享存储:使用支持RWX的存储系统(如NFS、GlusterFS)
⚡ 性能优化建议
- 选择合适的存储类型:根据应用性能需求选择存储系统
- 合理配置存储大小:避免过度分配存储资源
- 使用本地存储:对性能要求高的应用使用local存储卷
- 配置存储QoS:为不同应用设置合适的存储性能参数
- 监控存储使用:定期检查存储使用情况,避免空间不足
⚠️ 注意事项
- 存储卷生命周期:PV的生命周期独立于Pod,需要手动管理
- 存储兼容性:不同存储系统的访问模式和性能特性不同
- 备份策略:建立定期备份机制,防止数据丢失
- 安全考虑:敏感数据存储需要加密和访问控制
- 跨节点存储:确保存储系统支持跨节点访问(如需要)
6.8 进阶存储概念
🚀 分布式存储系统
- GlusterFS:开源分布式文件系统,支持高可用性和横向扩展
- Ceph:统一存储系统,支持对象存储、块存储和文件系统
- Longhorn:Kubernetes原生的分布式块存储系统
- OpenEBS:基于容器的存储解决方案,专为Kubernetes设计
🔧 存储操作工具
- kubectl cp:在Pod和本地之间复制文件
- CSI(Container Storage Interface):容器存储接口,标准化存储插件
- 存储运营商(Storage Operators):自动化存储系统的部署和管理