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 firewalldsystemctl disable firewalld
//安装nfsyum -y install nfs-utils rpcbind

2、创建工项目录,配置nfs配置文件

mkdir  /nfsdatavim  /etc/exports/nfsdata *(rw,sync,no_root_squash)
//启动nfs服务systemctl start rpcbindsystemctl enable rpcbindsystemctl start nfssystemctl 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 rpcbindsystemctl enable rpcbindsystemctl start nfssystemctl enable nfs

测试与NFS服务器的连通性


三、PV概述

    有了NFS共享存储之后,就可以采用PV和PVC了,PV作为存储资源主要包括存储能力、访问模式、存储类型、回收策略等关键信息


1、使用NFS类型的后端存储,创建1G的存储空间,访问模式为ReadWriteOnce,回收策略也Recyle的PV

vim pv1-demo.yamlapiVersion: v1kind: PersistentVolumemetadata: name: pv1spec: capacity:  storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle nfs:    path: /nfsdata server: 192.168.229.146    kubectl apply  -f pv-demo.yaml

k8s持久化PV和PVC

  • 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: PersistentVolumeClaimapiVersion: v1metadata: name: pvc-nfsspec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
      kubectl  apply -f pvc1-demo.yaml      


k8s持久化PV和PVC

k8s持久化PV和PVC

如上图在创建完PVC之后,上面创建的PV状态从Available变成了Bound,同时PVC的状态也变成了Bound,我们刚刚新建的 pvc 和我们的 pv 绑定成功了。


测试一、

PVC如何跟PV进行绑定?

先创建一个PVC邀请访问模式是 ReadWriteOnce,存储容量是 2Gi,最后我们还要求匹配具有标签 app=nfs 的 PV

vim pvc2-demo.yamlkind: PersistentVolumeClaimapiVersion: v1metadata: name: pvc2-nfsspec: accessModes: - ReadWriteOnce resources: requests: storage: 2Gi selector: matchLabels: app: nfs
kubectl apply -f pvc2-demo.yaml

k8s持久化PV和PVC

如上图,创建完PVC之后发现STATUS状态为pending也就是等待状态,与此同时,所有的pv状态为Bound,下面在创建一个PV进行观察

vim pv2-demo.yamlapiVersion: v1kind: PersistentVolumemetadata: name: pv2-nfs labels: app: nfsspec: capacity: storage: 2Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle nfs: server: 192.168.229.146    path: /nfsdata
kubectl apply -f pv2-demo.yaml

k8s持久化PV和PVC

如上图,在创建完新的PV之后,上面创建的PVC自动与新创建的pv进行了绑定,也就是说当我们创建完PVC之后,系统会自动匹配处于Available的pv进行绑定,同时pv和PVC的状态都变成Bound状态


测试二、

如果声明的PVC空间大于现有PV声明的空间是否能被绑定?

首先创建一个1G的pv

vim pv3-demo.yamlapiVersion: v1kind: PersistentVolumemetadata: name: pv3spec: capacity:  storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle nfs: path: /nfsdata server: 192.168.229.146 kubectl apply -f pv3-demo.yaml

k8s持久化PV和PVC

在创建一个2G的PVC

vim pvc3-demo.yamlkind: PersistentVolumeClaimapiVersion: v1metadata:  name: pvc3spec: 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: v1kind: PersistentVolumemetadata: name: wwwspec: capacity: storage: 20Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Delete nfs: server: 192.168.229.146 path: /nfsdata/nginx-www/
---kind: PersistentVolumeClaimapiVersion: v1metadata: name: wwwspec: accessModes: - ReadWriteMany resources: requests: storage: 20Gi

2、创建nginx

apiVersion: apps/v1kind: Deploymentmetadata: name: nginxspec: 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: v1kind: Servicemetadata: labels: app: nginx name: nginx namespace: defaultspec: ports: - name: nginx nodePort: 38008 port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: NodePortstatus: loadBalancer: {}

4、在nfs服务器的挂载目录添加index文件


以上是关于k8s持久化PV和PVC的主要内容,如果未能解决你的问题,请参考以下文章

K8S持久化存储PV和PVC使用

持久化存储之 PV、PVC、StorageClass

k8s数据持久化之statefulset的数据持久化,并自动创建PV与PVC

k8s存储数据持久化,emptyDir,hostPath,基于Nfs服务的PV,PVC

k8s存储PV与PVC使用详解

攻坚克难详解k8s持久化存储数据pvpvc存储问题