Kubernetes 持久化存储 PVC 配置

Kubernetes 中的 Pod 默认是无状态的,容器重启后数据会丢失。对于数据库、文件存储等有状态应用,需要使用持久化存储(Persistent Storage)来保证数据安全。本文将详细讲解 Kubernetes 的存储体系,包括 PV、PVC、StorageClass 的配置和使用。

一、存储核心概念

  • PersistentVolume (PV):集群中的一块存储资源,由管理员预先创建或由 StorageClass 动态创建。
  • PersistentVolumeClaim (PVC):用户对存储资源的请求,类似于 Pod 对计算资源的请求。
  • StorageClass:定义存储类型和动态供给策略,实现自动创建 PV。
  • 访问模式:ReadWriteOnce (RWO)、ReadOnlyMany (ROX)、ReadWriteMany (RWX)。

二、本地存储(Local Path)

最简单的存储方案,适合单节点的搬瓦工 VPS 环境。

2.1 使用 hostPath

apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  hostPath:
    path: /data/k8s-storage
    type: DirectoryOrCreate

2.2 创建 PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: app-data
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 5Gi

2.3 在 Pod 中使用

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "your_password"
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
        resources:
          requests:
            memory: "256Mi"
            cpu: "250m"
      volumes:
      - name: mysql-data
        persistentVolumeClaim:
          claimName: app-data

三、K3S 本地路径存储

K3S 内置了 Local Path Provisioner,支持动态创建本地 PV:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: app-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-path
  resources:
    requests:
      storage: 5Gi

K3S 会自动在 /var/lib/rancher/k3s/storage/ 下创建对应目录。

四、NFS 存储

NFS 支持多节点同时读写(RWX),适合多副本应用共享数据。

4.1 安装 NFS Server

apt install nfs-kernel-server -y

mkdir -p /data/nfs-share
chown nobody:nogroup /data/nfs-share

echo "/data/nfs-share *(rw,sync,no_subtree_check,no_root_squash)" >> /etc/exports
exportfs -ra
systemctl restart nfs-kernel-server

4.2 安装 NFS CSI Driver

helm repo add csi-driver-nfs https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts
helm install csi-driver-nfs csi-driver-nfs/csi-driver-nfs \
  --namespace kube-system

4.3 创建 StorageClass

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-csi
provisioner: nfs.csi.k8s.io
parameters:
  server: NFS_SERVER_IP
  share: /data/nfs-share
reclaimPolicy: Retain
volumeBindingMode: Immediate

4.4 使用 NFS StorageClass

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nfs-csi
  resources:
    requests:
      storage: 10Gi

五、StatefulSet 与存储

StatefulSet 为每个 Pod 副本自动创建独立的 PVC:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
spec:
  serviceName: redis
  replicas: 3
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: redis:7-alpine
        volumeMounts:
        - name: redis-data
          mountPath: /data
  volumeClaimTemplates:
  - metadata:
      name: redis-data
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: local-path
      resources:
        requests:
          storage: 1Gi

每个 Redis 副本会自动获得独立的 PVC:redis-data-redis-0redis-data-redis-1 等。

六、存储管理命令

# 查看 PV
kubectl get pv

# 查看 PVC
kubectl get pvc
kubectl get pvc -A

# 查看 StorageClass
kubectl get storageclass

# 查看 PVC 详情
kubectl describe pvc app-data

# 删除 PVC(会根据 reclaimPolicy 处理 PV)
kubectl delete pvc app-data

七、回收策略

  • Retain:PVC 删除后保留 PV 和数据,需手动清理。最安全。
  • Delete:PVC 删除后自动删除 PV 和数据。
  • Recycle(已弃用):执行 rm -rf /thevolume/* 后复用。

生产环境强烈建议使用 Retain 策略防止数据意外丢失。

八、常见问题

PVC 一直 Pending

kubectl describe pvc app-data

常见原因:没有匹配的 PV、StorageClass 不存在、或存储资源不足。

Pod 无法挂载存储

kubectl describe pod mysql-xxx
kubectl get events --sort-by='.lastTimestamp'

NFS 挂载超时

确保 NFS 服务器端口已开放,客户端安装了 NFS 工具:

apt install nfs-common -y

总结

持久化存储是 Kubernetes 有状态应用的基础。在搬瓦工 VPS 上,单节点可以使用 hostPath 或 K3S 的 Local Path,多节点则推荐 NFS 方案。配合 Deployment 策略RBAC 权限 可以构建安全可靠的应用环境。选购搬瓦工 VPS 请参考 全部方案,使用优惠码 NODESEEK2026 享受 6.77% 折扣。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。