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中的示例
百度词条