【每日一个云原生小技巧 #18】Storage Classes

Storage Class 是 Kubernetes 中定义不同存储类型的一种方法。它为管理员提供了一种描述他们提供的存储的方式,并允许用户以抽象的方式使用这些存储。Storage Classes 可以定义特定的存储提供者(如 AWS EBS、Azure Disk、GCE Persistent Disk 等)、预配置的策略(如备份策略、加密)、IO性能、访问模式等。

使用场景:

  • 动态卷配额: 在使用 PVC 请求存储时,Storage Class 可以帮助动态地创建所需的 PV。
  • 管理多种存储类型: 当集群需要连接到不同类型的存储时(例如,SSD 和 HDD),Storage Class 可以帮助管理这些存储选项。
  • 抽象存储细节: 用户不需要关心后端存储的实际实现,只需要知道不同的 Storage Class 名称。

使用技巧

  1. 明确定义: 给 Storage Class 一个描述性的名称,这样用户可以容易地了解它们提供的存储类型和性能。
  2. 设置默认 Storage Class: 可以有一个默认的 Storage Class,这样当 PVC 没有指定 Storage Class 时,它会自动使用默认的。
  3. 细化访问策略: 通过设置允许的访问模式(例如 ReadWriteOnceReadOnlyMany),确保 Storage Class 满足特定的应用需求。
  4. 使用卷扩展: 如果可能,选择支持扩展的存储解决方案,这样可以根据需求动态调整卷的大小。
  5. 利用参数和策略: 不同的存储提供者可能支持不同的参数(如 IOPS 配置、数据复制因子等),根据需要合理配置。
  6. 注意持久化保护: 确保在 Storage Class 中配置了适当的持久化保护策略,以避免意外删除重要数据。

使用案例

以下是一个如何定义 Storage Class 并使用它来创建 Persistent Volume Claim 的示例。

Storage Class 定义示例:

代码语言:javascript
复制
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-storage
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
  fsType: ext4
  iopsPerGB: "10"
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: Immediate

在这个示例中,我们定义了一个名为 fast-storage 的 Storage Class,它使用 AWS EBS 作为存储提供者,选择了 gp2 类型,文件系统为 ext4,并且每个 GB 分配了 10 IOPS。回收策略设置为 Retain,表示当 PVC 被删除时,PV 不会被自动删除。同时允许卷扩展,并且在 PVC 创建时会立即进行卷绑定。

Persistent Volume Claim 使用 Storage Class 示例:

代码语言:javascript
复制
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: fast-storage-claim
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: fast-storage
  resources:
    requests:
      storage: 50Gi

这个 PVC fast-storage-claim 请求使用 fast-storage Storage Class 并申请 50Gi 的存储空间。当这个 PVC 被提交给 Kubernetes API 时,根据 fast-storage Storage Class 的定义,Kubernetes 会自动在 AWS 上创建一个 50Gi 的 gp2 EBS 卷。

这样,应用程序就可以利用这个 PVC 获得一个快速的、支持自动扩展的持久存储,无需关心底层存储的具体实现细节。