0


k8s 存储类(StorageClass)创建与动态生成PV解析,(附带镜像)

🐇明明跟你说过:个人主页

🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅

🔖行路有良友,便是天堂🔖

在上一章节中,我们讲述了k8s 存储类(StorageClass)如何动态创建PV的原理,本期将介绍如何在k8s中完成这一个过程的实践,旨在帮助读者搭建起自己的k8s与StorageClass体系

一、关键点回顾

1、k8s概述

Kubernetes单词起源于希腊语, 是“舵手”或者“领航员、飞行员”的意思。

Kubernetes(简称K8s)的前世今生可以追溯到谷歌(Google)内部的一个项目,它起源于2003年,当时谷歌正面临着不断增长的应用程序和服务的管理挑战。这个项目最初被称为"Borg",是一个早期的容器编排系统。Borg 的成功经验成为 Kubernetes 开发的契机。

有关k8s起源的介绍,请参考《初识K8s之前世今生、架构、组件、前景》这篇文章

Kubernetes的优点包括可移植性、可伸缩性和扩展性。它使用轻型的YAML清单文件实现声明性部署方法,对于应用程序更新,无需重新构建基础结构。管理员可以计划和部署容器,根据需要扩展容器并管理其生命周期。借助Kubernetes的开放源代码API,用户可以通过首选编程语言、操作系统、库和消息传递总线来构建应用程序,还可以将现有持续集成和持续交付(CI/CD)工具集成。

2、k8s存储类:storageclass

StorageClass是Kubernetes中的一种机制,它允许管理员定义一组存储卷的模板,以便动态地根据PVC的请求创建PV。使用StorageClass,管理员可以根据应用程序的需求,定义不同类型、性能和参数的存储卷模板,而不需要手动创建大量的PV。

StorageClass可以定义存储卷的类型、存储提供商、存储参数等信息,并将这些信息与一个特定的存储提供商或存储后端关联起来。当创建PVC并指定所需的存储类时,Kubernetes将根据存储类的定义自动创建满足要求的PV,并将其绑定到PVC上,从而实现存储资源的动态分配和管理。

通过使用StorageClass,管理员可以更加灵活地管理存储资源,提高资源利用率,减少手动操作的复杂性,降低维护成本,从而更好地满足不同应用的存储需求。

3、NFS简介

NFS,即网络文件系统(Network File System),是一种用于在计算机系统之间共享文件和目录的协议。NFS最初由Sun公司开发,目前已经成为全球广泛使用的网络文件系统之一,无论是在企业内部网络还是在云计算环境中。

NFS允许远程计算机像访问本地文件一样访问和操作远程文件,从而方便了多台计算机之间的文件共享和协作。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。NFS不仅适用于Linux与Unix之间实现文件共享,也能实现Linux与Windows间的文件共享功能。

NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,这样,从本地端的系统来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,使用上相当便利。

NFS的应用场景非常广泛,它可以用于办公环境,实现文件服务器的高可用性,保证数据的可靠传输和处理,提高工作效率;对于大型企业来说,NFS可以提供集中式的文件存储和管理,简化文件管理流程,降低运营成本。

二、k8s集群搭建

1、资源准备

k8s要求每个节点至少要有2核CPU和2G内存,并且关闭swap分区。实验环境建议硬盘空间40G以上,生产环境适当调整

2、集群搭建

这里搭建的k8s集群版本为v1.28.2,如果还未安装k8s,可以参考往期文章《深度解析:Kubernetes 1.28.2集群安装过程中的关键步骤》进行安装。

为了节省篇幅,我这里已经提前安装好了k8s集群

三、NFS服务器搭建

1、NFS Server搭建

我们存储类使用的是NFS供应商,因此,需要搭建一台NFS服务器,用于存储数据,如果还未搭建NFS服务器,可以参考《搭建NFS服务器,部署k8s集群,并在k8s中使用NFS作为持久化储存》这篇文章

2、创建数据目录并授权

在NFS服务器上执行

mkdir /exports/data -p
vim /etc/exports

#添加以下内容
/exports/data *(rw,no_root_squash)

使配置生效

exportfs -arv

四、创建StorageClass

1、创建运行nfs-provisioner需要的sa账号

[root@master ~]# vim sa.yaml
# 输入以下内容
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-provisioner

[root@master ~]# kubectl  apply -f sa.yaml 
serviceaccount/nfs-provisioner created

对刚刚创建的sa进行授权

[root@master ~]# kubectl create clusterrolebinding nfs-provisioner-clusterrolebinding --clusterrole=cluster-admin --serviceaccount=default:nfs-provisioner
clusterrolebinding.rbac.authorization.k8s.io/nfs-provisioner-clusterrolebinding created

2、部署 NFS Client Provisioner

在k8s Master节点新建部署NFS Client Provisioner的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: us.gcr.io/k8s-artifacts-prod/sig-storage/nfs-subdir-external-provisioner:v4.0.2
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: nfs-client
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: example.com/nfs
            - name: NFS_SERVER
              value: 192.168.40.132
            - name: NFS_PATH
              value: /exports/data
      volumes:
        - name: nfs-client
          nfs:
            server: 192.168.40.132
            path: /exports/data

所需镜像我已经放在资源《nfs-subdir-external-provisioner.tar》里了,大家可以下载后使用docker load -i 或** **ctr -n=k8s.io images import 命令导入到work节点。

创建NFS Client Provisioner

[root@master ~]# vim nfs-client.yaml
[root@master ~]# kubectl  apply -f nfs-client.yaml 
deployment.apps/nfs-provisioner created

3、创建StorageClass

编辑创建StorageClass的YAML文件

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storageclass
provisioner: example.com/nfs # 与上面 Deployment 中的 PROVISIONER_NAME 匹配
# parameters:
# #   archiveOnDelete: "false" # 可选,控制 PVC 删除时 PV 是否保留数据,默认为删除

五、测试使用

1、创建PVC

创建一个PVC。使用刚刚创建的storageclass,看storageclass是否会动态生成PV

编辑创建PVC的YAML文件

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-nfs-pvc
spec:
  accessModes:
    - ReadWriteMany # 或 ReadWriteOnce,取决于 NFS 共享配置
  storageClassName: nfs-storageclass
  resources:
    requests:
      storage: 1Gi # 请求存储空间大小

创建PVC

[root@master ~]# kubectl apply -f  nfs-pvc.yaml

2、创建Pod

创建一个Pod,使用刚刚创建的PVC

编辑YAML文件

[root@master ~]# vim pod.yaml

添加如下内容

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  volumes:
    - name: my-volume
      persistentVolumeClaim:
        claimName: my-nfs-pvc   #填写刚刚创建的PVC的名称
  containers:
    - name: my-container
      image: nginx
      ports:
      - containerPort: 80
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: my-volume

创建Pod

[root@master ~]# kubectl apply -f  pod.yaml 

3、访问测试

在NFS服务器,cd到 /exports/data 数据目录下,查看动态生成的数据目录

进入到刚刚创建的pod生成的数据目录下

新建一个首页文件

echo "hello storageclass" > index.html

回到k8s Master节点上,查看刚刚创建的Pod的IP。并使用curl命令请求该Pod

可以看到返回的结果就是我们刚刚在NFS服务器上创建的首页文件,证明测试成功

六、总结

现在,让我们回顾一下整个过程

1、storageclass创建的过程

  1. 首先,我们搭建了NFS服务,用于存储数据
  2. 其次,我们部署了 NFS Client Provisioner,它将作为供应商,为storageclass动态提供存储服务
  3. 然后,创建了storageclass,存储类的作用是动态为PVC生成PV
  4. 之后,我们创建了一个PVC,这个PVC使用storageclass作为存储
  5. 最后,我们创建了一个Pod。并挂载了PVC。测试动态生成PV和持久化存储是否成功

2、Pod使用PVC的过程

  • 首先,我们创建了一个Pod,并为Pod添加了数据卷,挂载到nginx家目录下,数据卷的类型为PVC
  • PVC在创建时,会向storageclass申请一个PV,并进行绑定
  • storageclass接到请求后,会向 nfs-provisioner供应商进行申请
  • nfs-provisioner供应商收到请求后,就会在后端的NFS服务器的数据目录创建一个目录,并将目录供给个PV使用

以上,就是storageclass动态生成PV的全部过程,如果您有不同的看法,欢迎您在评论区留言

💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Kubernetes的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!


本文转载自: https://blog.csdn.net/weixin_53269650/article/details/137592622
版权归原作者 明明跟你说过 所有, 如有侵权,请联系我们删除。

“k8s 存储类(StorageClass)创建与动态生成PV解析,(附带镜像)”的评论:

还没有评论