StorageClass是什么
kubernetes自动创建pv的机制核心就是在于StorageClass
这个API对象 , 这个对象的作用就是创建pv模板
StorageClass
对象定义的部分如下:
- pv属性 , 比如存储类型 , volume大小
- 创建pv用到的存储插件 , 比如ceph等等
有了这些 , kubernetes就能根据用户提交的pvc , 找到一个对应的StorageClass
了 , 之后 , kubernetes会调用该StorageClass
声明的存储插件 , 创建出需要的pv
例子
比如要创建GCE的Persistent Disk类型的volume的话, 可以有如下定义
1 | apiVersion: storage.k8s.io/v1 |
如果相应rook存储服务的话, 可以这样定义
vim sc.yaml
1 | apiVersion: ceph.rook.io/v1beta1 |
之后应用这个yaml文件
1 | kubectl apply -f sc.yaml |
作为开发者 , 只需要在pvc里面声明想用的StorageClass就行了
vim pvc.yaml
1 | apiVersion: v1 |
之后应用这个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”挂载在容器内指定的路径