k8s存储类:storageclass
Kubernetes通过StorageClass实现PV的动态供给,解决了传统PV/PVC模式需要预先创建大量PV的运维难题。StorageClass包含provisioner、parameters和reclaimPolicy等字段,定义PV属性和存储插件(如NFS、Ceph)。以NFS为例,部署nfs-provisioner后创建StorageClass,当用户提交PVC请求时,系统会自动调用存

上面介绍的PV和PVC模式都是需要先创建好PV,然后定义好PVC和pv进行一对一的Bond,但是如果PVC请求成千上万,那么就需要创建成千上万的PV,对于运维人员来说维护成本很高,Kubernetes提供一种自动创建PV的机制,叫StorageClass,它的作用就是创建PV的模板。k8s集群管理员通过创建storageclass可以动态生成一个存储卷pv供k8s pvc使用。
每个StorageClass都包含字段provisioner,parameters和reclaimPolicy。
具体来说,StorageClass会定义以下两部分:
1、PV的属性 ,比如存储的大小、类型等;
2、创建这种PV需要使用到的存储插件,比如Ceph、NFS等
有了这两部分信息,Kubernetes就能够根据用户提交的PVC,找到对应的StorageClass,然后Kubernetes就会调用 StorageClass声明的存储插件,创建出需要的PV。
#查看定义的storageclass需要的字段
[root@k8s-master1 ~]# kubectl explain storageclass
KIND: StorageClass
VERSION: storage.k8s.io/v1
DESCRIPTION:
StorageClass describes the parameters for a class of storage for which
PersistentVolumes can be dynamically provisioned.
StorageClasses are non-namespaced; the name of the storage class according
to etcd is in ObjectMeta.Name.
FIELDS:
allowVolumeExpansion <boolean>
allowedTopologies <[]Object>
apiVersion <string>
kind <string>
metadata <Object>
mountOptions <[]string>
parameters <map[string]string>
provisioner <string> -required-
reclaimPolicy <string>
volumeBindingMode <string>
provisioner:供应商,storageclass需要有一个供应者,用来确定我们使用什么样的存储来创建pv,常见的provisioner如下

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上传到k8s-node02和k8s-node01上,手动解压。
[root@k8s-node01 ~]# docker load -i nfs-subdir-external-provisioner.tar.gz
[root@k8s-node01 ~]# ctr -n=k8s.io images import nfs-subdir-external-provisioner.tar.gz
[root@k8s-node02 ~]# docker load -i nfs-subdir-external-provisioner.tar.gz
[root@k8s-node02 ~]# ctr -n=k8s.io images import nfs-subdir-external-provisioner.tar.gz
1、创建运行nfs-provisioner需要的sa账号
[root@k8s-master1 nfs]# cat serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-provisioner
[root@k8s-master1 nfs]# kubectl apply -f serviceaccount.yaml
serviceaccount/nfs-provisioner created
扩展:什么是sa?
sa的全称是serviceaccount。
serviceaccount是为了方便Pod里面的进程调用Kubernetes API或其他外部服务而设计的。
指定了serviceaccount之后,我们把pod创建出来了,我们在使用这个pod时,这个pod就有了我们指定的账户的权限了。
2、对sa授权
[root@k8s-master1]# kubectl create clusterrolebinding nfs-provisioner-clusterrolebinding --clusterrole=cluster-admin --serviceaccount=default:nfs-provisioner
3、安装nfs-provisioner程序
[root@k8s-master1 ~]# mkdir /data/nfs_pro -p
#把/data/nfs_pro变成nfs共享的目录
[root@k8s-master1 ~]# cat /etc/exports
…………………
/data/nfs_pro 192.168.30.0/24(rw,no_root_squash)
[root@k8s-master1 ~]# exportfs -arv
exporting 192.168.30.0/24:/data/volumes
[root@k8s-master1 ~]# cat nfs-deployment.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: nfs-provisioner
spec:
selector:
matchLabels:
app: nfs-provisioner
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-provisioner
spec:
serviceAccount: nfs-provisioner
containers:
- name: nfs-provisioner
image: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0
imagePullPolicy: IfNotPresent
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: example.com/nfs
- name: NFS_SERVER
value: 192.168.30.10
- name: NFS_PATH
value: /data/nfs_pro
volumes:
- name: nfs-client-root
nfs:
server: 192.168.30.10
path: /data/nfs_pro
#更新资源清单文件
[root@k8s-master1 ~]# kubectl apply -f nfs-deployment.yaml
deployment.apps/nfs-provisioner created
#查看nfs-provisioner是否正常运行
[root@k8s-master1 nfs]# kubectl get pods | grep nfs
nfs-provisioner-cd5589cfc-pjwsq 1/1 Running
二、创建storageclass,动态供给pv
[root@k8s-master1]# cat nfs-storageclass.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: nfs
provisioner: example.com/nfs
[root@k8s-master1]# kubectl apply -f nfs-storageclass.yaml
#查看storageclass是否创建成功
[root@k8s-master1 nfs]# kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE
nfs example.com/nfs Delete Immediate
#显示内容如上,说明storageclass创建成功了
注意:provisioner处写的example.com/nfs应该跟安装nfs provisioner时候的env下的PROVISIONER_NAME的value值保持一致,如下:
env:
- name: PROVISIONER_NAME
value: example.com/nfs
三、创建pvc,通过storageclass动态生成pv
[root@k8s-master1]# cat claim.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-claim1
spec:
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 1Gi
storageClassName: nfs
[root@k8s-master1]# kubectl apply -f claim.yaml
persistentvolumeclaim/test-claim1 created
#查看是否动态生成了pv,pvc是否创建成功,并和pv绑定
[root@k8s-master1 nfs]# kubectl get pvc

#通过上面可以看到test-claim1的pvc已经成功创建了,绑定的pv是pvc- 9cf7b015-bdba-41be-a1c9-bc88853a9283,这个pv是由storageclass调用nfs provisioner自动生成的。
步骤总结:
1、供应商:创建一个nfs provisioner
2、创建storageclass,storageclass指定刚才创建的供应商
3、创建pvc,这个pvc指定storageclass
四、创建pod,挂载storageclass动态生成的pvc:test-claim1
[root@k8s-master1]# cat read-pod.yaml
kind: Pod
apiVersion: v1
metadata:
name: read-pod
spec:
containers:
- name: read-pod
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: nfs-pvc
mountPath: /usr/share/nginx/html
restartPolicy: "Never"
volumes:
- name: nfs-pvc
persistentVolumeClaim:
claimName: test-claim1
#更新资源清单文件
[root@k8s-master1 nfs]# kubectl apply -f read-pod.yaml
pod/read-pod created
#查看pod是否创建成功
[root@k8s-master1 nfs]# kubectl get pods | grep read
read-pod 1/1 Running 0
更多推荐

所有评论(0)