k8s持久化PV和PVC
Posted 全栈运维助手
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s持久化PV和PVC相关的知识,希望对你有一定的参考价值。
PV:
PV 的全称是:PersistentVolume(持久化卷),是对底层的共享存储的一种抽象,PV 由管理员进行创建和配置,它和具体的底层的共享存储技术的实现方式有关,比如 Ceph、GlusterFS、NFS 等,都是通过插件机制完成与共享存储的对接。
PVC:
PVC 的全称是:PersistentVolumeClaim(持久化卷声明),PVC 是用户存储的一种声明,PVC 和 Pod 比较类似,Pod 消耗的是节点,PVC 消耗的是 PV 资源,Pod 可以请求 CPU 和内存,而 PVC 可以请求特定的存储空间和访问模式。对于真正使用存储的用户不需要关心底层的存储实现细节,只需要直接使用 PVC 即可。
NFS:
NFS是基于UDP/IP协议的应用,其实现主要是采用远程过程调用RPC机制,RPC提供了一组与机器、操作系统以及低层传送协议无关的存取远程文件的操作。
一、部署NFS服务器
ip:192.168.229.146
1、关闭防火墙,安装nfs服务
//关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
//安装nfs
yum -y install nfs-utils rpcbind
2、创建工项目录,配置nfs配置文件
mkdir /nfsdata
vim /etc/exports
/nfsdata *(rw,sync,no_root_squash)
//启动nfs服务
systemctl start rpcbind
systemctl enable rpcbind
systemctl start nfs
systemctl enable nfs
/nfsdata:是共享的数据目录
*
:表示任何人都有权限连接rw:读写的权限
sync:表示文件同时写入硬盘和内存
no_root_squash:当登录 NFS 主机使用共享目录的使用者是 root 时,其权限将被转换成为匿名使用者,通常它的 UID 与 GID,都会变成 nobody 身份
二、在k8s的master和node安装nfs
yum -y install nfs-utils rpcbind
systemctl start rpcbind
systemctl enable rpcbind
systemctl start nfs
systemctl enable nfs
测试与NFS服务器的连通性
三、PV概述
有了NFS共享存储之后,就可以采用PV和PVC了,PV作为存储资源主要包括存储能力、访问模式、存储类型、回收策略等关键信息
1、使用NFS类型的后端存储,创建1G的存储空间,访问模式为ReadWriteOnce,回收策略也Recyle的PV
vim pv1-demo.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
path: /nfsdata
server: 192.168.229.146
kubectl apply -f pv-demo.yaml
NAME:pv的名称
CAPACITY:存储能力的空间大小
ACCESS MODES:访问模式
1、ReadWriteOnce(RWO):读写权限,但是只能被单个节点挂载
2、ReadOnlyMany(ROX):只读权限,可以被多个节点挂载
3、ReadWriteMany(RWX):读写权限,可以被多个节点挂载
RECLAIM POLICY:回收策略
1、Retain(保留)- 保留数据,需要管理员手工清理数据
2、Recycle(回收)- 清除 PV 中的数据,效果相当于执行 rm -rf /thevoluem/*
3、Delete(删除)- 与 PV 相连的后端存储完成 volume 的删除操作,当然这常见于云服务商的存储服务,比如 ASW EBS。
STATUS:PV状态
1、Available(可用):表示可用状态,还未被任何 PVC 绑定
2、Bound(已绑定):表示 PVC 已经被 PVC 绑定
3、Released(已释放):PVC 被删除,但是资源还未被集群重新声明
4、Failed(失败):表示该 PV 的自动回收失败
四、PVC概述
新建一个 1Gi 的存储容量,访问模式也是 ReadWriteOnce的PVC
vim pvc1-demo.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc-nfs
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
kubectl apply -f pvc1-demo.yaml
如上图在创建完PVC之后,上面创建的PV状态从Available变成了Bound,同时PVC的状态也变成了Bound,我们刚刚新建的 pvc 和我们的 pv 绑定成功了。
测试一、
PVC如何跟PV进行绑定?
先创建一个PVC邀请访问模式是 ReadWriteOnce,存储容量是 2Gi,最后我们还要求匹配具有标签 app=nfs 的 PV
vim pvc2-demo.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc2-nfs
spec:
accessModes:
ReadWriteOnce
resources:
requests:
storage: 2Gi
selector:
matchLabels:
app: nfs
kubectl apply -f pvc2-demo.yaml
如上图,创建完PVC之后发现STATUS状态为pending也就是等待状态,与此同时,所有的pv状态为Bound,下面在创建一个PV进行观察
vim pv2-demo.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv2-nfs
labels:
app: nfs
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
server: 192.168.229.146
path: /nfsdata
kubectl apply -f pv2-demo.yaml
如上图,在创建完新的PV之后,上面创建的PVC自动与新创建的pv进行了绑定,也就是说当我们创建完PVC之后,系统会自动匹配处于Available的pv进行绑定,同时pv和PVC的状态都变成Bound状态
测试二、
如果声明的PVC空间大于现有PV声明的空间是否能被绑定?
首先创建一个1G的pv
vim pv3-demo.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv3
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
path: /nfsdata
server: 192.168.229.146
kubectl apply -f pv3-demo.yaml
在创建一个2G的PVC
vim pvc3-demo.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc3
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
如上图可以看到,2G的PVC是如法与1G的pv进行绑定的
总结:
当创建了PVC之后,系统会自动去匹配处于Available的pv进行绑定,与此同时pv和已绑定的PVC状态都处于Bound状态,但是当我们创建的PVC空间大于PV的空间的时候,将不会进行绑定,PVC处于pending状态
五、PVC的使用
1、创建pv和PVC
apiVersion: v1
kind: PersistentVolume
metadata:
name: www
spec:
capacity:
storage: 20Gi
accessModes:
ReadWriteMany
persistentVolumeReclaimPolicy: Delete
nfs:
server: 192.168.229.146
path: /nfsdata/nginx-www/
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: www
spec:
accessModes:
ReadWriteMany
resources:
requests:
storage: 20Gi
2、创建nginx
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
containerPort: 80
volumeMounts:
name: www
mountPath: /usr/share/nginx/html
volumes:
name: www
persistentVolumeClaim:
claimName: www
3、创建SVC,提供外网访问
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
name: nginx
namespace: default
spec:
ports:
name: nginx
nodePort: 38008
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: NodePort
status:
loadBalancer: {}
4、在nfs服务器的挂载目录添加index文件
以上是关于k8s持久化PV和PVC的主要内容,如果未能解决你的问题,请参考以下文章
k8s数据持久化之statefulset的数据持久化,并自动创建PV与PVC