PV、PVC介绍和使用

 

简介:

 PersistentVolume (PV):  PV是集群中配置好的一个网络存储,是集群的全局资源,不属于任何namespace;PV无法与pod直接关联,它的设计是用来和存储对接的,所以用于绑定后端存储,写入PV的数据最终都是存放在后端存储服务器上

 PersistentVolumeClaim (PVC):PVC可以直接被pod挂载,同时可以绑定PV,从而让pod使用PV; PVC与挂载它的pod隶属于同一个namespace

 官网资料: https://v1-22.docs.kubernetes.io/zh/docs/concepts/storage/persistent-volumes

 

 

总结: PV是对底层网络存储的抽象,将网络存储定义为一种存储资源,将一个整体的存储资源拆分成多份后给不同的业务使用

        PVC是对PV资源的申请调用,pod是通过PVC将数据保存到PV,PV再把数据保存至真正的硬件存储

 

pod-pvc-pv关系图如下:

可以看出层级关系最底层是存储,上层是PV,再上层是PVC,最上层是pod ;因此创建的话就得从底层往上层开始

PV参数

访问模式:

ReadWriteOnce : PV只能被单个节点以读写权限挂载,rwo

ReadOnlyMany: PV可以被多个节点挂载但是权限是只读的,rox

ReadWrieMany: PV可以被多个节点以读写方式挂载使用, rwx

删除机制:

Retain : 删除PV后保持原状,如果需要删除数据需要管理员到存储上手动删除(建议)

Recycle : 空间回收,直接删除存储卷上所有数据,目前仅支持NFS和hostPath (不建议)

Delete : 自动删除存储卷

卷类型:

定义存储卷使用的文件系统是块设备还是文件系统,默认是文件系统

PVC参数

访问模式:

ReadWriteOnce : PVC只能被单个节点以读写权限挂载,rwo

ReadOnlyMany: PVC可以被多个节点挂载但是权限是只读的,rox

ReadWrieMany: PVC可以被多个节点以读写方式挂载使用, rwx

resources  : 定义PVC创建存储卷的大小

PVC如何绑定PV:(两种方式)

1、seletcot : 标签选择器,用来选择需要绑定的PV

         # matchLabels : 匹配标签名称

         # matchExpressions : 基于正则表达式匹配

2、volumeName : 直接点名要绑定的PV名称(相较于上面的标签选择器更精准)

volumeMode : 卷类型

                    定义PVC使用的文件系统是块设备还是文件系统,默认是文件系统

注:PVC空间要小于PV的空间

 

  主机用途   IP主机名
K8S集群node172.31.7.111node1
nfs网络存储服务器172.31.7.109haproxy02
K8S集群管理节点172.31.7.110k8s-deploy

 

一、部署存储卷

 

1、把172.31.7.109主机设置为nfs共享存储服务器

1.1、安装nfs服务端
root@haproxy02:~# apt install nfs-server
 
1.2、创建共享目录
root@haproxy02:~# mkdir /data/k8sdata/myappdata  -p

root@haproxy02:/data/k8sdata# echo pv >> /data/k8sdata/myappdata/index.html
 
1.3、设置共享,把目录进行共享,赋予读写权限,不做权限映射,是哪个用户写的就是哪个用户的uid和gid权限
root@haproxy02:~# echo -e "/data/k8sdata *(rw,no_root_squash)" >> /etc/exports
 
1.4、重启服务并设置开机自启
root@haproxy02:~# systemctl restart nfs-server && systemctl enable nfs-server

 在nfs服务端创建共享目录文件 /data/k8sdata/myappdata/index.html

2、客户端检查nfs共享目录

1、安装showmount命令客户端
root@k8s-deploy:~/yaml/yl# apt install nfs-common
 
2、检查能否识别到nfs服务器,和权限
root@k8s-deploy:~/yaml/yl# showmount -e 172.31.7.109
Export list for 172.31.7.109:
/data/k8sdata *

3、在K8S集群创建PV

root@k8s-deploy:~/yaml/yl# vim pv.yaml
kind: PersistentVolume    #资源类型是PV
apiVersion: v1
metadata:                #因为是全局资源不需要指定namespace
  name: myserver-myapp-static-pv    #PV名称
spec:
  capacity:
    storage: 2Gi
  accessModes:           #访问模式
    - ReadWriteOnce      #被单个节点以读写权限挂载
  nfs:
    path: /data/k8sdata/myappdata    #nfs共享目录
    server: 172.31.7.109            #nfs server端地址


root@k8s-deploy:~/yaml/yl# kubectl apply -f pv.yaml

root@k8s-deploy:~/yaml/yl# kubectl get pv
NAME                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
myserver-myapp-static-pv   2Gi        RWO            Retain           Available                                   4s

 PV的状态必须要是Available 可用的

 

4、在K8S集群创建PVC

root@k8s-deploy:~/yaml/yl# vim pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myserver-myapp-static-pvc
  namespace: myserver
spec:
  volumeName: myserver-myapp-static-pv #指定要绑定的PV名称
  accessModes:          #访问模式
    - ReadWriteOnce     #访问模式是只能被单个节点以读写权限挂载
  resources:            #定义PVC创建存储卷的大小
    requests:           #大小请求
      storage: 2Gi      #PVC 2G大小

创建namespace
root@k8s-deploy:~/yaml/yl# kubectl create ns myserver

启动pvc
root@k8s-deploy:~/yaml/yl# kubectl apply -f pvc.yaml

可以看见PVC已经绑定到PV上了

 

5、在K8S集群创建pod资源

root@k8s-deploy:~/yaml/yl# cat nginx-pvc-pod.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
  name: myserver-myapp-deployment
  namespace: myserver
  labels:
    app: myserver-myapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myserver-app
  template:
    metadata:
      labels:
        app: myserver-app
    spec:
      containers:
      - name: myapp-container
        image: nginx:1.20.0
        volumeMounts:
        - mountPath: "/usr/share/nginx/html/statics"   #容器的挂载点
          name: statics-datadir                        #被挂载卷的名称
      volumes:
      - name: statics-datadir  #共享存储卷名称,把下面的PVC声明一个卷叫做statics-datadir,再把这个卷挂载到上面的容器目录
        persistentVolumeClaim:   #类型是PVC
          claimName: myserver-myapp-static-pvc  #指定要绑定的PVC,前面已经创建好了

---
kind: Service
apiVersion: v1
metadata:
  name: myserver-myapp-service
  namespace: myserver
  labels:
    app: service-nginx
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    targetPort: 80
    nodePort: 30080
  selector:
    app: myserver-app   #这里调用这个标签的pod,跟上面容器中定义的标签一致

root@k8s-deploy:~/yaml/yl# kubectl apply -f nginx-pvc-pod.yaml

root@k8s-deploy:~/yaml/yl# kubectl get pod -n myserver
NAME                                        READY   STATUS    RESTARTS   AGE
myserver-myapp-deployment-6bdbb5c6b-jqclx   1/1     Running   0          16m

        进入nginx容器看下存储卷挂载,可以看见之前写入的文件index.html内容

  

        访问node节点30080端口的static目录, 能看见之前写入存储卷里的文件内容PV

 6、 删除资源:

可以看见之前创建了三个yaml资源文件,之前创建需要从底层往上层建,删除的话需要从上层往下层删除
root@k8s-deploy:~/yaml/yl# ls
nginx-pvc-pod.yaml  pvc.yaml  pv.yaml

删除pod,删除pvc,删除pv
root@k8s-deploy:~/yaml/yl# kubectl delete -f nginx-pvc-pod.yaml

root@k8s-deploy:~/yaml/yl# kubectl delete -f pvc.yaml

root@k8s-deploy:~/yaml/yl# kubectl delete -f pv.yaml

 

总结:以上就是PV和PVC最简单的使用方式了,是静态存储卷,需要在使用前手动创建PV,然后创建PVC并绑定到PV上,挂载到pod上使用,适用于PV和PVC比较固定的业务场景

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值