• 欢迎来到本博客,希望可以y一起学习与分享

k8s之创建NFS的StorageClass

笔记 benz 5个月前 (05-02) 29次浏览 0个评论 扫描二维码
文章目录[隐藏]

动态存储供应整体过程

如何创建StorageClass

把创建StorageClass要做的的事情理清楚:

    1. 创建namespace,这里用hello-storageclass(您也可以选用自己喜欢的);
    2. 创建rbac:因为StorageClass有对应的pod要运行,每个pod都有自己的身份即serviceaccount,而这个serviceaccount是和某个角色绑定的,所以要创建:serviceaccount、rule、rolebinding;
    3. 创建provisioner,即关联NFS的工作类,负责给PVC提供存储资源,这里用的是nfs-client-provisioner;
    4. 创建StorageClass,所有需要PVC通过该StorageClass即可获得存储空间;

我们这里演示一下NFS的动态PV创建

kubernetes本身支持的动态PV创建不包括nfs,所以需要使用额外插件实现。nfs-client

创建NFS的StorageClass

注意:先有一台NFS服务器,搭建教程在这里
要每一个节点都安装nfs-utils

查看

显示如下,即为成功

 

这里准备的NFS服务器IP地址:192.168.50.135,文件夹:/nfs
NFS的StorageClass官方教程地址:https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner
官方有2种安装方法:helm安装和无helm安装

使用helm安装

自定义安装

下载

应该先安装Git:

克隆项目

进入目录

有如下文件

设定授权

如果您的集群启用了RBAC,或者您正在运行OpenShift,则必须授权配置程序。如果您位于“default”之外的名称空间/项目中,请编辑deploy/rbac.yaml

 

自定义NFS Provisioner

编辑deploy/deployment.yaml文件,以添加NFS服务器的连接信息。

 

注意:如果你更换了镜像(image: k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2),那么evn->name: PROVISIONER_NAME也需要更改为镜像的名称。
镜像还有:image: quay.io/external_storage/nfs-client-provisioner,可以更换。
要禁用领导者选举,请定义一个名为ENABLE_LEADER_ELECTION的环境变量,并将其值设置为false

定义Storage Class

参数:

名称 描述 默认
onDelete 如果存在并且具有删除值,则删除目录;如果存在并且具有保留值,则保存目录。 将在共享上以名称存档: archived-<volume.Name>
archiveOnDelete 如果它存在并且具有错误的值,请删除目录。如果onDelete存在,archiveOnDelete将被忽略。 将在共享上以名称存档: archived-<volume.Name>
pathPattern 指定用于通过PVC元数据(例如标签,注释,名称或名称空间)创建目录路径的模板。要指定元数据使用${.PVC.<metadata>}。示例:如果文件夹应命名为like <pvc-namespace>-<pvc-name>,则${.PVC.namespace}-${.PVC.name}用作pathPattern。

编辑class.yaml

完整的部署文件

创建文件

写入以下内容

部署

查看状态

测试

创建测试检查是否部署成功

创建PVC

test-storageclass-claim.yaml

部署

 

确保PVC状态为Bound

创建测试pod,查看是否可以正常挂载

输入以下内容:

部署:

查看部署的状态:

 

检查结果:
去NFS服务端,查看:

显示有SUCCESS文件,即为成功。

卸载测试

 

关于StorageClass回收策略对数据的影响

1.第一种配置

测试结果:
1.pod删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
2.sc删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
3.删除PVC后,PV被删除且NFS Server对应数据被删除

2.第二种配置

测试结果:

1.pod删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
2.sc删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
3.删除PVC后,PV不会别删除,且状态由Bound变为Released,NFS Server对应数据被保留
4.重建sc后,新建PVC会绑定新的pv,旧数据可以通过拷贝到新的PV中

3.第三种配置

结果:
1.pod删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
2.sc删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
3.删除PVC后,PV不会别删除,且状态由Bound变为Released,NFS Server对应数据被保留
4.重建sc后,新建PVC会绑定新的pv,旧数据可以通过拷贝到新的PV中

4.第四种配置

结果:

1.pod删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
2.sc删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
3.删除PVC后,PV不会别删除,且状态由Bound变为Released,NFS Server对应数据被保留
4.重建sc后,新建PVC会绑定新的pv,旧数据可以通过拷贝到新的PV中

总结

除以第一种配置外,其他三种配置在PV/PVC被删除后数据依然保留

常见问题

1.如何设置默认的StorageClass

我们可以用 kubectl patch 命令来更新:

或者YAML文件

2.如何使用默认的StorageClass

如果集群有一个默认的StorageClass能够满足我们的需求,那么剩下所有需要做的就是创建PersistentVolumeClaim(PVC),剩下的都有默认的动态配置搞定,包括无需去指定storageClassName:

3.修改默回收策略(默认为Delete)

4.能过删除/关闭默认的StorageClass

不能删除默认的StorageClass,因为它是作为集群的add-on安装的,如果它被删除,会被重新安装。
当然,可以停掉默认的StorageClass行为,通过删除annotation:storageclass.beta.kubernetes.io/is-default-class,或者设置为false
如果没有StorageClass对象标记默认的annotation,那么PersistentVolumeClaim对象(在不指定StorageClass情况下)将不自动触发动态配置。相反,它们将回到绑定可用的*PersistentVolume(PV)*的状态。

5.当删除PersistentVolumeClaim(PVC)会发生什么

如果一个卷是动态配置的卷,则默认的回收策略为“删除”。这意味着,在默认的情况下,当PVC被删除时,基础的PV和对应的存储也会被删除。如果需要保留存储在卷上的数据,则必须在PV被设置之后将回收策略从delete更改为retain。

参考

k8s学习笔记之StorageClass+NFS


文章 k8s之创建NFS的StorageClass 转载需要注明出处
喜欢 (0)

您必须 登录 才能发表评论!