K8s 持久化存储:PV 与 PVC 配置指南

K8s 持久化存储:PV 与 PVC 配置指南

【免费下载链接】advanced-java 😮 Core Interview Questions & Answers For Experienced Java(Backend) Developers | 互联网 Java 工程师进阶知识完全扫盲:涵盖高并发、分布式、高可用、微服务、海量数据处理等领域知识 【免费下载链接】advanced-java 项目地址: https://gitcode.com/doocs/advanced-java

1. 持久化存储痛点与解决方案

你是否还在为 K8s 容器重启后数据丢失而烦恼?是否在集群迁移时因存储配置不兼容而焦头烂额?本文将系统讲解 Kubernetes(K8s)持久化存储核心组件 PV(Persistent Volume,持久卷)与 PVC(Persistent Volume Claim,持久卷声明)的设计原理与实战配置,读完你将掌握:

  • PV/PVC 的生命周期管理与权限隔离机制
  • 5 种存储类型的 PV 配置案例(本地存储/云存储/NFS/Ceph)
  • 动态供应与 StorageClass 的自动化配置
  • 生产环境中的存储性能优化与故障排查

1.1 容器存储困境

容器的临时性带来三大存储挑战:

痛点场景传统解决方案PV/PVC 优势
数据持久化宿主机绑定挂载集群级资源管理,跨节点迁移
存储隔离手动分配存储路径声明式 API,基于角色的权限控制
环境一致性脚本维护存储配置存储类标准化,环境无关部署

mermaid

2. PV 与 PVC 核心概念

2.1 核心组件关系

PV 是集群级别的存储资源,由管理员配置;PVC 是用户对存储资源的请求,两者通过标签选择器绑定:

mermaid

2.2 生命周期管理

PV 完整生命周期包含 5 个阶段:

mermaid

3. PV 静态配置实战

3.1 NFS 类型 PV

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv-10g
  labels:
    storage: nfs
    env: production
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany  # 多节点读写
  persistentVolumeReclaimPolicy: Retain  # 保留数据
  storageClassName: slow
  nfs:
    path: /data/k8s/nfs
    server: 192.168.1.100
    readOnly: false

3.2 本地存储 PV

apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv-50g
spec:
  capacity:
    storage: 50Gi
  accessModes:
    - ReadWriteOnce  # 单节点读写
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /mnt/disks/sdb1
  nodeAffinity:  # 节点亲和性
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - node-01

3.3 云存储 PV(AWS EBS)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: aws-ebs-pv-20g
spec:
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: gp2
  awsElasticBlockStore:
    volumeID: aws://us-west-2a/vol-0abcdef1234567890
    fsType: ext4

4. PVC 声明与使用

4.1 基础 PVC 定义

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: app-data-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: slow
  selector:
    matchLabels:
      storage: nfs

4.2 工作负载挂载 PVC

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment
spec:
  replicas: 1
  template:
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        volumeMounts:
        - name: data-volume
          mountPath: /var/lib/mysql
      volumes:
      - name: data-volume
        persistentVolumeClaim:
          claimName: app-data-pvc

5. 动态存储供应

5.1 StorageClass 配置

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp3
  iopsPerGB: "100"
  fsType: ext4
reclaimPolicy: Delete
allowVolumeExpansion: true

5.2 动态 PVC 创建

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: dynamic-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: fast  # 关联 StorageClass

6. 生产环境最佳实践

6.1 存储性能调优

优化方向实施方法
IO 隔离使用 StorageClass 区分高性能/普通存储
缓存策略配置 volumeDevices 的 readOnly 属性
卷扩展启用 allowVolumeExpansion: true
监控告警配置 Prometheus 规则监控 PV 使用率

6.2 故障排查流程

mermaid

6.3 安全加固

  1. 使用 RBAC 限制 PVC 创建权限
  2. 配置 PV 目录权限 fsGroup: 1000
  3. 敏感数据使用加密存储类(如 AWS KMS)

7. 总结与展望

PV/PVC 通过"两层抽象"实现了存储资源的解耦管理:管理员专注于 PV 基础设施配置,开发者通过 PVC 声明存储需求。随着 K8s 存储技术发展,CSI(容器存储接口)逐渐成为主流,未来将提供更丰富的存储服务集成。

建议收藏本文作为速查手册,关注项目 https://gitcode.com/doocs/advanced-java 获取更多云原生技术实践。欢迎在评论区分享你的存储配置经验!

【免费下载链接】advanced-java 😮 Core Interview Questions & Answers For Experienced Java(Backend) Developers | 互联网 Java 工程师进阶知识完全扫盲:涵盖高并发、分布式、高可用、微服务、海量数据处理等领域知识 【免费下载链接】advanced-java 项目地址: https://gitcode.com/doocs/advanced-java

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值