11.kubernetes笔记 Volume存储卷(二) PV、

2021-09-23  本文已影响0人  Bigyong

目录
PVC和PV简介
PV 字段介绍
PVC 字段介绍
资源规范
示例1: NFS网络存储、PV、PVC、POD创建与引用
示例2: 通过PVC实现共享数据
示例3: 删除POd、PVC、PV后恢复数据
PVC、PV总结

前言

Volume 提供了非常好的数据持久化方案,不过在可管理性上还有不足。拿前面示例可以看出,要使用Volume,Pod 必须事先知道如下信息:

  1. 当前 Volume 来自来哪里及具体位置 Local、网络。
  2. 存储卷的类型,并知道每种类型卷的配置使用方法,通过 kubectl explain pods.spec.volumes 可以看到kubernetes支持卷的类型非常的多

Pod通常是由应用的开发人员维护,而 Volume 则通常是由存储系统的管理员维护。开发人员要获得上面的信息:要么询问管理员 要么自己就是管理员。
这样就带来一个管理上的问题:应用开发人员和系统管理员的职责耦合在一起了。如果系统规模较小或者对于开发环境这样的情况还可以接受。但当集群规模变大,特别是对于生成环境,考虑到效率和安全性,这就成了必须要解决的问题。

Kubernetes 给出的解决方案是 PersistentVolume 和 PersistentVolumeClaim。
PersistentVolume (PV) 是外部存储系统中的一块存储空间,由管理员创建和维护。与 Volume 一样,PV 具有持久性,生命周期独立于 Pod。

PersistentVolumeClaim (PVC) 是对 PV 的申请 (Claim)。PVC 通常由普通用户创建和维护。需要为 Pod 分配存储资源时,用户可以创建一个 PVC,指明存储资源的容量大小和访问模式(比如只读)等信息,Kubernetes 会查找并提供满足条件的 PV。

有了 PersistentVolumeClaim,用户只需要告诉 Kubernetes 需要什么样的存储资源,而不必关心真正的空间从哪里分配,如何访问等底层细节信息。这些 Storage Provider 的底层信息交给管理员来处理,只有管理员才应该关心创建 PersistentVolume 的细节信息。

PVC 和PV 简介

Pod使用这类存储的步骤:
Admin: 创建好PV;
User: 按需创建PVC,而后创建Pod,在Pod调用persistentVolumeClaim 类型的存储卷插件调用同一个名称空间的PVC资源;

PV 字段介绍:

除了存储卷插件之外,PersistentVolume资源规范Spec字段主要支持嵌套以下几个通用字段,它们用于定义PV的容量、访问模式和回收策略等属性

PVC 字段介绍:

定义PVC时,用户可通过访问模式(accessModes)、数据期(dataSource)、存储资源空间需求和限制(resources)、存储类、标签选择器、卷模型和卷名称等匹配标准来筛选集群上的PV资源,其中,resources和accessModes是最重的筛选标准。PVC的Spec字段的可嵌套字段有如下几个。

资源规范:

spec:
  volumes :
  - name <string> #存储卷名称标识,仅可使用DNS标签格式的字符,在当前Pod中必须唯
    vOL_TYPE <0bject> #存储卷插件及具体的目标存储供给方的相关配置
  containers: 
  - name: ...
    image: ...
    volumeMounts:
    - name <string> #要挂载的存储卷的名称,必须匹配存储卷列表中某项的定义
      mountPath <string> #容器文件系统上的挂载点路径
      readOnly <boolean> #是否挂载为只读模式,默认为“否”
      subPath <string> #挂载存储卷上的一个子目录至指定的挂载点
      subPathExpr <string> #挂载由指定的模式匹配到的存储卷的文件或目录至挂载点

示例1: NFS网络存储、PV、PVC、POD创建与引用
[root@nfs ~]# mkdir /data/redis00{1,2,3,4,5}
[root@nfs ~]# chmod -R  1010  /data/
[root@nfs ~]# cat /etc/exports
/data/redis  192.168.4.0/24(rw)
/data/redis001  192.168.4.0/24(rw)
/data/redis002  192.168.4.0/24(rw)
/data/redis003  192.168.4.0/24(rw)
/data/redis004  192.168.4.0/24(rw)
/data/redis005  192.168.4.0/24(rw)

[root@nfs ~]# systemctl restart nfs

[root@k8s-node1 ~]# showmount -e 192.168.4.100
Export list for 192.168.4.100:
/data/redis005 192.168.4.0/24
/data/redis004 192.168.4.0/24
/data/redis003 192.168.4.0/24
/data/redis002 192.168.4.0/24
/data/redis001 192.168.4.0/24
/data/redis    192.168.4.0/24

[root@k8s-master storage]# cat pv-nfs-demo001.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nfs-demo001
spec:
  capacity:
    storage: 5Gi  #容量
  volumeMode: Filesystem #文件系统
  accessModes:
  - ReadWriteMany   #多路读写
  persistentVolumeReclaimPolicy: Retain  #回收策略
  mountOptions:
  - hard
  - nfsvers=4.1
  nfs :
    path: "/data/redis001"
    server: 192.168.4.100 #nfs存储地址与路径

[root@k8s-master storage]# cat pv-nfs-demo002.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nfs-demo002
spec:
  capacity:
    storage: 10Gi    #容量
  volumeMode: Filesystem
  accessModes:
  - ReadWriteMany    #多路读
  persistentVolumeReclaimPolicy: Retain
  mountOptions:
  - hard
  - nfsvers=4.1
  nfs :
    path: "/data/redis002"
    server: 192.168.4.100   #nfs存储地址与路径
    
[root@k8s-master storage]# cat pv-nfs-demo003.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nfs-demo003
spec:
  capacity:
    storage: 1Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce    #单路读写
  persistentVolumeReclaimPolicy: Retain
  mountOptions:
  - hard
  - nfsvers=4.1
  nfs :
    path: "/data/redis002"
    server: 192.168.4.100
    
    
[root@k8s-master storage]# kubectl apply -f pv-nfs-demo001.yaml -f pv-nfs-demo002.yaml  -f pv-nfs-demo003.yaml   #创建3个不同属性的PV卷
persistentvolume/pv-nfs-demo001 created
persistentvolume/pv-nfs-demo002 created
persistentvolume/pv-nfs-demo003 created

[root@k8s-master storage]# kubectl get pv
NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv-nfs-demo001   5Gi(容量)  RWX(多路读写)  Retain(回收策略) Available                                   33s
pv-nfs-demo002   10Gi       RWX           Retain           Available                                   33s
pv-nfs-demo003   1Gi        RWO(单路读写)  Retain           Available   

3、创建2个不同属性PVC需求

[root@k8s-master storage]# cat pvc-demo-0001.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-demo-0001
  namespace: default
spec:
  accessModes: ["ReadWriteMany"]  #多路读写
  volumeMode: Filesystem
  resources:
    requests:
      storage: 3Gi   #最小容量
    limits:
      storage: 10Gi  #最大容量
      
     
[root@k8s-master storage]# cat pvc-demo-0002.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-demo-0002
spec:
  accessModes: ["ReadWriteOnce"]  #单路读写
  volumeMode: Filesystem
  resources:
    requests:
      storage: 2Gi  #要求最小容量 2G-5G之间
    limits:
      storage: 5Gi   #要求最大容量
  selector:   #使用标签匹配
    matchLabels:
       usedof : "redisdata"
[root@k8s-master storage]# kubectl get pvc
NAME            STATUS    VOLUME           CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-demo-0001   Bound     pv-nfs-demo001   5Gi        RWX                           13h
pvc-demo-0002   Pending                                                             2m40s  #没有匹配卷 挂起

[root@k8s-master storage]# kubectl describe pvc pvc-demo-0002  
Name:          pvc-demo-0002
Namespace:     default
StorageClass:  
Status:        Pending
Volume:        
Labels:        <none>
Annotations:   <none>
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      
Access Modes:  
VolumeMode:    Filesystem
Mounted By:    <none>
Events:
  Type    Reason         Age               From                         Message
  ----    ------         ----              ----                         -------
  Normal  FailedBinding  7s (x3 over 34s)  persistentvolume-controller  no persistent volumes available for this claim and no storage class is set  #没有匹配标签的PV挂起

[root@k8s-master storage]# kubectl get pv
NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                   STORAGECLASS   REASON   AGE
pv-nfs-demo001   5Gi        RWX            Retain           Bound      default/pvc-demo-0001                            13h  
pv-nfs-demo002   10Gi       RWX            Retain           Available                                                   13h
pv-nfs-demo003   1Gi        RWO            Retain           Available                                                   13h

[root@k8s-master storage]# cat volumes-pvc-demo.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: volumes-pvc-demo
  namespace: default
spec:
  containers:
  - name: redis
    image: redis:alpine
    imagePullPolicy: IfNotPresent
    securityContext: 
      runAsUser: 1010
    ports:
    - containerPort: 6379
      name: redisport
    volumeMounts:
    - mountPath: /data
      name: redis-rbd-vol
  volumes:
  - name: redis-rbd-vol
    persistentVolumeClaim:
      claimName: pvc-demo-0001   #挂载PVC 指定名称
      
[root@k8s-master storage]# kubectl apply -f volumes-pvc-demo.yaml 
pod/volumes-pvc-demo created
[root@k8s-master storage]# kubectl get pod
NAME                                 READY   STATUS    RESTARTS   AGE
centos-deployment-66d8cd5f8b-fkhft   1/1     Running   0          27h
my-grafana-7d788c5479-8bx6k          1/1     Running   0          4h24m
volumes-nfs-demo                     1/1     Running   0          4h25m
volumes-pvc-demo                     1/1     Running   0          4s

[root@k8s-master ~]# kubectl get pvc   #可以看到PVC绑定已成功
NAME            STATUS   VOLUME           CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-demo-0001   Bound    pv-nfs-demo001   5Gi        RWX                           52m

[root@k8s-master ~]# kubectl get pod
NAME                                 READY   STATUS    RESTARTS   AGE
centos-deployment-66d8cd5f8b-fkhft   1/1     Running   0          27h
my-grafana-7d788c5479-8bx6k          1/1     Running   0          5h19m
volumes-hostpath-demo                1/1     Running   0          48m
volumes-nfs-demo                     1/1     Running   0          5h20m
volumes-pvc-demo                     1/1     Running   0          4m
[root@k8s-master ~]# kubectl exec volumes-pvc-demo -it -- /bin/sh  #挂载PVC写入数据
/data $ redis-cli
127.0.0.1:6379> set mykey2 "taobao"
OK
127.0.0.1:6379> get mykey2
"taobao"
127.0.0.1:6379> BGSAVE
Background saving started
127.0.0.1:6379> exit
/data $ ls
dump.rdb
/data $ 

[root@nfs redis001]# ls /data/redis001/  #nfs服务器上查看数据
dump.rdb
示例2: 通过PVC实现共享数据

这里只是演示不同的Pod可以挂载同一个PVC共享数据,但对于一些有状态的服务,数据的实时读写和服务、存储类型都有关系

[root@k8s-master storage]# cat volumes-pvc2.demo.yaml  #新建redis 2
apiVersion: v1
kind: Pod
metadata:
  name: volumes-pvc2-demo
  namespace: default
spec:
  containers:
  - name: redis
    image: redis:alpine
    imagePullPolicy: IfNotPresent
    securityContext: 
      runAsUser: 1010
    ports:
    - containerPort: 6379
      name: redisport
    volumeMounts:
    - mountPath: /data
      name: redis-rbd-vol
  volumes:
  - name: redis-rbd-vol
    persistentVolumeClaim:
      claimName: pvc-demo-0001  #使用相同的PVC

[root@k8s-master storage]# kubectl exec volumes-pvc2-demo -it -- /bin/sh  #在别一个Pod上查看数据 
/data $ redis-cli
127.0.0.1:6379> get mykey
"baidu.com"
127.0.0.1:6379> exit
/data $ exit
示例3: 删除POd、PVC、PV后恢复数据
[root@k8s-master storage]# kubectl delete pod volumes-pvc-demo
pod "volumes-pvc-demo" deleted
[root@k8s-master storage]# kubectl delete pod volumes-pvc2-demo   #删除之前两个Pod
pod "volumes-pvc2-demo" deleted

[root@k8s-master storage]# kubectl get pvc   #删除Pod不影响PVC及数据
NAME            STATUS    VOLUME           CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-demo-0001   Bound     pv-nfs-demo001   5Gi        RWX                           14h
pvc-demo-0002   Pending                                                             33m

[root@k8s-master storage]# kubectl delete pvc pvc-demo-0001 #删除PVC
persistentvolumeclaim "pvc-demo-0001" deleted

[root@k8s-master storage]# kubectl get pv  #因为回收策略为Retain 所以PV不会自动删除 变为Released状态
NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                   STORAGECLASS   REASON   AGE
pv-nfs-demo001   5Gi        RWX            Retain           Released    default/pvc-demo-0001                           14h
pv-nfs-demo002   10Gi       RWX            Retain           Available                                                   14h
pv-nfs-demo003   1Gi        RWO            Retain           Available                                                   14h

[root@k8s-master storage]# kubectl apply -f pvc-demo-0001.yaml   #最次创建PVC看是否能绑定原来的PV
persistentvolumeclaim/pvc-demo-0001 created

[root@k8s-master storage]# kubectl get pv  #绑定到的新的PV 原来的PV还是为Released状态
NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                   STORAGECLASS   REASON   AGE
pv-nfs-demo001   5Gi        RWX            Retain           Released    default/pvc-demo-0001                           14h
pv-nfs-demo002   10Gi       RWX            Retain           Bound       default/pvc-demo-0001                           14h
pv-nfs-demo003   1Gi        RWO            Retain           Available                                                   14h

[root@k8s-master storage]# kubectl delete  -f pvc-demo-0001.yaml  #删除Pod
persistentvolumeclaim "pvc-demo-0001" deleted

[root@k8s-master storage]# kubectl get pv  #现在两个PV都为Released
NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                   STORAGECLASS   REASON   AGE
pv-nfs-demo001   5Gi        RWX            Retain           Released    default/pvc-demo-0001                           14h
pv-nfs-demo002   10Gi       RWX            Retain           Released    default/pvc-demo-0001                           14h
pv-nfs-demo003   1Gi        RWO            Retain           Available                                                   14h
[root@k8s-master storage]# kubectl edit pv pv-nfs-demo001  #修改PV 让状态变为Available 可以重新绑定
...
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 5Gi
  claimRef:          #删除claimRef:字段所有内容
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: pvc-demo-0001
    namespace: default
    resourceVersion: "6371169"
    uid: f8a9ba0b-e15e-44ea-bccf-6b40f0d46390
  mountOptions:
  - hard
  - nfsvers=4.1
  nfs:
    path: /data/redis001
    server: 192.168.4.100
  persistentVolumeReclaimPolicy: Retain
  volumeMode: Filesystem
status:
  phase: Released
...

[root@k8s-master storage]# kubectl edit pv pv-nfs-demo002  #pv-nfs-demo002也做相同操作
persistentvolume/pv-nfs-demo002 edited

[root@k8s-master storage]# kubectl get pv #恢复Available状态
NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv-nfs-demo001   5Gi        RWX            Retain           Available                                   14h
pv-nfs-demo002   10Gi       RWX            Retain           Available                                   14h
pv-nfs-demo003   1Gi        RWO            Retain           Available  
14h
[root@k8s-master storage]# kubectl apply -f pvc-demo-0001.yaml #新建PVC
persistentvolumeclaim/pvc-demo-0001 created

[root@k8s-master storage]# kubectl get pv   #查看PV 绑定到原来的PV成功
NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                   STORAGECLASS   REASON   AGE
pv-nfs-demo001   5Gi        RWX            Retain           Bound       default/pvc-demo-0001                           14h
pv-nfs-demo002   10Gi       RWX            Retain           Available                                                   14h
pv-nfs-demo003   1Gi        RWO            Retain           Available                                                   14h
[root@k8s-master storage]# kubectl apply -f volumes-pvc-demo.yaml #重新创建Pod
pod/volumes-pvc-demo created

[root@k8s-master storage]# kubectl get pod
NAME                                 READY   STATUS    RESTARTS   AGE
centos-deployment-66d8cd5f8b-fkhft   1/1     Running   0          41h
my-grafana-7d788c5479-8bx6k          1/1     Running   0          19h
volumes-hostpath-demo                1/1     Running   0          14h
volumes-nfs-demo                     1/1     Running   0          19h
volumes-pvc-demo                     1/1     Running   0          3s

[root@k8s-master storage]# kubectl exec volumes-pvc-demo -it -- /bin/sh  #查看之前数据
/data $ ls
dump.rdb
/data $ redis-cli
127.0.0.1:6379> get mykey2
"taobao"
127.0.0.1:6379> exit
/data $ exit
[root@k8s-master storage]# 

[root@k8s-master storage]# kubectl delete pod volumes-pvc-demo  #删除Pod
pod "volumes-pvc-demo" deleted
[root@k8s-master storage]# kubectl get pvc
NAME            STATUS    VOLUME           CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-demo-0001   Bound     pv-nfs-demo001   5Gi        RWX                           6m34s
pvc-demo-0002   Pending                                                             79m
[root@k8s-master storage]# kubectl delete pvc pvc-demo-0001  #删除PVC
persistentvolumeclaim "pvc-demo-0001" deleted

[root@k8s-master storage]# kubectl delete pv pv-nfs-demo001  #删除PV
persistentvolume "pv-nfs-demo001" deleted

[root@k8s-master storage]# kubectl get pv
NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv-nfs-demo002   10Gi       RWX            Retain           Available                                   14h
pv-nfs-demo003   1Gi        RWO            Retain           Available                                   14h


[root@nfs ~]# ls /data/redis001/  #NFS服务查看数据文件 依然存在
dump.rdb
PVC、PV总结: 删除Pod、PVC 在回收策略为Retain情况下,数据不会丢失
上一篇 下一篇

猜你喜欢

热点阅读