<返回目录     Powered by claud/xia兄

第6课:存储卷和持久化存储

掌握Kubernetes中的存储管理和持久化数据方案

🎯 学习目标

6.1 存储卷基础

🎯 为什么需要存储卷?

在Kubernetes中,容器的文件系统是临时的,当容器重启或销毁时,数据会丢失。存储卷(Volume)提供了持久化存储的能力,解决了以下问题:

🏗️ 存储卷架构图

Pod
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 存储最佳实践

💡 存储选择建议

⚡ 性能优化建议

⚠️ 注意事项

6.8 进阶存储概念

🚀 分布式存储系统

🔧 存储操作工具