Kubernetes存储
外观
Kubernetes存储[编辑 | 编辑源代码]
介绍[编辑 | 编辑源代码]
Kubernetes存储是容器编排系统中管理持久化数据的核心机制。与容器本身的临时存储不同,Kubernetes提供了多种方式将持久存储挂载到Pod中,确保数据在容器重启或迁移时不会丢失。本节将详细介绍Volume、PersistentVolume(PV)、PersistentVolumeClaim(PVC)和StorageClass等关键概念。
核心概念[编辑 | 编辑源代码]
Volume(卷)[编辑 | 编辑源代码]
Volume是Pod中可被多个容器访问的共享目录,生命周期与Pod绑定。常见类型包括:
- emptyDir:临时存储,随Pod删除而销毁
- hostPath:挂载节点文件系统(仅单节点测试使用)
- configMap/secret:挂载配置信息
示例YAML:
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: nginx
name: nginx-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
PersistentVolume(PV)[编辑 | 编辑源代码]
集群级别的存储资源,由管理员预先配置。PV独立于Pod生命周期,支持多种后端存储(如NFS、iSCSI、云存储等)。
PV示例:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
server: 10.0.0.1
path: "/exports"
PersistentVolumeClaim(PVC)[编辑 | 编辑源代码]
用户对存储资源的请求,Kubernetes会根据PVC的请求(大小、访问模式等)自动绑定合适的PV。
PVC示例:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
StorageClass[编辑 | 编辑源代码]
实现动态卷配置,允许按需创建PV而无需管理员手动干预。
StorageClass示例(AWS EBS):
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
存储架构[编辑 | 编辑源代码]
实际案例[编辑 | 编辑源代码]
数据库持久化[编辑 | 编辑源代码]
MySQL数据库使用PVC实现数据持久化:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
状态应用扩展[编辑 | 编辑源代码]
通过StatefulSet管理有状态应用,每个Pod获得独立的持久存储:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "fast"
resources:
requests:
storage: 1Gi
高级主题[编辑 | 编辑源代码]
卷快照[编辑 | 编辑源代码]
使用VolumeSnapshot API创建时间点备份:
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: mysql-snapshot
spec:
volumeSnapshotClassName: csi-aws-vsc
source:
persistentVolumeClaimName: mysql-pvc
本地存储优化[编辑 | 编辑源代码]
使用Local PV实现低延迟访问:
最佳实践[编辑 | 编辑源代码]
- 生产环境避免使用hostPath
- 为不同工作负载选择合适的StorageClass
- 监控PV/PVC使用情况防止存储耗尽
- 有状态应用优先使用StatefulSet
参见[编辑 | 编辑源代码]
- Kubernetes官方文档:Volumes
- CSI(Container Storage Interface)规范
- 各云厂商的持久存储解决方案