本文主要是介绍【kubernetes】持久化存储 —— 存储类storageclass,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言
PV和PVC模式都是需要先创建好PV,然后定义好PVC和PV进行一对一的Bond后,才可以创建Pod进行使用。
但是如果PVC请求成千上万,那么就需要创建成千上万的PV,对于运维人员来说维护成本很高。因此,Kubernetes提供一种自动创建PV的机制,叫StorageClass。它的作用就是创建PV的模板。k8s集群管理员通过创建storageclass可以动态生成一个存储卷PV供k8s的PVC使用。
StorageClass 对象
每个 StorageClass 都包含 provisioner、parameters 和 reclaimPolicy 字段。
在 StorageClass 需要动态制备 PersistentVolume 以满足 PersistentVolumeClaim (PVC) 时使用到。
StorageClass 对象的命名很重要,用户使用这个命名来请求生成一个特定的类。 当创建 StorageClass 对象时,管理员设置 StorageClass 对象的命名和其他参数。
具体来说,StorageClass会定义以下两部分:
1、PV的属性 ,比如存储的大小、类型等;
2、创建这种PV需要使用到的存储插件,比如Ceph、NFS等
有了这两部分信息,Kubernetes就能够根据用户提交的PVC,找到对应的StorageClass,然后Kubernetes就会调用 StorageClass声明的存储插件,创建出需要的PV。
常用字段
# kubectl explain storageclassallowVolumeExpansion <boolean> # 是否允许卷扩展,见下图
allowedTopologies <[]Object>
apiVersion <string>
kind <string>
metadata <Object>
mountOptions <[]string>
parameters <map[string]string> # 定义相关参数
provisioner <string> -required- # 供应商,指定使用哪种存储来创建pv,见下图
reclaimPolicy <string> # pv的回收策略 默认是Delete
volumeBindingMode <string>
-
每个 StorageClass 都有一个制备器(Provisioner),用来决定使用哪个卷插件制备 PV。 该字段必须指定。
-
当下层 StorageClass 的 allowVolumeExpansion 字段设置为 true 时,以下类型的卷支持卷扩展。
案例操作
一,创建存储类storageclass
1,创建sa
sa的全称是serviceaccount。
serviceaccount是为了方便Pod里面的进程调用Kubernetes API或其他外部服务而设计的。
指定了serviceaccount之后,我们把pod创建出来了,我们在使用这个pod时,这个pod就有了我们指定的账户的权限了。
# cat serviceaccount.yaml apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-provisioner
kubectl get sa[ServiceAccount]
2,对sa授权
对创建的账号:nfs-provisioner 进行RBAC授权。
kubectl create clusterrolebinding nfs-provisioner-clusterrolebinding --clusterrole=cluster-admin --serviceaccount=default:nfs-provisioner
3,安装nfs-provisioner程序
# 创建 /data/nfs_pro 成为nfs的共享目录
mkdir /data/nfs_pro -p# 加入共享配置文件中最后
vim /etc/exports
/data/nfs_pro *(rw,no_root_squash)# 加载配置文件
exportfs -arv
4,创建供应商 provisioner
# vim nfs-deployment.yamlapiVersion: apps/v1
kind: Deployment
metadata:name: nfs-provisioner
spec:selector:matchLabels:app: nfs-provisionerreplicas: 1strategy:type: Recreate # 定义回收策略,保留template:metadata:labels:app: nfs-provisionerspec:serviceAccount: nfs-provisioner # 设置账户sacontainers:- name: nfs-provisionerimage: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0imagePullPolicy: IfNotPresentvolumeMounts:- name: nfs-client-root # 卷名与volumes卷名一致mountPath: /persistentvolumes # pod内部共享路径env:- name: PROVISIONER_NAME # 供应商名value: example.com/nfs # 供应商值- name: NFS_SERVER # NFS服务器名value: 192.168.40.180 # NFS自己的宿主机ip- name: NFS_PATH # NFS共享目录名value: /data/nfs_pro/ # NFS创建的共享目录volumes:- name: nfs-client-root # 存储卷名 要与加载卷 相同nfs:server: 192.168.40.180 # NFS自己的宿主机ippath: /data/nfs_pro/ # NFS创建的共享目录
5,创建存储类storageclass
# cat nfs-storageclass.yaml apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs # 存储类的名字,下一步要用到
provisioner: example.com/nfs # 供应商要与上一步创建的供应商相同
kubectl get sc[storageclass]
6,创建pvc,采用storageclass动态生成pv
创建pvc的同时,通过storageclass动态也生成了pv
# cat pvc-claim.yaml kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: test-claim1 # pvc名称,下一步创建pod要用
spec:accessModes: ["ReadWriteMany"]resources:requests:storage: 1GistorageClassName: nfs # 与上一步创建的存储类【nfs】名称一致
# 生成了pvc
kubectl get pvc[PersistentVolumeClaim]# 生成了pv
kubectl get pv[PersistentVolume]
【步骤总结】:
1、供应商:创建一个nfs provisioner
2、创建storageclass,storageclass指定刚才创建的供应商
3、创建pvc,这个pvc指定storageclass
二,用存储类storageclass创建pod
1,创建pod
创建pod,挂载storageclass动态生成的pvc:test-claim1
# cat read-pod.yaml kind: Pod
apiVersion: v1
metadata:name: read-pod
spec:containers:- name: read-podimage: nginximagePullPolicy: IfNotPresentvolumeMounts:- name: nfs-pvc # volumes名称相同mountPath: /usr/share/nginx/htmlrestartPolicy: "Never"volumes:- name: nfs-pvc # 名称要与volumeMounts相同persistentVolumeClaim:claimName: test-claim1 # pvc名称,上一步已经创建
kubectl apply -f read-pod.yaml
2,验证存储共享目录
这篇关于【kubernetes】持久化存储 —— 存储类storageclass的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!