HAOJX

StorageClass---kubernetes自动创建pv的机制(Dynamic Provisioning)

字数统计: 756阅读时长: 3 min
2019/01/02 Share

StorageClass是什么

kubernetes自动创建pv的机制核心就是在于StorageClass这个API对象 , 这个对象的作用就是创建pv模板

StorageClass对象定义的部分如下:

  • pv属性 , 比如存储类型 , volume大小
  • 创建pv用到的存储插件 , 比如ceph等等

有了这些 , kubernetes就能根据用户提交的pvc , 找到一个对应的StorageClass了 , 之后 , kubernetes会调用该StorageClass声明的存储插件 , 创建出需要的pv

例子

比如要创建GCE的Persistent Disk类型的volume的话, 可以有如下定义

1
2
3
4
5
6
7
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: block-service ##这个是storageclass的名字
provisioner: kubernetes.io/gce-pd #需要提供的存储插件的名字,这个是kubernetes内置的GCE PD存储插件名字
parameters:
type: pd-ssd ##这个pv类型是ssd格式的gce远程磁盘

如果相应rook存储服务的话, 可以这样定义

vim sc.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: ceph.rook.io/v1beta1
kind: Pool
metadata:
name: replicapool
namespace: rook-ceph
spec:
replicated:
size: 3
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: block-service
provisioner: ceph.rook.io/block #这里使用的存储插件的rook项目了
parameters:
pool: replicapool
#The value of "clusterNamespace" MUST be the same as the one in which your rook cluster exist
clusterNamespace: rook-ceph

之后应用这个yaml文件

1
kubectl apply -f sc.yaml

作为开发者 , 只需要在pvc里面声明想用的StorageClass就行了

vim pvc.yaml

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: claim1
spec:
accessModes:
- ReadWriteOnce
storageClassName: block-service #这个字段用于指定pvc所需要使用的storageclass名字
resources:
requests:
storage: 30Gi

之后应用这个yaml文件

1
kubectl apply -f pvc.yaml

之后我们查看这个pvc

1
kubectl describe pvc claim1

其中有一项是volume:pvc-xxxx , 这个就是刚刚自动创建的pv

kubernete内置默认支持Dynamic Provisioning的存储插件有:

Storage classes have a provisioner that determines what volume plugin is used for provisioning PVs. This field must be specified.

Volume Plugin Internal Provisioner Config Example
AWSElasticBlockStore ✓ AWS EBS
AzureFile ✓ Azure File
AzureDisk ✓ Azure Disk
CephFS - -
Cinder ✓ OpenStack Cinder
FC - -
Flexvolume - -
Flocker ✓ -
GCEPersistentDisk ✓ GCE PD
Glusterfs ✓ Glusterfs
iSCSI - -
Quobyte ✓ Quobyte
NFS - -
RBD ✓ Ceph RBD
VsphereVolume ✓ vSphere
PortworxVolume ✓ Portworx Volume
ScaleIO ✓ ScaleIO
StorageOS ✓ StorageOS
Local - Local

如果集群默认开始了DefaultStorageClass 的 Admission Plugin ,它会为pv和pvc自动添加一个默认的StorageClass, 因为kubernetes只会将StorageClass相同的pv和pvc进行绑定

StorageClass动态创建pv基本流程

用户提交请求创建pod,Kubernetes发现这个pod声明使用了PVC,那就靠PersistentVolumeController帮它找一个PV配对。 没有现成的PV,就去找对应的StorageClass,帮它新创建一个PV,然后和PVC完成绑定。 新创建的PV,还只是一个API 对象,需要经过“两阶段处理”变成宿主机上的“持久化 Volume”才真正有用: 第一阶段由运行在master上的AttachDetachController负责,为这个PV完成 Attach 操作,为宿主机挂载远程磁盘; 第二阶段是运行在每个节点上kubelet组件的内部,把第一步attach的远程磁盘 mount 到宿主机目录。这个控制循环叫VolumeManagerReconciler,运行在独立的Goroutine,不会阻塞kubelet主循环。 完成这两步,PV对应的“持久化 Volume”就准备好了,POD可以正常启动,将“持久化 Volume”挂载在容器内指定的路径

CATALOG
  1. 1. StorageClass是什么
  2. 2. 例子
  3. 3. StorageClass动态创建pv基本流程