存储

Kubernetes 存储系统为 Pod 提供持久化存储能力,允许数据在 Pod 生命周期之外独立存在。K8s 提供了多种存储抽象,包括 Volume、PersistentVolume (PV)、PersistentVolumeClaim (PVC) 和 StorageClass。

存储架构关系
graph TD
    subgraph "应用层"
        P[Pod]
        C[Container]
    end
    
    subgraph "K8s 存储抽象层"
        V[Volume]
        PVC[PersistentVolumeClaim]
        PV[PersistentVolume]
    end
    
    subgraph "存储提供层"
        SC[StorageClass]
        St[底层存储
NFS/EBS/Ceph等] end P --> V V --> PVC PVC --> PV PV --> SC SC --> St
Volume 类型
emptyDir

特点:Pod 创建时创建,Pod 删除时自动删除,生命周期与 Pod 相同。

用途:临时存储、缓存、Pod 内容器间共享数据。

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - name: container1
    image: nginx
    volumeMounts:
      - name: cache-volume
        mountPath: /cache
  volumes:
  - name: cache-volume
    emptyDir: {}
hostPath

特点:将节点上的文件或目录挂载到 Pod 中,仅适用于单节点测试。

用途:访问节点上的文件系统、调试、单节点测试。

volumes:
- name: host-volume
  hostPath:
    path: /data
    type: Directory
持久化存储

特点:包括 NFS、iSCSI、云存储(AWS EBS、GCE PD、Azure Disk)等。

用途:生产环境中的持久化数据存储。

volumes:
- name: nfs-volume
  nfs:
    server: nfs-server.example.com
    path: /share
configMap/Secret

特点:将配置数据和敏感信息作为存储卷挂载到 Pod 中。

用途:配置管理、密钥管理。

volumes:
- name: config-volume
  configMap:
    name: app-config
PV/PVC 详解
PersistentVolume (PV)

集群中的存储资源,由管理员预配置或通过 StorageClass 动态创建。

  • 集群级别资源
  • 独立于 Pod 生命周期
  • 支持多种存储后端
  • 定义存储容量、访问模式
PersistentVolumeClaim (PVC)

用户对存储资源的请求,绑定到合适的 PV 上。

  • 命名空间级别资源
  • 定义存储需求
  • 与 PV 进行动态绑定
  • Pod 通过 PVC 使用存储
PV/PVC 工作流程
sequenceDiagram
    participant Dev as 开发者
    participant K8s as Kubernetes
    participant Storage as 存储系统
    
    Dev->>K8s: 创建 PVC (请求 10GB)
    K8s->>Storage: 寻找匹配的 PV
    Storage-->>K8s: 返回可用 PV
    K8s->>K8s: 绑定 PVC 到 PV
    K8s-->>Dev: PVC 绑定成功
    Dev->>K8s: 创建 Pod 使用 PVC
    K8s->>Storage: 挂载存储到 Pod
                                
存储访问模式
访问模式缩写说明适用场景
ReadWriteOnceRWO单节点读写单节点应用,如数据库
ReadOnlyManyROX多节点只读配置文件、静态资源
ReadWriteManyRWX多节点读写共享文件系统
ReadWriteOncePodRWOP单 Pod 读写确保只有一个 Pod 访问
StorageClass 详解

StorageClass 定义了存储的类型和供应策略,支持动态 PV 创建。

# 创建 StorageClass 示例
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
reclaimPolicy: Retain
allowVolumeExpansion: true
mountOptions:
  - debug
# 使用 StorageClass 的 PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi
  storageClassName: fast-ssd
存储最佳实践
实践建议原因
选择合适的存储类型 根据应用需求选择 Volume、PVC 或其他存储方案 避免性能瓶颈和数据丢失风险
配置存储资源请求 明确指定存储容量和访问模式 确保应用有足够的存储空间
设置合理的回收策略 Retain、Delete 或 Recycle 避免重要数据被意外删除
使用 StorageClass 实现动态存储供应 提高存储管理的灵活性和自动化程度
常用存储命令
# 查看 PV
kubectl get pv
# 查看 PVC
kubectl get pvc -n <namespace>
# 查看 StorageClass
kubectl get storageclass
# 查看存储使用情况
kubectl describe pvc <pvc-name>
# 动态创建 PV
kubectl apply -f pvc.yaml