一、PV和PVC示意图

1.图1

在这里插入图片描述

2.图2

在这里插入图片描述

二、概念

一个应用肯定会跑多个pod,多个pod里面肯定会存放数据,当一个pod死了,数据也会跟着消失,因此k8s就有了pv的概念,pv就是持久化存储,相当于docker的volume,pvc就是分配pv的容量给pod

PVC 是用户存储的一种声明,PVC 和 Pod 比较类似,Pod 消耗的是节点,PVC 消耗的是 PV 资源,Pod 可以请求 CPU 和内存,而 PVC 可以请求特定的存储空间和访问模式。对于真正使用存储的用户不需要关心底层的存储实现细节,只需要直接使用 PVC 即可。

三、使用流程

1.配置存储空间:

​ 由存储管理员配置存储设备(如NFS,iSCSI,Ceph RBD,Glusterfs),并且划割好了很多可被独立使用的存储空间;

2.定义PV:

​ k8S集群管理员将配置好的那些存储空间引入至K8S集群中,定义成PV (Persistent Volume,持久化卷);

3.定义PVC:

​ K8S用户在创建Pod时如果要用到PVC时,必须先创建PVC( 在K8S集群中找一个能符合条件的存储卷PV来用)。注意:PV和PVC是一一对应关系,一旦某个PV被一个PVC占用,那么这个PV就不能再被其他PVC占用,被占用的PV的状态会显示为**Bound**。PVC创建以后,就相当于一个存储卷,可以被多个 Pod所使用。

4.使用PVC

​ 在Pod中去使用PVC,如果符合PVC条件的PV不存在,而这时去使用这个PVC,则Pod这时会显示Pending(挂起)状态。

四.配置NFS

1.搭建NFS

单独使用一台服务器来搭建共享存储NFS
NFS服务器地址为192.168.100.111

yum -y install nfs-utils

2.创建nfs存储目录

mkdir /data2/kod_pv -p

3.准备配置文件

vim /etc/exports
/data2 192.168.100.0/24(rw,sync,no_root_squash,no_all_squash)

4.启动服务

systemctl restart rpcbind
systemctl enable rpcbind
systemctl restart nfs
systemctl enable nfs

5.查看NFS信息

[root@node7 ~]# showmount  -e
Export list for node7:
/data2 192.168.100.0/24

6.在node节点上安装NFS client

yum -y install nfs-utils

五、创建PV

[root@node4 pv]# vim k8s_pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: kod-pv
  labels:
    pv: kod-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: "/data2/kod_pv"  #使用NFS的发布目录
    server: 192.168.100.111  #这是NFS的地址
    readOnly: false

[root@node4 pv]# kubectl  create -f k8s_pv.yaml 
persistentvolume/kod-pv created
[root@node4 pv]# kubectl  get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS       AGE
kod-pv   5Gi        RWX            Recycle          Available    14s

此时已经创建成功,状态为可用

六、创建PVC

创建PV和PVC时,只有相同类型的STORAGECLASS才能匹配到一起,所以要设置相同的storageClassName标签

PVC 申领不必一定要请求某个类。如果 PVC 的 storageClassName 属性值设置为 “”, 则被视为要请求的是没有设置存储类的 PV 卷,因此这一 PVC 申领只能绑定到未设置 存储类的 PV 卷

当某 PVC 除了请求 StorageClass 之外还设置了 selector,则这两种需求会按 逻辑与关系处理:只有隶属于所请求类且带有所请求标签的 PV 才能绑定到 PVC。

vim k8s_pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: kod-pvc
spec:
  storageClassName: ""
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

这里的PVC的storageClassName就设置了为"" ,所有就会自动会和没有设置storageClassName的PV进行匹配进行绑定

[root@node4 pv]# kubectl create -f k8s_pvc.yaml 
persistentvolumeclaim/kod-pvc created

这里PVC的状态是Bound 对应的VOLUME就是 我们刚才创建的kod-pv,说明已经绑定成功
[root@node4 pv]# kubectl  get pvc
NAME      STATUS   VOLUME   CAPACITY   ACCESS MODES     AGE
kod-pvc   Bound    kod-pv   5Gi        RWX              37s

注意:

这里也可以同时设置pv和pvc的storageclassname 为一致的名字,这样就可以按照这个属性进行匹配了

七、创建pod

[root@node4 pv]# vim kod_deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kod-deploy
spec:
  selector:
    matchLabels:
      app: kodredis
  template:
    metadata:
      labels:
        app: kodredis
    spec:
      containers:
      - name: pangbing-redis
        image: redis
        ports:
        - containerPort: 3679
        volumeMounts: #将卷挂载到pod的/data目录下
        - name: kod-data
          mountPath: /data
      volumes:  #将PVC 组成卷
      - name: kod-data      
        persistentVolumeClaim:
          claimName: kod-pvc

创建pod

[root@node4 pv]# kubectl  create -f kod_deployment.yaml 
deployment.apps/kod-deploy created

八、验证

1.进入pod

[root@node4 pv]# kubectl exec -it kod-deploy-76bf89946f-bk997 -- bash

进入到/data目录下,创建测试文件
root@kod-deploy-76bf89946f-bk997:/data# touch test

2.在NFS上查看文件

[root@node7 kod_pv]# cd /data2/kod_pv/
[root@node7 kod_pv]# ls
test

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐