首页 > 数据库 > 数据库开发技术 > 测试通过storageclass动态生成pv
什么是storageclass?
1.storageclass(存储类)概念
storageclass是一个存储类,k8s集群管理员通过创建storageclass可以动态生成一个存储卷供k8s用户使用。
2.storageclass资源定义
每个StorageClass都包含字段provisioner,parameters和reclaimPolicy,当需要动态配置属于该类的PersistentVolume时使用这些字段。
StorageClass对象的名称很重要,是用户可以请求特定类的方式。管理员在首次创建StorageClass对象时设置类的名称和其他参数,并且在创建对象后无法更新这些对象。
管理员可以为不请求任何特定类绑定的PVC指定默认的StorageClass
(1)yaml文件示例说明:
apiVersion: storage.k8s.io/v1kind: StorageClassmetadata:name: standardprovisioner: kubernetes.io/aws-ebsparameters:type: gp2reclaimPolicy: RetainmountOptions:debugvolumeBindingMode: Immediate
(2)Provisioner
storageclass需要有一个供应者,用来确定我们使用什么样的存储来创建pv
常见的provisioner供应者如下:

provisioner既可以是内部供应程序,也可以由外部供应商提供,如果是外部供应商可以参考https://github.com/kubernetes-incubator/external-storage/下提供的方法创建storageclass的provisioner,例如,NFS不提供内部配置程序,但可以使用外部配置程序。一些外部供应商列在存储库https://github.com/kubernetes-incubator/external-storage下。
nfs的provisioner:
https://github.com/kubernetes-incubator/external-storage/tree/master/nfs/deploy/kubernetes
Reclaim Policy
由存储类动态创建持久化存储卷(pv)时可以指定reclaimPolicy字段,这个字段中指定的回收策略可以是Delete或Retain。如果在创建StorageClass对象时未指定reclaimPolicy,则默认为Delete。
Mount Options(挂载选项)
如果Volume Plugin不支持这个挂载选项,但是指定了,就会使provisioner创建失败
Volume Binding Mode
这个字段用来说明什么时候进行卷绑定和动态配置;
默认情况下,立即模式表示一旦创建了PersistentVolumeClaim,就会发生卷绑定和动态配置。对于受拓扑约束且无法从群集中的所有节点全局访问的存储后端,将在不知道Pod的调度要求的情况下绑定或配置PersistentVolumes。这可能导致不可调度的Pod。
集群管理员可以通过指定WaitForFirstConsumer模式来解决此问题,该模式将延迟绑定和配置PersistentVolume,直到创建使用PersistentVolumeClaim的Pod。将根据Pod的调度约束指定的拓扑选择或配置PersistentVolumes。这些包括但不限于资源需求,节点选择器,pod亲和力和反亲和力,以及污点和容忍度。
通过nfs实现存储类的动态供给
1.安装nfs服务
选择自己的任意一台机器,我选择k8s的master1节点,对应的机器ip是192.168.0.6,在192.168.0.6上执行如下步骤,大家在自己环境找一台k8s节点的机器安装就可以了~
(1)yum安装nfs
yum install nfs-utils -y
systemctl start nfs
chkconfig nfs on
(2)在master1上创建一个nfs共享目录
mkdir /data/nfs_pro -p
#修改/etc/exports文件,把刚才生成的共享目录添加到这个文件里
cat /etc/exports
/data/nfs_pro 192.168.0.0/24(rw,no_root_squash)
让刚才配置文件生效
exportfs -arv
systemctl restart nfs
(3)k8s的各个node节点也需要安装nfs
yum install nfs-utils -y
systemctl start nfs
chkconfig nfs on
2.创建运行nfs-provisioner的sa账号
cat serviceaccount.yaml
apiVersion: v1kind: ServiceAccountmetadata:name: nfs-provisioner
通过kubectl更新yaml文件
kubectl apply -f serviceaccount.yaml3.对sa账号做rbac授权
cat service-rbac.yaml
kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata:name: nfs-provisioner-runnerrules:- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]- apiGroups: [""]resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "update"]- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["events"]verbs: ["create", "update", "patch"]- apiGroups: [""]resources: ["services", "endpoints"]verbs: ["get"]- apiGroups: ["extensions"]resources: ["podsecuritypolicies"]resourceNames: ["nfs-provisioner"]verbs: ["use"]---kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:name: run-nfs-provisionersubjects:- kind: ServiceAccountname: nfs-provisionernamespace: defaultroleRef:kind: ClusterRolename: nfs-provisioner-runnerapiGroup: rbac.authorization.k8s.io---kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata:name: leader-locking-nfs-provisionerrules:- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]---kind: RoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:name: leader-locking-nfs-provisionersubjects:- kind: ServiceAccountname: nfs-provisionernamespace: defaultroleRef:kind: Rolename: leader-locking-nfs-provisionerapiGroup: rbac.authorization.k8s.io
通过kubectl更新yaml文件
kubectl apply -f service-rbac.yaml4.通过deployment创建pod用来运行nfs-provisioner
cat 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-hangzhou.aliyuncs.com/open-ali/nfs-client-provisioner:latestvolumeMounts:name: nfs-client-rootmountPath: /persistentvolumesenv:name: PROVISIONER_NAMEvalue: example.com/nfsname: NFS_SERVERvalue: 192.168.0.6name: NFS_PATHvalue: /data/storagevolumes:name: nfs-client-rootnfs:server: 192.168.0.6: /data/storage
通过kubectl更新yaml文件
kubectl apply -f deployment.yaml查看nfs provisioner的pod是否创建成功
kubectl get pods显示如下,说明创建成功
NAME READY STATUS RESTARTS AGEnfs-provisioner-7d6859cc59-pzr7n 1/1 Running 0 72s
创建storageclass
cat class.yaml
kind: StorageClassapiVersion: storage.k8s.io/v1metadata:: nfs-storageprovisioner: example.com/nfs
通过kubectl更新yaml文件
kubectl apply -f class.yaml查看storageclass是否创建成功
kubectl get storageclass显示如下,说明创建成功
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGEnfs-storage example.com/nfs Delete Immediate false 11h
创建pvc-测试storageclass动态生成pvc
cat claim.yaml
kind: PersistentVolumeClaimapiVersion: v1metadata:name: test-claim1spec:accessModes:ReadWriteManyresources:requests:storage: 1MistorageClassName: nfs-storage
通过kubectl更新yaml文件
kubectl apply -f claim.yaml查看pvc是否创建成功
kubectl get pvc |grep test显示如下,说明pvc创建成功,并且自动绑定到了storageclass创建的pv上了
test-claim1 Bound pvc-5092a033-8f01-409c-aa7d-3e90b7bf964b 1Mi RWX nfs-storage 29s测试pod挂载pvc
cat read-pod.yaml
kind: PodapiVersion: v1metadata:name: read-podspec:containers:name: read-podimage: nginxvolumeMounts:name: nfs-pvcmountPath: /usr/share/nginx/htmlrestartPolicy: "Never"volumes:name: nfs-pvcpersistentVolumeClaim:claimName: test-claim1
更新yaml文件
kubectl apply -f read-pod.yaml创建statefulset,通过volumeClaimTemplate动态生成pv、pvc
cat statefulset-storage.yaml
apiVersion: v1kind: Servicemetadata:name: storagelabels:app: storagespec:selector::app: storageports:: 80name: webclusterIP: Noneselector:app: storage---apiVersion: apps/v1kind: StatefulSetmetadata:name: storagespec::matchLabels:: storageserviceName: "storage"replicas: 2template:metadata:labels:app: storagespec:containers:name: nginximage: nginxports:containerPort: 80name: webvolumeMounts:name: wwwmountPath: /usr/share/nginx/htmlvolumeClaimTemplates:metadata:name: wwwannotations:: "nfs-storage"spec:accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 2Gi
更新yaml文件
kubectl apply -f statefulset-storage.yaml查看pod是否创建成功
kubectl get pods | grep storage显示如下,说明创建成功
storage-0 1/1 Running 0 2m49sstorage-1 1/1 Running 0 119s
查看生成的pv
kubectl get pv | grep www-storage显示如下,说明已经给pod动态生成对应的pv了
pvc-02974ea1-a954-4c21-af24-f02eea389eb3 2Gi RWO Delete Bound default/www-storage-1 nfs-storage 3m56spvc-de5f92fa-26ec-4850-a2a5-b13fe2ef1e1e 2Gi RWO Delete Bound default/www-storage-0 nfs-storage 3m56s
查看生成的pvc
kubectl get pvc | grep www-storage显示如下,可看到已经为pod生成对应的pvc,并且绑定到了pv
www-storage-0 Bound pvc-de5f92fa-26ec-4850-a2a5-b13fe2ef1e1e 2Gi RWO nfs-storage 6m52swww-storage-1 Bound pvc-02974ea1-a954-4c21-af24-f02eea389eb3 2Gi RWO nfs-storage 6m2s
往期精彩文章
Prometheus+Grafana+Alertmanager搭建全方位的监控告警系统-超详细文档
k8s1.18多master节点高可用集群安装-超详细中文官方文档
Kubernetes Pod健康检查-livenessProbe和readinessProbe
kubernetes pod生命周期管理-postStart和preStop
运维常见问题汇总-tomcat部署java项目大量close_wait解决方案
使用ingress暴露kubernetes集群内部的pod服务
jenkins+kubernetes+harbor+gitlab构建企业级devops平台
可以加我微信:luckylucky421302 ,拉您进技术群交流,也可扫描下面的二维码直接进群,一起学习交流~

长按指纹关注公众号👇
点击在看少个 bug👇
原文作者:DevOps和k8s全栈技术;如有侵权,请联系管理员删除。