云原生 | kubernetes 持久化存储 - StorageClass动态绑定PV
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生 | kubernetes 持久化存储 - StorageClass动态绑定PV相关的知识,希望对你有一定的参考价值。
Dynamic Volume Provisioning 的实现基于 StorageClass
这个API 对象。 每个对象都会指定一个卷插件(又名 provisioner)
简述
StorageClass 对象的作用其实就是创建 PV
的模板。每个StorageClass 都包含 provisioner
、parameters
和 reclaimPolicy
字段, 这些字段会在 StorageClass 需要动态分配 PersistentVolume 时会使用到。
StorageClass对象
简单来说分为两部分:
- PV的属性。 比如,存储类型、Volume 的大小等
- 创建 PV 需要用到的存储插件(provisioner)。比如,nfs,ceph等
#####官网案例
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Retain
allowVolumeExpansion: true
mountOptions:
- debug
volumeBindingMode: Immediate
有了这两个主体信息之后,k8s就可以根据用户提交的PVC
,找到对应的StorageClass,调用sc声明的provisioner 去创建PV
回收策略
目前的回收策略有:
- Retain -- 手动回收
- Recycle -- 需要擦除后才能再次使用
- Delete -- 当用户删除对应的 PersistentVolumeClaim 时,动态配置的 volume 将被自动删除。
状态
一个Volume卷发生的状态:
- Available:空闲的资源,未绑定给PVC
- Bound:成功绑定PVC
- Released:PVC已经被删除,但PV还没有被集群回收
- Failed:PV回收失败
实战
这里通过NFS服务为例,创建我们的动态资源绑定
前提条件:
我们使用Kubernetes的包管理工具Helm来部署自动配置器,自动创建持久卷
1、添加存储库
[root@ycloud ycloud]# helm repo add kubesphere https://charts.kubesphere.io/main
[root@ycloud ycloud]# helm repo ls
NAME URL
kubesphere https://charts.kubesphere.io/main
2、把我们需要的包拉到本地,方便大家查看其中的内容
[root@ycloud ycloud]# helm pull kubesphere/nfs-client-provisioner
3、拉下来的是一个压缩包,我们需要把它解压到指定目录
[root@ycloud ycloud]#ls
nfs-client-provisioner-4.0.11.tgz
[root@ycloud ycloud]# tar -zxvf nfs-client-provisioner-4.0.11.tgz -C /ycloud
[root@ycloud ycloud]# cd nfs-client-provisioner
[root@ycloud nfs-client-provisioner]# ll
total 28
-rw-r--r-- 1 root root 482 Sep 26 2021 Chart.yaml
drwxr-xr-x 2 root root 4096 Oct 22 22:09 ci
-rw-r--r-- 1 root root 74 Sep 26 2021 OWNERS
-rw-r--r-- 1 root root 5194 Sep 26 2021 README.md
drwxr-xr-x 2 root root 4096 Oct 22 22:39 templates
-rw-r--r-- 1 root root 1712 Oct 22 22:13 values.yaml
4、修改配置
[root@ycloud nfs-client-provisioner]# vi values.yaml
replicaCount: 1
strategyType: Recreate
image:
repository: registry.cn-beijing.aliyuncs.com/kubesphereio/nfs-subdir-external-provisioner
tag: v4.0.2
pullPolicy: IfNotPresent
nfs:
server: 192.168.100.10 ##### nfs-server地址
path: /data/nfs-data ##### nfs配置的共享目录
mountOptions:
# For creating the StorageClass automatically:
storageClass:
create: true
# Set a provisioner name. If unset, a name will be generated.
# provisionerName:
# Set StorageClass as the default StorageClass
# Ignored if storageClass.create is false
defaultClass: false
# Set a StorageClass name
# Ignored if storageClass.create is false
name: nfs-client
# Allow volume to be expanded dynamically
allowVolumeExpansion: false
# Method used to reclaim an obsoleted volume
reclaimPolicy: Delete
# When set to false your PVs will not be archived by the provisioner upon deletion of the PVC.
archiveOnDelete: true
·······
我们这里只需要修改nfs.server和nfs.path内容即可,下面内容用于自动创建StorageClass,name可以修改为我们熟悉的名称,默认的reclaimPolicy
为Delete。
5、接下来让我们创建它到指定的Namespace
[root@ycloud nfs-client-provisioner]# kubectl create ns nfs-pro
[root@ycloud nfs-client-provisioner]# helm install nfs-provisioner ../nfs-client-provisioner -n nfs-pro
NAME: nfs-provisioner
LAST DEPLOYED: Sat Oct 22 22:15:00 2022
NAMESPACE: nfs-pro
STATUS: deployed
REVISION: 1
TEST SUITE: None
到这里我们已经创建结束了,我们可以通过Helm来查看其应用,也可直接查看Pod的状态,可以看到Pod在正常运行。
[root@ycloud nfs-client-provisioner]# helm ls -A
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
nfs-provisioner nfs-pro 1 2022-10-22 22:15:00.327920762 +0800 CST deployed nfs-client-provisioner-4.0.11 4.0.2
[root@ycloud nfs-client-provisioner]# kubectl get po -n nfs-pro
NAME READY STATUS RESTARTS AGE
nfs-provisioner-nfs-client-provisioner-bdf4b4df7-6sjzr 1/1 Running 0 61m
验证
接下来就到了验证,我们创建的StorageClass 可不可直接绑定PV
[root@ycloud nfs-client-provisioner]# kubectl describe sc nfs-client
Name: nfs-client
IsDefaultClass: No
Annotations: meta.helm.sh/release-name=nfs-provisioner,meta.helm.sh/release-namespace=nfs-pro
Provisioner: cluster.local/nfs-provisioner-nfs-client-provisioner
Parameters: archiveOnDelete=true
AllowVolumeExpansion: False
MountOptions: <none>
ReclaimPolicy: Delete
VolumeBindingMode: Immediate
Events: <none>
我们只需要在PVC里指定要使用的StorageClass名字即可
[root@ycloud ycloud]# cat pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-test
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Mi
storageClassName: nfs-client
可以看到,我们在这个 PVC 里添加了一个叫作 storageClassName 的字段,用于指定该 PVC 所要使用的 StorageClass 的名字是:nfs-client。
让我们去创建它,并查看详细内容,可以看到我们创建的PVC会绑定一个K8s自动创建的PV
[root@ycloud ycloud]# kubectl apply -f pvc.yaml
persistentvolumeclaim/my-test created
[root@ycloud ycloud]# kubectl describe pvc my-test
Name: my-test
Namespace: gstrain-pipeline
StorageClass: nfs-client
Status: Bound
Volume: pvc-4403ad46-2813-4e22-8501-32fb9a101a13
Labels: <none>
Annotations: pv.kubernetes.io/bind-completed: yes
pv.kubernetes.io/bound-by-controller: yes
volume.beta.kubernetes.io/storage-provisioner: cluster.local/nfs-provisioner-nfs-client-provisioner
Finalizers: [kubernetes.io/pvc-protection]
Capacity: 500Mi
Access Modes: RWO
VolumeMode: Filesystem
Used By: <none>
通过查看创建出来的PVC,我们可以清楚看到,和我们创建的PVC存储属性是一致的
总结
我们通过PV和PVC了解了StorageClass是干什么用的。自动绑定会极大的帮助我们减少创建PV
的时间。你还在手动的去创建PV
吗?
参考文献
https://kubernetes.io/zh-cn/docs/concepts/storage/storage-classes/
https://kubernetes.io/zh-cn/docs/concepts/storage/dynamic-provisioning/
以上是关于云原生 | kubernetes 持久化存储 - StorageClass动态绑定PV的主要内容,如果未能解决你的问题,请参考以下文章
云原生 | kubernetes 持久化存储 - StorageClass动态绑定PV
Rook:Kubernetes上提供Kubernetes云原生本地持久存储
剑指企业级云原生,阿里云 CNFS 如何破局容器持久化存储困境