Learn
Kubernetes/09-storage

存储

容器文件系统是临时的——Pod 一重建,里面的数据就没了。要在 Kubernetes 里保存数据(数据库、用户上传、日志),必须借助存储卷(Volume)。

1. Volume 的基本思路

Volume 是挂载进容器的目录,其生命周期由类型决定,不一定随容器删除而消失。Pod 里声明 volumes,再在容器里 volumeMounts 挂载。

2. emptyDir(临时共享盘)

emptyDir 在 Pod 被调度到节点时创建,Pod 删除即清空。适合同一 Pod 内多容器临时交换数据。

spec:
  containers:
    - name: app
      image: myapp:1.0
      volumeMounts:
        - name: cache
          mountPath: /cache
    - name: sidecar
      image: busybox
      volumeMounts:
        - name: cache
          mountPath: /cache
  volumes:
    - name: cache
      emptyDir: {}
ℹ️emptyDir 不跨 Pod

emptyDir 只在一个 Pod 内有效,Pod 重建即丢。真正要持久化请用下面的 PV/PVC。

3. PV 与 PVC:持久化的标准方式

  • PV(PersistentVolume):集群层面的"真实存储"(一块磁盘),由管理员或动态供给(StorageClass)创建。
  • PVC(PersistentVolumeClaim):用户对存储的"申请"("我要 10Gi 的读写盘")。k8s 自动把 PVC 绑定到一个合适的 PV。
# 1) 申请存储
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
---
# 2) Pod 挂载这个 PVC
apiVersion: v1
kind: Pod
metadata:
  name: db
spec:
  containers:
    - name: mysql
      image: mysql:8.0
      volumeMounts:
        - name: data
          mountPath: /var/lib/mysql
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: data-pvc
💡写 Pod 只认 PVC

应用开发者只管声明 PVC(要多大、什么模式),底层是本地盘还是云盘、怎么挂载,交给 PV/StorageClass。这种"解耦"让配置可移植。

4. 访问模式

模式含义
ReadWriteOnce单节点读写(最常见)
ReadOnlyMany多节点只读
ReadWriteMany多节点读写(需支持的存储,如 NFS)

5. 清理与回收

# 删除 Pod 后,PVC/PV 默认保留数据
kubectl delete pod db
 
# 删除 PVC 后,按 PV 的 reclaimPolicy 决定(Retain 保留 / Delete 删除)
kubectl delete pvc data-pvc
⚠️删 PVC 可能丢数据

默认 reclaimPolicy 若为 Delete,删 PVC 会连带删 PV 和数据。生产数据库务必确认是 Retain,并配合备份。

小结

  • 容器文件系统是临时的,数据要持久化必须挂载 Volume
  • emptyDir 随 Pod 生灭,适合临时共享
  • PV 是真实存储,PVC 是用户申请,Pod 挂载 PVC 即可持久化
  • 下一章学习标签、选择器与注解 →