kubernetes实现数据卷的方式是PV & PVC
PV有很多持久卷插件可以实现,例如:GCEPersistentDisk,AWSElasticBlockStore,NFS,ISCSI,RDB,Glusterfs,HostPath(单节点测试使用),本地持久卷
我们本次使用NFS方式,先介绍一下NFS。
NFS卷能将 NFS (网络文件系统) 挂载到您的 Pod 中。 不像 emptyDir 那样会在删除 Pod 的同时也会被删除,nfs 卷的内容在删除 Pod 时会被保存,卷只是被卸载掉了。 这意味着 nfs 卷可以被预先填充数据,并且这些数据可以在 Pod 之间”传递”。
NFS 是Network File System 的缩写,即网络文件系统,NFS是FreeBSD支持的文件系统中的一种。NFS基于RPC远程掉用实现,其允许一个系统在网络上与他人共享目录和文件,通过使用NFS,程序可以像使用本地文件一样使用远端系统上的文件。NFS是一个非常稳定的, 可移植的网络文件系统,具备可扩展和高性能特性,达到了企业级应用质量标准。由于网络速度的增加延时降低,NFS一直是通过网络系统提供文件系统服务的有竞争力选择
NFS原理
NFS的工作原理是使用客户端/服务器架构,由一个客户端程序和服务器程序组成。 从客户端的角度来说,NFS 中的第一个操作称为 mount。Mount 代表将远程文件系统加载到本地文件系统空间中。该流程以对 mount(Linux 系统调用)的调用开始,它通过 VFS 路由到 NFS 组件。确认了加载端口号之后(通过 get_port 请求对远程服务器 RPC 调用),客户端执行 RPC mount 请求。这一请求发生在客户端和负责 mount 协议(rpc.mountd)的特定守护进程之间。这一守护进程基于服务器当前导出文件系统来检查客户端请求;如果所请求的文件系统存在,并且客户端已经访问了,一个 RPC mount 响应为文件系统建立了文件句柄。客户端这边存储具有本地加载点的远程加载信息,并建立执行 I/O 请求的能力。这一协议表示一个潜在的安全问题;因此,NFSv4 用内部 RPC 调用替换这一辅助 mount 协议,来管理加载点
由于VFS的存在,客户端可以像使用其他普通文件系统一样使用NFS文件系统
安装NFS服务端
-
安装NFS服务端
# ubuntu apt-get install -y nfs-kernel-server # centos yum -y install nfs-utils rpcbind -
创建共享文件目录,并给目录添加读写权限
mkdir -p /kubernetes/volumes chmod a+rw /kubernetes/volumes -
配置NFS服务目录-打开文件
/etc/exports在尾部添加内容/kubernetes/volumes *(rw,sync,no_subtree_check,no_root_squash) -
配置生效
exportfs -r -
启动rpcbind、nfs服务
systemctl start rpcbind systemctl start nfs -
在 server 端先自我测试一下是否可以联机,展示出连接目录
showmount -e localhost命令解释
配置项 含义 * 任何ip都可以访问 rw 读写权限 sync 同步权限 no_subtree_check 如果输出目录是一个子目录,NFS服务器不检查其父目录的权限 no_root_squash 客户端连接服务端如果使用的也是root,那么也拥有对服务端分享目录的root权限
安装NFS客户端
我们找一个新的机器进行测试
-
安装客户端
yum -y install nfs-utils -
挂载
# 创建挂载目录 mkdir /testnfs # 挂载服务端 mount -t nfs 10.10.103.80:/kubernetes/volumes /testnfs # 查看挂载结果 df -h挂载之后,我们在客户端的
/testnfs文件夹下创建文件,会发现服务端的/kubernetes/volumes文件夹下的文件创建成功了。 -
取消挂载(非必须)
# 取消挂载命令 umount /testnfs挂载坑如果已经挂载了一个远程目录,服务端关闭,客户端进入根目录会失败,这时需要强制取消挂载 -lfumount -lf /testnfs
kubernetes 中使用数据卷
PV(Persistent Volume)是集群中的一块网络存储,和node一样也是集群的资源,PV和Volume类似,不过会有独立与Pod的生命周期,这一API对象包含了存储的实现细节,例如NFS,ISCSI或者其他云服务商提供的存储系统,PVC(Persistent Volume Claim)是用户的一个请求,跟pod类似,pod消费node资源,PVC消费PV资源。Pod能够申请特定的资源(CPU和内存),PVC能够请求特定的尺寸和访问模式(例如加载一个读写,以及多个只读实例)
PV 与PVC
PV是集群的资源。PVC对这一资源的请求,也是对资源的所有权检验,PV和PVC之间的互动遵循如下的生命周期:
供应: 集群管理员会创建一系列的PV,这些PV包含了为集群用户提供的真是存储资源,他们可利用kubernetes API 来消费。
绑定: 用户创建一个包含了容量可访问模式的持久卷申请,master会监听PVC的产生,并尝试根据请求内容查找匹配的PV,并把PV和PVC绑定,用户能够获取满足需要的资源, 并且在使用过程中可能超出请求数量,如果找不到合适的卷,这一申请就会持续处于绑定状态,一直到出现合适的PV,例如一个集群准备了很多的40G的持久卷,也无法响应41G的申请,除非把超过41G的PV加入集群
使用: pod把申请作为卷来使用。集群会通过PVC查找绑定的PV,并Mount给pod,对于支持多种访问方式的卷,用户在使用PVC作为卷的时候可以指定需要的访问方式,一旦用户拥有了一个已经绑定的PVC,被绑定的PV就归该用户所有了,用户的pod能够在pod的卷中包含PVC来访问他们占有的PV
释放: 当用户完成对卷的使用是,就可以利用API删除对应的PVC对象了。 而且他还可以重新申请,删除PVC后,对应的卷被视为“被释放”,但是这时还不能给其他的PVC使用,之前的PVC数据还保存在卷中,要根据策略来进行后续处理。
回收策略: PV的回收策略向集群阐述了在PVC释放卷的时候应如何进行后续工作,目前可以采用三种策略:Retain、Recycle、Delete
- Retain:保留策略允许重新申请这一资源。
- Recycle:基础擦除(rm -rf /thevolume/*)
- Delete:同时删除持久卷以及卷中存储的内容。如果插件支持。
创建PV
创建一个nfs-pv-logs.yml的配置文件
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv-logs
spec:
# 设置容量
capacity:
storage: 5Gi
volumeMode: Filesystem
# 访问模式
accessModes:
# ReadWriteOnce:单节点加载读写
# ReadWriteMany:多节点加载读写
- ReadWriteMany
# 回收策略,这里是人工重新申请
persistentVolumeReclaimPolicy: Retain
storageClassName: slow
mountOptions:
- hard
- nfsvers=4.1
nfs:
# NFS服务端配置的路径
path: /kubernetes/volumes
# NFS服务端ip
server: 10.10.103.80
readOnly: false
创建之前在所有的node节点上安装nfs客户端
创建PVC
创建文件nfs-pvc-logs-login.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc-log-all
spec:
accessModes:
# 要和PV一致的访问模式,
- ReadWriteMany
# 按需分配资源
resources:
requests:
storage: 1Gi
参考文档
kubernetes 官网-volumes
kubernetes 官网-persistent-volumes
github中的示例
百度词条
本文详细介绍Kubernetes中使用NFS实现数据卷(PV&PVC)的方法,包括NFS原理、服务端与客户端配置步骤,及如何在Kubernetes中创建PV、PVC,实现数据的持久化存储。
2万+

被折叠的 条评论
为什么被折叠?



