跳转到内容

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

存储架构[编辑 | 编辑源代码]

graph LR Pod-->|使用|PVC PVC-->|绑定|PV PV-->|后端存储|物理存储 StorageClass-->|动态创建|PV

实际案例[编辑 | 编辑源代码]

数据库持久化[编辑 | 编辑源代码]

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实现低延迟访问:

访问延迟=网络延迟本地直连×IOPS

最佳实践[编辑 | 编辑源代码]

  • 生产环境避免使用hostPath
  • 为不同工作负载选择合适的StorageClass
  • 监控PV/PVC使用情况防止存储耗尽
  • 有状态应用优先使用StatefulSet

参见[编辑 | 编辑源代码]

  • Kubernetes官方文档:Volumes
  • CSI(Container Storage Interface)规范
  • 各云厂商的持久存储解决方案