K8S中的StorageClass

前言

StorageClass 为管理员提供了一种描述他们提供的存储Class的方法。不同的类可能映射到服务质量级别、备份策略或集群管理员确定的任意策略。 Kubernetes 本身对类代表什么没有意见。这个概念有时在其他存储系统中称为profiles

每个 StorageClass 都包含字段 provisionerparametersreclaimPolicy,当需要动态配置属于该类的 PersistentVolume 时使用这些字段。

StorageClass 对象的名称很重要,它是用户请求特定类的方式。管理员在第一次创建StorageClass对象时设置类的名称和其他参数,对象一旦创建就不能更新

管理员只能为不请求绑定任何特定类的 PVC 指定默认 StorageClass:有关详细信息,请参阅 PersistentVolumeClaim 部分。

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Retain
allowVolumeExpansion: true
mountOptions:
- debug
volumeBindingMode: Immediate

来自storage-classes

属性

Provisioner分配器

每个StorageClass都有一个provisioner,决定使用什么卷插件来配置PV。这个字段必须被指定。

分配器分为:内部分配器、外部分配器

Reclaim Policy回收策略

StorageClass 动态创建的 PersistentVolume 将具有在类的 reclaimPolicy 字段中指定的回收策略,该字段可以是 DeleteRetain。如果在创建 StorageClass 对象时未指定 reclaimPolicy,则默认为 Delete

手动创建并通过 StorageClass 管理的 PersistentVolume 将具有在创建时分配的任何回收策略

Allow Volume Expansion允许卷扩展

PersistentVolume 可以配置为可扩展。此功能设置为 true 时,允许用户通过编辑相应的 PVC 对象来调整卷的大小。

Mount Options挂载

StorageClass 动态创建的 PersistentVolume 将具有在类的 mountOptions 字段中指定的挂载选项。

如果卷插件不支持挂载选项但指定了挂载选项,则配置将失败。挂载选项未在类或 PV 上验证。如果挂载选项无效,则 PV 挂载失败

Volume Binding Mode

volumeBindingMode 字段控制何时应该发生卷绑定和动态配置。未设置时,默认使用“立即”模式。

即时模式表示一旦创建 PersistentVolumeClaim,就会发生卷绑定和动态供应。对于拓扑受限且无法从集群中的所有节点全局访问的存储后端,将在不知道 Pod 调度要求的情况下绑定或配置 PersistentVolume。这可能会导致不可调度的 Pod

Allowed Topologies

当集群操作员指定 WaitForFirstConsumer 卷绑定模式时,在大多数情况下不再需要将配置限制为特定拓扑。但是,如果仍然需要,可以指定 allowedTopologies

此示例演示如何将已配置卷的拓扑限制到特定区域,并且应该用作受支持插件的区域和区域参数的替代。

Parameters

存储类具有描述属于该存储类的卷的参数。根据 provisioner 的不同,可以接受不同的参数。例如,参数类型的值 io1 和参数 iopsPerGB 特定于 EBS。当省略参数时,使用一些默认值。

一个 StorageClass 最多可以定义 512 个参数。参数对象的总长度(包括其键和值)不能超过 256 KiB

NFS

创建存储类

example-nfs-storage-class.yaml

1
2
3
4
5
6
7
8
9
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: example-nfs-storage-class
provisioner: nfs-provisioner
parameters:
server: 192.168.2.240
path: /share
readOnly: "false"
  • serverServerNFS 服务器的主机名或 IP 地址。
  • pathNFS服务器导出的路径。
  • readOnly:指示存储是否将被安装为只读的标志(默认为 false)。

Kubernetes 不包含内部 NFS 供应商。您需要使用外部供应商为 NFS 创建 StorageClass。这里有些例子:

创建pvc

nfs-pvc.yaml

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: example-nfs-storage-class
resources:
requests:
storage: 1Mi

使用nfs-pvc

test-deployment.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
spec:
replicas: 2
selector:
matchLabels:
name: test-deployment
template:
metadata:
labels:
name: test-deployment
spec:
serviceAccount: nfs-provisioner
containers:
- image: redis
command:
- sh
- -c
- 'while true; do date > /mnt/index.html; hostname >> /mnt/index.html; sleep $(($RANDOM % 5 + 5)); done'
imagePullPolicy: IfNotPresent
name: redis
volumeMounts:
- name: nfs
mountPath: /mnt
volumes:
- name: nfs
persistentVolumeClaim:
claimName: nfs-pvc
1
kubectl apply -f test-deployment.yaml

本文地址: https://github.com/maxzhao-it/blog/post/cfe111da/