← 返回首页
☁️

K8s存储

📂 architecture ⏱ 1 min 190 words

K8s存储

存储架构

K8s存储通过PV和PVC解耦存储供给和使用,StorageClass实现动态存储供给。

┌─────────────────────────────────────────────┐
│              K8s存储架构                     │
├─────────────┬─────────────┬─────────────────┤
│    PVC      │     PV      │  StorageClass   │
│  (声明)     │  (实际)     │  (动态供给)     │
├─────────────┼─────────────┼─────────────────┤
│ 用户申请    │ 存储资源    │  存储配置模板   │
└─────────────┴─────────────┴─────────────────┘
                    │
                    ▼
┌─────────────────────────────────────────────┐
│  CSI Plugin (NFS/EBS/Ceph/Local)            │
└─────────────────────────────────────────────┘

PV与PVC

# PersistentVolume
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
  - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: nfs-server.example.com
    path: /exports/data
---
# PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data-pvc
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  storageClassName: nfs

StorageClass动态供给

# StorageClass配置
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp3
  iopsPerGB: "50"
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer

StatefulSet存储

# StatefulSet使用PVC模板
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: mysql
  replicas: 3
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        volumeMounts:
        - name: data
          mountPath: /var/lib/mysql
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: fast-ssd
      resources:
        requests:
          storage: 20Gi

CSI插件

# Ceph CSI配置
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ceph-rbd
provisioner: rbd.csi.ceph.com
parameters:
  clusterID: abc-123
  pool: kubernetes
  csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
  csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
reclaimPolicy: Delete
allowVolumeExpansion: true

存储最佳实践

场景 推荐方案
共享文件 NFS/cephfs
数据库 Local SSD/RBD
日志存储 emptyDir
配置文件 ConfigMap/Secret