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-0、redis-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% 折扣。