storageclass存储类动态生成存储
- storageclass作用
- StorageClass 定义
- provisioner:供应商
- reclaimPolicy:回收策略
- 安装nfs provisioner,用于配合存储类动态生成pv
- 前置条件
- 扩展:什么是sa
- 安装nfs-provisioner程序
- 创建storageclass,动态供给pv
- 创建pvc,通过storageclass动态生成pv
- 步骤总结:
- 创建pod,挂载storageclass动态生成的pvc:test-claim1
storageclass作用
之前介绍的PV和PVC模式都是需要先创建好PV,然后定义好PVC和pv进行一对一的Bond,但是如果PVC请求成千上万,那么就需要创建成千上万的PV,对于运维人员来说维护成本很高,Kubernetes提供一种自动创建PV的机制,叫StorageClass,它的作用就是创建PV的模板。k8s集群管理员通过创建storageclass可以动态生成一个存储卷pv供k8s pvc使用。
- 每个StorageClass都包含字段provisioner,parameters和reclaimPolicy。
StorageClass 定义
- PV的属性 ,比如存储的大小、类型等;
- 创建这种PV需要使用到的存储插件,比如Ceph、NFS等
有了这两部分信息,Kubernetes就能够根据用户提交的PVC,找到对应的StorageClass,然后Kubernetes就会调用 StorageClass声明的存储插件,创建出需要的PV。
查看定义的storageclass需要的字段
kubectl explain storageclass
provisioner:供应商
storageclass需要有一个供应者,用来确定我们使用什么样的存储来创建pv,常见的provisioner如下
https://kubernetes.io/zh/docs/concepts/storage/storage-classes/
provisioner既可以由内部供应商提供,也可以由外部供应商提供,如果是外部供应商可以参考https://github.com/kubernetes-incubator/external-storage/下提供的方法创建。
https://github.com/kubernetes-sigs/sig-storage-lib-external-provisioner
- 以NFS为例,要想使用NFS,我们需要一个nfs-client的自动装载程序,称之为provisioner,这个程序会使用我们已经配置好的NFS服务器自动创建持久卷,也就是自动帮我们创建PV。
reclaimPolicy:回收策略
allowVolumeExpansion:允许卷扩展,PersistentVolume 可以配置成可扩展。将此功能设置为true时,允许用户通过编辑相应的 PVC 对象来调整卷大小。当基础存储类的allowVolumeExpansion字段设置为 true 时,以下类型的卷支持卷扩展。
注意:此功能仅用于扩容卷,不能用于缩小卷。
安装nfs provisioner,用于配合存储类动态生成pv
前置条件
把nfs-subdir-external-provisioner.tar.gz上传到k8snode1和2
链接:https://pan.baidu.com/s/1Aks1dPFbXqVUupKIVei93A” />ctr –n=k8s.io images importnfs–subdir–external–provisioner.tar.gz创建运行nfs-provisioner需要的sa账号
cat serviceaccount.yaml
apiVersion: v1kind: ServiceAccountmetadata:name: nfs-provisioner
kubectl apply -f serviceaccount.yaml
扩展:什么是sa
sa的全称是serviceaccount
serviceaccount是为了方便Pod里面的进程调用Kubernetes API或其他外部服务而设计的。
指定了serviceaccount之后,我们把pod创建出来了,我们在使用这个pod时,这个pod就有了我们指定的账户的权限了。
对sa授权kubectl create clusterrolebinding nfs-provisioner-clusterrolebinding --clusterrole=cluster-admin --serviceaccount=default:nfs-provisioner
安装nfs-provisioner程序
把/data/nfs_pro变成nfs共享的目录
mkdir /data/nfs_pro -p
cat /etc/exports/data/volumes 192.168.40.0/24(rw,no_root_squash)/data/volume_test/v1 192.168.40.0/24(rw,no_root_squash)/data/volume_test/v2 192.168.40.0/24(rw,no_root_squash)/data/volume_test/v3 192.168.40.0/24(rw,no_root_squash)/data/volume_test/v4 192.168.40.0/24(rw,no_root_squash)/data/volume_test/v5 192.168.40.0/24(rw,no_root_squash)/data/volume_test/v6 192.168.40.0/24(rw,no_root_squash)/data/volume_test/v7 192.168.40.0/24(rw,no_root_squash)/data/volume_test/v8 192.168.40.0/24(rw,no_root_squash)/data/volume_test/v9 192.168.40.0/24(rw,no_root_squash)/data/volume_test/v10 192.168.40.0/24(rw,no_root_squash)/data/nfs_pro 192.168.40.0/24(rw,no_root_squash)
exportfs -arvexporting 192.168.40.0/24:/data/nfs_proexporting 192.168.40.0/24:/data/volume_test/v10exporting 192.168.40.0/24:/data/volume_test/v9exporting 192.168.40.0/24:/data/volume_test/v8exporting 192.168.40.0/24:/data/volume_test/v7exporting 192.168.40.0/24:/data/volume_test/v6exporting 192.168.40.0/24:/data/volume_test/v5exporting 192.168.40.0/24:/data/volume_test/v4exporting 192.168.40.0/24:/data/volume_test/v3exporting 192.168.40.0/24:/data/volume_test/v2exporting 192.168.40.0/24:/data/volume_test/v1exporting 192.168.40.0/24:/data/volumes
cat nfs-deployment.yaml
kind: DeploymentapiVersion: apps/v1metadata:name: nfs-provisionerspec:selector:matchLabels: app: nfs-provisionerreplicas: 1strategy:type: Recreatetemplate:metadata:labels:app: nfs-provisionerspec:serviceAccount: nfs-provisionercontainers:- name: nfs-provisionerimage: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0imagePullPolicy: IfNotPresentvolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: example.com/nfs- name: NFS_SERVERvalue: 192.168.40.180- name: NFS_PATHvalue: /data/nfs_provolumes:- name: nfs-client-rootnfs:server: 192.168.40.180path: /data/nfs_pro
更新资源清单文件
kubectl apply -f nfs-deployment.yaml
查看nfs-provisioner是否正常运行
kubectl get pods | grep nfsnfs-provisioner-cd5589cfc-pjwsq1/1 Running
创建storageclass,动态供给pv
cat nfs-storageclass.yaml
kind: StorageClassapiVersion: storage.k8s.io/v1metadata:name: nfsprovisioner: example.com/nfs
kubectl apply -f nfs-storageclass.yaml
kubectl get storageclassNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE nfs example.com/nfs DeleteImmediate #显示内容如上,说明storageclass创建成功了
注意:provisioner处写的example.com/nfs应该跟安装nfs provisioner时候的env下的PROVISIONER_NAME的value值保持一致,如下:
env:- name: PROVISIONER_NAME value: example.com/nfs
创建pvc,通过storageclass动态生成pv
cat claim.yaml
kind: PersistentVolumeClaimapiVersion: v1metadata:name: test-claim1spec:accessModes:["ReadWriteMany"]resources:requests:storage: 1GistorageClassName:nfs
kubectl apply -f claim.yaml
kubectl get pvc
#通过上面可以看到test-claim1的pvc已经成功创建了,绑定的pv是pvc-da737fb7-3ffb-43c4-a86a-2bdfa7f201e2,这个pv是由storageclass调用nfs provisioner自动生成的。
步骤总结:
- 供应商:创建一个nfs provisioner
- 创建storageclass,storageclass指定刚才创建的供应商
- 创建pvc,这个pvc指定storageclass
创建pod,挂载storageclass动态生成的pvc:test-claim1
cat read-pod.yaml
kind: PodapiVersion: v1metadata:name: read-podspec:containers:- name: read-podimage: nginximagePullPolicy: IfNotPresentvolumeMounts:- name: nfs-pvcmountPath: /usr/share/nginx/htmlrestartPolicy: "Never"volumes:- name: nfs-pvcpersistentVolumeClaim:claimName: test-claim1
kubectl apply -f read-pod.yaml
kubectl get pods | grep readread-pod1/1 Running 0