前面学了kubernetes的资源对象,也大概说了下StatefulSet 有状态应用和无状态应用,我们可以通过hostPath或者emptyDir的方式来持久化数据,为了使得容器在重建后,数据卷还可以正常的使用,Kubernetes 引入了PV和PVC的概念,这两个就是对资源对象来进行存储管理的。
管理存储是管理计算的一个明显问题。该PersistentVolume子系统为用户和管理员提供了一个API,用于抽象如何根据消费方式提供存储的详细信息。为此,我们引入了两个新的API资源:PersistentVolume和PersistentVolumeClaim
PersistentVolume(PV)是集群中由管理员配置的一段网络存储。它是集群中的资源,就像节点是集群资源一样。PV是容量插件,如Volumes,但其生命周期独立于使用PV的任何单个pod。此API对象捕获存储实现的详细信息,包括Ceph,NFS,iSCSI或特定于云提供程序的存储系统。都是通过插件机制完成与共享存储的对接。
PersistentVolumeClaim(PVC)是由用户进行存储的请求。它类似于pod。Pod消耗节点资源,PVC消耗PV资源。Pod可以请求特定级别的资源(CPU和内存)。声明可以请求特定的大小和访问模式(例如,可以一次读/写或多次只读)。虽然PersistentVolumeClaims允许用户使用抽象存储资源,但是PersistentVolumes对于不同的问题,用户通常需要具有不同属性(例如性能)。群集管理员需要能够提供各种PersistentVolumes不同的方式,而不仅仅是大小和访问模式,而 PVC 可以请求特定的存储空间和访问模式。对于真正使用存储的用户不需要关心底层的存储实现细节,只需要直接使用 PVC 即可。
但是通过 PVC 请求到一定的存储空间也很有可能不足以满足应用对于存储设备的各种需求,而且不同的应用程序对于存储性能的要求可能也不尽相同,比如读写速度、并发性能等,为了解决这一问题,Kubernetes 又为我们引入了一个新的资源对象:StorageClass,通过 StorageClass 的定义,管理员可以将存储资源定义为某种类型的资源,比如快速存储、慢速存储等,用户根据 StorageClass 的描述就可以非常直观的知道各种存储资源的具体特性了,这样就可以根据应用的特性去申请合适的存储资源了。
为了方便演示,决定使用相对简单的 NFS 这种存储资源,接下来我们在节点192.168.86.100上来安装 NFS 服务
mkdir -p /data/k8s/
systemctl stop firewalld.service
systemctl disable firewalld.service
yum -y install nfs-utils rpcbind
chmod 777 /data/k8s/
文件在 /etc/exports 文件下,在该文件中添加下面的配置信息
vi /etc/exports
# /data/k8s *(rw,sync,no_root_squash)
/data/k8s:是共享的数据目录 *:表示任何人都有权限连接,当然也可以是一个网段,一个 IP,也可以是域名 rw:读写的权限 sync:表示文件同时写入硬盘和内存 norootsquash:当登录 NFS 主机使用共享目录的使用者是 root 时,其权限将被转换成为匿名使用者,通常它的 UID 与 GID,都会变成 nobody 身份
*⑥ 【Master节点配置】启用 rpc 注册
看到 Started 证明启动成功了
systemctl start rpcbind.service
systemctl enable rpcbind
systemctl status rpcbind
看到 Started 证明启动成功了
systemctl start nfs.service
systemctl enable nfs
systemctl status nfs
rpcinfo -p|grep nfs
cat /var/lib/nfs/etab
systemctl stop firewalld.service
systemctl disable firewalld.service
yum -y install nfs-utils rpcbind
systemctl start rpcbind.service
systemctl enable rpcbind.service
systemctl start nfs.service
systemctl enable nfs.service
showmount -e 192.168.86.100
mkdir -p /root/course/kubeadm/data
mount -t nfs 192.168.86.100:/data/k8s /root/course/kubeadm/data
echo "idig8.com">>/root/course/kubeadm/data/a.txt
cat /root/course/kubeadm/data/a.txt
cat /data/k8s/a.txt
上边说明NFS服务搭建完毕。
https://kubernetes.io/docs/concepts/storage/persistent-volumes/
PV 作为存储资源,主要包括存储能力、访问模式、存储类型、回收策略等关键信息,
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
path: /data/k8s
server: 192.168.86.100
kubectl apply -f pv-demo.yaml
pv1 已经创建成功了,状态是 Available,表示 pv1 就绪,可以被 PVC 申请。
一个 PV 对象都要指定一个存储能力,通过 PV 的 capacity属性来设置的,目前只支持存储空间的设置,就是我们这里的 storage=1Gi,不过未来可能会加入 IOPS、吞吐量等指标的配置。
用于描述用户应用对存储资源的访问权限
ReadWriteOnce(RWO)
读写权限,但是只能被单个节点挂载
ReadOnlyMany(ROX)
只读权限,可以被多个节点挂载
ReadWriteMany(RWX)
读写权限,可以被多个节点挂载
Volume 插件支持的访问模式
PV 支持的策略有三种: Retain(保留),Recycle(回收),Delete(删除)。目前只有 NFS 和 HostPath 两种类型支持回收策略。当然一般来说还是设置为 Retain 。
Retain(保留)
保留数据,需要管理员手工清理数据。
Recycle(回收)
清除 PV 中的数据,效果相当于执行 rm -rf /thevoluem/*。
Delete(删除)
与 PV 相连的后端存储完成 volume 的删除操作,当然这常见于云服务商的存储服务,比如 ASW EBS。
会处于4中不同的阶段
Available(可用)
表示可用状态,还未被任何 PVC 绑定
Bound(已绑定)
表示 PVC 已经被 PVC 绑定
Released(已释放)
PVC 被删除,但是资源还未被集群重新声明
Failed(失败)
表示该 PV 的自动回收失败
PS:这次主要说了PV里面的参数说明。下次说PVC的声明方法和具体的使用。