🐇明明跟你说过:个人主页
🏅个人专栏:《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创建的过程
- 首先,我们搭建了NFS服务,用于存储数据
- 其次,我们部署了 NFS Client Provisioner,它将作为供应商,为storageclass动态提供存储服务
- 然后,创建了storageclass,存储类的作用是动态为PVC生成PV
- 之后,我们创建了一个PVC,这个PVC使用storageclass作为存储
- 最后,我们创建了一个Pod。并挂载了PVC。测试动态生成PV和持久化存储是否成功
2、Pod使用PVC的过程
- 首先,我们创建了一个Pod,并为Pod添加了数据卷,挂载到nginx家目录下,数据卷的类型为PVC
- PVC在创建时,会向storageclass申请一个PV,并进行绑定
- storageclass接到请求后,会向 nfs-provisioner供应商进行申请
- nfs-provisioner供应商收到请求后,就会在后端的NFS服务器的数据目录创建一个目录,并将目录供给个PV使用
以上,就是storageclass动态生成PV的全部过程,如果您有不同的看法,欢迎您在评论区留言
💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Kubernetes的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺
🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!
版权归原作者 明明跟你说过 所有, 如有侵权,请联系我们删除。