Kubernetes Volumes
Pod 持久和临时存储 — PV、PVC 和存储类。
容器高级
为什么
K8s volume 提供存活 pod 重启的存储(PersistentVolume)或临时(emptyDir)。PVC 抽象存储请求与存储供应者。
Docker is used by 59% of professional developers per the Stack Overflow 2024 survey,Kubernetes 在生产中运行 60% 的容器化工作负载(CNCF 2024 调查)。容器编排通过声明式滚动发布将部署相关事故减少 35%。
何时使用
持久数据(DB、上传)用 PV/PVC。临时空间用 emptyDir。
如何做
1. StorageClass — 定义供应者(EBS、gp3 等)
2. PVC — 请求存储,自动供应 PV
3. 挂载 — pod spec 中 volumeMounts
4. 访问 — ReadWriteOnce、ReadOnlyMany、ReadWriteMany
5. 调整 — allowVolumeExpansion: true
6. 快照 — VolumeSnapshot 备份
7. 临时 — emptyDir 临时空间
示例
# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata: { name: data }
spec:
accessModes: [ReadWriteOnce]
storageClassName: gp3
resources: { requests: { storage: 10Gi } }
# deployment.yaml — 挂载 PVC
spec:
containers:
- name: app
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim: { claimName: data }
# 临时空间
volumes:
- name: scratch
emptyDir: { sizeLimit: 1Gi }
常见问题
- ⚠PVC pending — 无存储类或容量不足,查事件
- ⚠pod 删丢数据 — 用 emptyDir 非 PVC,emptyDir 临时
- ⚠环境间配置漂移 — 使用基础设施即代码(Terraform/Pulumi)保持 dev/staging/prod 一致
最佳实践
- ✓持久数据用 PVC — 存活 pod 删除和重调度
- ✓storageClassName 设快 SSD — AWS gp3,Azure premium SSD
- ✓设置健康检查和优雅关闭 — 处理 SIGTERM 以在退出前排空进行中的请求