云存储
学习目标
- 了解主流云平台的存储方案
- 掌握 CSI Driver 的使用方法
- 理解块存储、文件存储、对象存储的区别
核心概念
云存储类型
┌─────────────────────────────────────────────────┐
│ 云存储类型 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 块存储 │ │ 文件存储 │ │ 对象存储 │ │
│ │ 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) |
|---|---|---|
| 访问模式 | RWO | RWX |
| 性能 | 高 | 中 |
| 共享 | 不支持 | 支持 |
| 价格 | 中 | 高 |
| 适用场景 | 数据库、单 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...