67·存储进阶

云存储

kubernetesstoragecloudawsgcpazure

云存储

学习目标

  1. 了解主流云平台的存储方案
  2. 掌握 CSI Driver 的使用方法
  3. 理解块存储、文件存储、对象存储的区别

核心概念

云存储类型

┌─────────────────────────────────────────────────┐
│                  云存储类型                       │
│                                                  │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐      │
│  │ 块存储   │  │ 文件存储  │  │ 对象存储 │      │
│  │ Block    │  │ File     │  │ Object   │      │
│  └────┬─────┘  └────┬─────┘  └────┬─────┘      │
│       │              │              │            │
│       ▼              ▼              ▼            │
│  AWS: EBS       AWS: EFS       AWS: S3         │
│  GCP: PD        GCP: Filestore GCP: GCS        │
│  Azure: Disk    Azure: Files   Azure: Blob      │
│                                                  │
│  特点:          特点:          特点:          │
│  - 高性能       - 多节点共享    - 海量存储       │
│  - 单节点挂载   - POSIX 兼容    - HTTP 访问      │
│  - 适合数据库   - 适合共享文件  - 不支持挂载     │
└─────────────────────────────────────────────────┘

CSI (Container Storage Interface)

CSI 是 Kubernetes 存储的标准接口:

┌──────────┐     ┌──────────┐     ┌──────────┐
│ Kubernetes│     │   CSI    │     │  云存储  │
│   API     │────►│  Driver  │────►│   API    │
└──────────┘     └──────────┘     └──────────┘

优势:
- 标准化接口
- 独立于 Kubernetes 版本
- 由存储厂商维护

AWS 存储

EBS (Elastic Block Store)

# StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ebs-gp3
provisioner: ebs.csi.aws.com
parameters:
  type: gp3
  fsType: ext4
  encrypted: "true"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

---
# PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ebs-pvc
spec:
  accessModes:
    - ReadWriteOnce        # EBS 只支持单节点
  storageClassName: ebs-gp3
  resources:
    requests:
      storage: 100Gi

EFS (Elastic File System)

# StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: efs-sc
provisioner: efs.csi.aws.com
parameters:
  provisioningMode: efs-ap  # Access Point 模式
  fileSystemId: fs-xxxxxx
  directoryPerms: "700"
  gidRangeStart: "1000"
  gidRangeEnd: "2000"

---
# PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: efs-pvc
spec:
  accessModes:
    - ReadWriteMany        # EFS 支持多节点
  storageClassName: efs-sc
  resources:
    requests:
      storage: 10Gi

GCP 存储

Persistent Disk

# StorageClass - SSD
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: gce-ssd
provisioner: pd.csi.storage.gke.io
parameters:
  type: pd-ssd
  replication-mode: regional-pd  # 区域冗余
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

---
# StorageClass - 标准
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: gce-standard
provisioner: pd.csi.storage.gke.io
parameters:
  type: pd-standard
reclaimPolicy: Delete

Azure 存储

Azure Disk

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azure-disk-premium
provisioner: disk.csi.azure.com
parameters:
  skuName: Premium_LRS
  cachingMode: ReadOnly
  kind: Managed
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

Azure Files

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azurefile-csi
provisioner: file.csi.azure.com
parameters:
  skuName: Premium_LRS
  shareProtocol: nfs      # 支持 SMB 和 NFS
reclaimPolicy: Delete

存储类型对比

特性块存储 (EBS/PD/Disk)文件存储 (EFS/Filestore/Files)
访问模式RWORWX
性能
共享不支持支持
价格
适用场景数据库、单 Pod共享文件、多 Pod

CSI Driver 安装

# AWS EBS CSI Driver
kubectl apply -k "github.com/kubernetes-sigs/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable/?ref=release-1.x"

# 查看 CSI Drivers
kubectl get csidrivers

# 查看 CSI 节点信息
kubectl get csinodes

实践练习

练习 1:查看云环境 CSI Driver

# 查看已安装的 CSI Driver
kubectl get csidrivers

# 查看详情
kubectl describe csidrivers

# 查看节点的 CSI 信息
kubectl get csinodes -o yaml

练习 2:创建云存储 PVC

# 根据云环境选择对应的 StorageClass
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: cloud-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: <your-cloud-sc>  # 替换为实际的 StorageClass
  resources:
    requests:
      storage: 10Gi
kubectl apply -f cloud-pvc.yaml
kubectl get pvc cloud-pvc

练习 3:测试存储扩容

# 查看当前 PVC 大小
kubectl get pvc cloud-pvc

# 扩容到 20Gi
kubectl patch pvc cloud-pvc -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'

# 观察扩容过程
kubectl get pvc cloud-pvc -w

常见误解

1. 对象存储不能直接挂载

S3/GCS/Blob 是对象存储,不能作为文件系统挂载
需要使用 CSI Driver(如 s3-csi)或 sidecar 模式
大多数场景应使用块存储或文件存储

2. 区域和可用区很重要

云存储通常绑定到特定可用区
使用 WaitForFirstConsumer 确保 Pod 和存储在同一可用区
跨可用区访问会增加延迟和成本

小结

要点说明
块存储EBS/PD/Disk,高性能,单节点
文件存储EFS/Filestore/Files,多节点共享
对象存储S3/GCS/Blob,HTTP 访问,不直接挂载
CSI Driver标准存储接口,由厂商维护
最佳实践根据场景选择,注意区域绑定

练习编辑器

bash
Loading...

继续学习

完成本课后,建议继续学习下一课「卷快照」 以巩固所学知识。