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: 500MihostPath(节点路径)
挂载节点上的文件或目录。生产环境慎用——Pod 调度到不同节点时数据就不在了。
yaml
volumes:
- name: host-data
hostPath:
path: /data
type: DirectoryOrCreatePV / 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/dataPersistentVolumeClaim(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-pvcAccessModes(访问模式)
| 模式 | 缩写 | 说明 |
|---|---|---|
| ReadWriteOnce | RWO | 单节点读写 |
| ReadOnlyMany | ROX | 多节点只读 |
| ReadWriteMany | RWX | 多节点读写 |
| ReadWriteOncePod | RWOP | 单 Pod 读写(K8s 1.27+) |
ReclaimPolicy(回收策略)
| 策略 | 说明 |
|---|---|
| Retain | PVC 删除后保留 PV 和数据(手动清理) |
| Delete | PVC 删除后自动删除 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