k8s存储-pv和pvc

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

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

 

 

 总结: 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 被释放或 PVC 与其解绑时,PV 不会被自动删除,而是保留在集群中。这个策略适用于需要手动处理和回收 PV 的情况。

  Delete(删除):当 PV 被释放或 PVC 与其解绑时,PV 将被自动删除。这个策略会立即删除 PV 及其底层的存储资源。

  Recycle(回收):这是一种已经过时的策略,不推荐使用。当 PV 被释放或 PVC 与其解绑时,PV 的数据将被删除,但 PV 对象本身被保留。这个策略通常用于简单的本地存储。

可通过kubectl get pv指令看结果RECLAIM POLICY 列或者kubectl get pv <pv-name> -o=jsonpath='{.spec.persistentVolumeReclaimPolicy}'来确定删除策略

 卷类型:

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

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的空间

实现案例

1.部署存储卷
1.1、安装nfs服务端
root@haproxy02:~# yum install nfs-utils  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
2.客户端检查nfs共享目录
#yum install nfs-utils时已安装客户端
1、检查能否识别到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      #被单个节点以读写权限挂载
persistentVolumeReclaimPolicy: Retain #删除机制为保留 nfs: path:
/data/k8sdata/myappdata #nfs共享目录 server: 172.31.7.109 #nfs server端地址
#hostpath: #本地目录模式
#path: /mnt/data
#type: DirectoryOrCreate 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内容

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
 

 

posted @ 2023-09-28 14:27  阿锋888  阅读(255)  评论(0编辑  收藏  举报