Skip to content

01 - K8s 存储体系

存储全景

┌──────────────────────────────────────────────────────────┐
│                  K8s 存储架构                              │
│                                                          │
│  Pod                                                     │
│  ├── emptyDir (临时卷)                                    │
│  ├── hostPath (节点路径)                                   │
│  └── persistentVolumeClaim (持久存储)                      │
│          │                                               │
│          ▼                                               │
│  PersistentVolumeClaim (PVC) ← 用户视角:我要多大的存储     │
│          │                                               │
│          ▼ 绑定                                          │
│  PersistentVolume (PV) ← 管理员视角:实际的存储资源         │
│          │                                               │
│          ▼                                               │
│  实际存储后端                                              │
│  ├── 本地磁盘                                             │
│  ├── NFS                                                 │
│  ├── 云盘 (阿里云 EBS / AWS EBS)                          │
│  ├── Ceph                                                │
│  └── ...                                                 │
│                                                          │
│  StorageClass ← 动态供给:自动创建 PV                      │
└──────────────────────────────────────────────────────────┘

卷类型

emptyDir(临时卷)

Pod 创建时创建,Pod 删除时销毁。适用于同 Pod 内容器间共享临时数据。

yaml
spec:
  containers:
  - name: app
    image: myapp
    volumeMounts:
    - name: cache
      mountPath: /cache
  - name: sidecar
    image: log-collector
    volumeMounts:
    - name: cache
      mountPath: /data
  volumes:
  - name: cache
    emptyDir: {}
    # emptyDir:
    #   medium: Memory    # 使用内存(tmpfs),更快但占用内存
    #   sizeLimit: 500Mi

hostPath(节点路径)

挂载节点上的文件或目录。生产环境慎用——Pod 调度到不同节点时数据就不在了。

yaml
volumes:
- name: host-data
  hostPath:
    path: /data
    type: DirectoryOrCreate

PV / PVC / StorageClass

这是 K8s 存储的核心三件套:

PersistentVolume(PV)—— 存储资源

yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
  - ReadWriteOnce           # 单节点读写
  persistentVolumeReclaimPolicy: Retain  # PVC 删除后保留数据
  hostPath:                 # 本地学习用
    path: /mnt/data

PersistentVolumeClaim(PVC)—— 存储请求

yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi          # 请求 5Gi,会绑定到满足条件的 PV

在 Pod 中使用 PVC

yaml
spec:
  containers:
  - name: app
    image: myapp
    volumeMounts:
    - name: data
      mountPath: /data
  volumes:
  - name: data
    persistentVolumeClaim:
      claimName: my-pvc

AccessModes(访问模式)

模式缩写说明
ReadWriteOnceRWO单节点读写
ReadOnlyManyROX多节点只读
ReadWriteManyRWX多节点读写
ReadWriteOncePodRWOP单 Pod 读写(K8s 1.27+)

ReclaimPolicy(回收策略)

策略说明
RetainPVC 删除后保留 PV 和数据(手动清理)
DeletePVC 删除后自动删除 PV 和底层存储
Recycle已弃用

StorageClass(动态供给)

手动创建 PV 太麻烦。StorageClass 可以在创建 PVC 时自动创建 PV

yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast
provisioner: kubernetes.io/no-provisioner  # 本地学习
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
---
# 阿里云 ACK 的 StorageClass 示例
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: alicloud-disk-ssd
provisioner: diskplugin.csi.alibabacloud.com
parameters:
  type: cloud_ssd
reclaimPolicy: Delete

使用 StorageClass 的 PVC:

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

下一步

02 - StatefulSet