存储
Kubernetes 存储系统为 Pod 提供持久化存储能力,允许数据在 Pod 生命周期之外独立存在。K8s 提供了多种存储抽象,包括 Volume、PersistentVolume (PV)、PersistentVolumeClaim (PVC) 和 StorageClass。
存储架构关系
graph TD
subgraph "应用层"
P[Pod]
C[Container]
end
subgraph "K8s 存储抽象层"
V[Volume]
PVC[PersistentVolumeClaim]
PV[PersistentVolume]
end
subgraph "存储提供层"
SC[StorageClass]
St[底层存储
NFS/EBS/Ceph等]
end
P --> V
V --> PVC
PVC --> PV
PV --> SC
SC --> St
Volume 类型
emptyDir
特点:Pod 创建时创建,Pod 删除时自动删除,生命周期与 Pod 相同。
用途:临时存储、缓存、Pod 内容器间共享数据。
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: container1
image: nginx
volumeMounts:
- name: cache-volume
mountPath: /cache
volumes:
- name: cache-volume
emptyDir: {}
hostPath
特点:将节点上的文件或目录挂载到 Pod 中,仅适用于单节点测试。
用途:访问节点上的文件系统、调试、单节点测试。
volumes:
- name: host-volume
hostPath:
path: /data
type: Directory
持久化存储
特点:包括 NFS、iSCSI、云存储(AWS EBS、GCE PD、Azure Disk)等。
用途:生产环境中的持久化数据存储。
volumes:
- name: nfs-volume
nfs:
server: nfs-server.example.com
path: /share
configMap/Secret
特点:将配置数据和敏感信息作为存储卷挂载到 Pod 中。
用途:配置管理、密钥管理。
volumes:
- name: config-volume
configMap:
name: app-config
PV/PVC 详解
PersistentVolume (PV)
集群中的存储资源,由管理员预配置或通过 StorageClass 动态创建。
- 集群级别资源
- 独立于 Pod 生命周期
- 支持多种存储后端
- 定义存储容量、访问模式
PersistentVolumeClaim (PVC)
用户对存储资源的请求,绑定到合适的 PV 上。
- 命名空间级别资源
- 定义存储需求
- 与 PV 进行动态绑定
- Pod 通过 PVC 使用存储
PV/PVC 工作流程
sequenceDiagram
participant Dev as 开发者
participant K8s as Kubernetes
participant Storage as 存储系统
Dev->>K8s: 创建 PVC (请求 10GB)
K8s->>Storage: 寻找匹配的 PV
Storage-->>K8s: 返回可用 PV
K8s->>K8s: 绑定 PVC 到 PV
K8s-->>Dev: PVC 绑定成功
Dev->>K8s: 创建 Pod 使用 PVC
K8s->>Storage: 挂载存储到 Pod
存储访问模式
| 访问模式 | 缩写 | 说明 | 适用场景 |
|---|---|---|---|
| ReadWriteOnce | RWO | 单节点读写 | 单节点应用,如数据库 |
| ReadOnlyMany | ROX | 多节点只读 | 配置文件、静态资源 |
| ReadWriteMany | RWX | 多节点读写 | 共享文件系统 |
| ReadWriteOncePod | RWOP | 单 Pod 读写 | 确保只有一个 Pod 访问 |
StorageClass 详解
StorageClass 定义了存储的类型和供应策略,支持动态 PV 创建。
# 创建 StorageClass 示例
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Retain
allowVolumeExpansion: true
mountOptions:
- debug
# 使用 StorageClass 的 PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
storageClassName: fast-ssd
存储最佳实践
| 实践 | 建议 | 原因 |
|---|---|---|
| 选择合适的存储类型 | 根据应用需求选择 Volume、PVC 或其他存储方案 | 避免性能瓶颈和数据丢失风险 |
| 配置存储资源请求 | 明确指定存储容量和访问模式 | 确保应用有足够的存储空间 |
| 设置合理的回收策略 | Retain、Delete 或 Recycle | 避免重要数据被意外删除 |
| 使用 StorageClass | 实现动态存储供应 | 提高存储管理的灵活性和自动化程度 |
常用存储命令
# 查看 PV
kubectl get pv
# 查看 PVC
kubectl get pvc -n <namespace>
# 查看 StorageClass
kubectl get storageclass
# 查看存储使用情况
kubectl describe pvc <pvc-name>
# 动态创建 PV
kubectl apply -f pvc.yaml