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基本流程