学习
实践
活动
专区
工具
TVP
写文章
专栏首页实战dockerK8S的StorageClass实战(NFS)

K8S的StorageClass实战(NFS)

关于StorageClass

在K8S环境,当pod需要存储空间时,StorageClass比PV更灵活和方便,官方文档地址:https://kubernetes.io/docs/concepts/storage/persistent-volumes/

本次实战

本次实战的目标是快速创建NFS类型的StorageClass,并验证该StorageClass正常可用,全文由以下部分组成:

  1. 创建StorageClass;
  2. 通过helm下载tomcat的chart;
  3. 修改chart,让tomcat使用刚才创建的StorageClass;
  4. 在NFS服务端检查文件夹已正常写入;

环境信息和准备工作

以下是创建StorageClass必备的环境信息:

  1. Kubernetes:1.15
  2. Kubernetes宿主机:CentOS Linux release 7.7.1908
  3. NFS服务:IP地址192.168.50.135,文件夹/volume1/nfs-storageclass-test

参考文章

如果您想了解Kubernetes和NFS搭建的更多信息,请参考:

  1. 《kubespray2.11安装kubernetes1.15》
  2. 《Ubuntu16环境安装和使用NFS》
  3. 《K8S使用群晖DS218+的NFS》

如果您已经准备好了kubernetes和NFS,咱们就开始实战吧;

如何创建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即可获得存储空间;

接下来请SSH登录kubernetes环境,按照上述步骤操作;

创建StorageClass

  1. 创建namespace:kubectl create namespace hello-storageclass
  2. 创建rbac的脚本直接从我的github下载吧,地址:https://raw.githubusercontent.com/zq2599/blog_demos/master/storageclass-demo/rbac.yaml
  3. 下载的rbac.yaml文件中,namespace是kafka-test,现在要替换成hello-storages,执行命令替换:sed -i ‘s/kafka-test/hello-storageclass/’ rbac.yaml
  4. 创建rbac:kubectl apply -f rbac.yaml
  5. 创建provisioner的脚本也从我的github下载,地址:https://raw.githubusercontent.com/zq2599/blog_demos/master/storageclass-demo/deployment.yaml
  6. 下载的deployment.yaml文件中,namespace是kafka-test,现在要替换成hello-storages,执行命令替换:sed -i ‘s/kafka-test/hello-storageclass/’ deployment.yaml
  7. 打开deployment.yaml,设置NFS参数,修改下图红框的四个参数,红框1和3都是NFS server地址,红框2和4都是NFS分配的文件夹目录,请您按照实际的NFS资源来设置:
  1. 创建provisioner:kubectl apply -f deployment.yaml
  2. 强烈建议用kubectl describe pod xxxxxx -n hello-storageclass和kubectl logs -f xxxxxx -n hello-storageclass命令查看provisioner是否成功创建,下图是我曾经遇到的问题,NFS服务端权限设置有误导致NFS无法使用:
  1. 创建StorageClass的脚本也从我的github下载,地址:https://raw.githubusercontent.com/zq2599/blog_demos/master/storageclass-demo/class.yaml
  2. 下载的class.yaml无需修改,直接使用:kubectl apply -f class.yaml
  3. class.yaml中的StorageClass名为managed-nfs-storage,后面的PVC就用这个名字去申请存储空间;
  4. 用df命令来检查挂载情况,发现NFS的已经挂载到K8S宿主机:
  1. 至此,StorageClass已经就绪,K8S环境中的PVC可以申请使用了,接下来通过实战验证应用的pod能否使用StorageClass的存储空间;

准备工作

  1. 接下来的实战是通过helm在kubernetes部署tomcat,该tomcat所需的存储空间是通过StorageClass分配的,请您在kubernetes上准备好helm,我这里用的是2.16版本
  2. helm的安装和使用请参考《部署和体验Helm(2.16.1版本)》

tomcat使用StorageClass实战

  1. 增加helm仓库(带有tomcat的仓库):helm repo add bitnami https://charts.bitnami.com/bitnami
  2. 下载tomcat的chart:helm fetch bitnami/tomcat
  3. chart下载成功后,当前目录出现tomcat配置压缩包tomcat-6.2.4.tgz,解压:tar -zxvf tomcat-6.2.4.tgz
  4. 解压得到tomcat文件夹,进入后打开values.yaml文件,找到persistence节点,增加下图红框中的内容:
  1. 在tomcat目录下执行命令:
helm install --name-template tomcat001 -f values.yaml . --namespace hello-storageclass
  1. 查看tomcat的pod和service情况,一切正常,并且端口映射到了宿主机的30300:
  1. 浏览器访问宿主机IP:30300,出现tomcat欢迎页面:
  1. 去NFS server检查磁盘使用情况,如下图,可见已分配给tomcat的PVC,并且写入了tomcat的基本数据:

清理资源

本次实战创建了各种类型的资源,使用下面的命令可以将其全部清理掉:

helm del --purge tomcat001
kubectl delete storageclass managed-nfs-storage
kubectl delete deployment nfs-client-provisioner -n hello-storageclass
kubectl delete clusterrolebinding run-nfs-client-provisioner
kubectl delete serviceaccount nfs-client-provisioner -n hello-storageclass
kubectl delete role leader-locking-nfs-client-provisioner -n hello-storageclass
kubectl delete rolebinding leader-locking-nfs-client-provisioner -n hello-storageclass
kubectl delete clusterrole nfs-client-provisioner-runner
kubectl delete namespace hello-storageclass

至此,StorageClass的创建和使用的实战就完成了,如果您在学习kubernetes存储相关的知识,希望本文能给您一些参考

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:http://blog.csdn.net/boling_cavalry复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • K8S环境快速部署Kafka(K8S外部可访问)

    本次实战涉及到的K8S、Helm、NFS、StorageClass等前置条件,它们的安装和使用请参考:

    程序员欣宸
  • 实战Kubernetes动态卷存储(NFS)

    之前的《 Kubernetes持久卷实战两部曲》系列中,我们实战了先声明一个存储卷,再使用这个存储卷,这种方式要求每次都要提前申明存储,不是很方便,而动态卷存储...

    程序员欣宸
  • Kubernetes 配置 StorageClass(NFS)

    在 k8s 环境,当pod需要存储空间时,StorageClass 比 PV 更灵活和方便。

    懒人的小脑
  • k8s的pv与pvc

    PV 的全称是:PersistentVolume(持久化卷),是对底层的共享存储的一种抽象,PV 由管理员进行创建和配置,它和具体的底层的共享存储技术的实现方式...

    SY小站
  • k8s添加nfs动态绑定存储(dynamic provisioning)nfs-server-provisioner

    我们在裸机上安装kubernetes(私有开发环境),通常要自行设置默认storage class,常用的本地存储方式provisioner: kubernet...

    全栈程序员站长
  • kubernetes中持久化存储之StorageClass

    上面介绍的PV和PVC模式是需要运维人员先创建好PV,然后开发人员定义好PVC进行一对一的Bond,但是如果PVC请求成千上万,那么就需要创建成千上万的PV,对...

    极客运维圈
  • 【K8S专栏】Kubernetes数据持久化管理

    Kubernetes为了能更好的支持有状态应用的数据存储问题,除了基本的HostPath和EmptyDir提供的数据持久化方案之外,还提供了PV,PVC和Sto...

    没有故事的陈师傅
  • 「走进k8s」Kubernetes1.15.1的持久化存储StorageClass(32)

    1.自动创建的 PV 以${namespace}-${pvcName}-${pvName}这样的命名格式创建在 NFS 服务器上的共享数据目录中。2.而当这个 ...

    IT架构圈
  • kubernetes中用NFS做后端存储支不支持PVC扩容?

    在虚拟机时代,我们经常会收到给磁盘扩容的需求,一般我们就是添加一块磁盘,然后做LVM扩容操作,那在容器时代,我们可以给PVC扩容吗?

    极客运维圈
  • 7-Kubernetes入门基础之存储Volume介绍

    描述: 我们知道在Docker中可以通过Volume将宿主机文件(配置文件、数据库等等)映射到Container内部供其容器内的应用程序使用。在Kubernrt...

    WeiyiGeek
  • 「走进k8s」Kubernetes1.15.1的持久化存储PV(31)

    https://kubernetes.io/docs/concepts/storage/persistent-volumes/

    IT架构圈
  • 安装KubeSphere

    官方中文文档:https://kubesphere.io/docs/zh-CN/introduction/what-is-kubesphere/

    py3study
  • 1.20版本TKE集群使用nfs-subdir-external-provisioner挂载nfs

    使用tke的时候,很多时候会用到共享存储,tke默认支持的共享存储有cos和cfs(类似于nfs),一般使用cfs的比较多,但是现在tke的cfs组件现在还不支...

    聂伟星
  • K8S的Kafka监控(Prometheus+Grafana)

    对于部署在K8S上的Kafka来说,Prometheus+Grafana是常用的监控方案,今天就来实战通过Prometheus+Grafana监控K8S环境的K...

    程序员欣宸
  • Kubernetes系列学习文章 - 存储实现(九)

    | 导语 数据,是无价的。了解清楚底层的存储实现方式对于数据的使用、保护以及IO性能的优化有很大的帮助。本篇文章从三个大点来讲讲K8S的存储实现机制。

    宝哥@上云专家
  • Rancher2 & K8S部署踩坑记录

    如果服务器上下载不了kubectl可去github release页面下载最新版kubectl,再上传至服务器

    Ewdager
  • k8s StorageClass使用攻略

    在 k8s 中当我们需要持久化存储一些数据的使用,会使用到的就是 PV 和 PVC,但 PV 和 PVC 都是需要手动创建的话会很麻烦,特别是当有 Statef...

    LinkinStar
  • 【云原生 | Kubernetes篇】Kubernetes(k8s)持久化(十七)

    有时,在单个 Pod 中共享卷以供多方使用是很有用的。 volumeMounts.subPath 属性可用于指定所引用的卷内的子路径,而不是其根路径。

    Lansonli

扫码关注腾讯云开发者

领取腾讯云代金券