k8s-pv/pvc

发布时间 2023-03-28 10:09:23作者: yuanbangchen
默认情况下容器中的磁盘文件是非持久化的,对于运行在容器中的应用来说面临两个问题,
第一:当容器挂掉kubelet将重启启动它时,文件将会丢失;
第二:当Pod中同时运行多个容器,容器之间需要共享文件时,Kubernetes的Volume解决了这两个问题。


PV/PVC
PersistentVolume(PV持久卷)是集群中已由管理员配置的一段网络存储,集群中的存储资源就像一个node节点是一个集群
资源,PV是诸如卷之类的卷插件,但是具有独立于使用PV的任何单个pod的生命周期, 该API对象捕获存储的实现细节,
即NFS,iSCSI或云提供商特定的存储系统,PV是由管理员添加的的一个存储的描述,是一个全局资源即不隶属于任何
namespace,包含存储的类型,存储的大小和访问模式等,它的生命周期独立于Pod,例如当使用它的Pod销毁时对PV没
有影响。

PersistentVolumeClaim(PVC持久卷声明)是用户存储的请求。它与 Pod 相似。Pod 消耗节点资源,PVC 消耗 PV 资源。Pod 可以请求特定级别的
资源(CPU 和内存)。PVC可以请求特定的大小和访问模式(例如,可以以读/写一次或 只读多次模式挂载)。



kubernetes 从1.0版本开始支持PersistentVolume和PersistentVolumeClaim。
PV/PVC实现pod和storage的解耦,这样我们修改storage的时候不需要修改pod,也可以实现存储和应用权限的隔离
PV是对底层网络存储的抽象,即将网络存储定义为一种存储资源,将一个整体的存储资源拆分成多份后给不同的业务使用。
PVC是对PV资源的申请调用,就像POD消费node节点资源一样,pod是通过PVC将数据保存至PV,PV在保存至存储。
pv没有namespace概念,属于全局性的,pvc则有namespace概念
删除pvc的时候需要先把正在使用pvc的deploy或者pod删掉或吧使用的pvc删掉,要不然会一直显示delete不动
删除pvc之后k8s会创建一个回收的pod----根据pv的回收策略回收,回收完了之后,pv的状态就会变成可被绑定的状态,也就是空闲状态,其他的pvc匹配到这个pv就会和这个pv绑定



创建pvc之后一直绑定不上pv
    1.pvc的空间申请大小大于pv的大小
    2.pvc的storageclassName没有和pv的一致
    3.pvc的accessModes和pv的不一致
 
创建挂载pvc之后一直处于pending状态
    1.pvc没有创建成功或者被创建
    2.pvc和pod不在同一个anmespace
 





PersistentVolume参数:
Capacity:             #当前PV空间大小,kubectl explain PersistentVolume.spec.capacity
accessModes :        #访问模式,  kubectl explain PersistentVolume.spec.accessModes
    ReadWriteOnce   #PV只能被单个节点以读写权限挂载,RWO
    ReadOnlyMany    #PV以可以被多个节点挂载但是权限是只读的,ROX
    ReadWriteMany   #PV可以被多个节点是读写方式挂载使用,RWX
persistentVolumeReclaimPolicy #删除机制即删除存储卷卷时候,已经创建好的存储卷由以下删除操作:#kubectl explain PersistentVolume.spec.persistentVolumeReclaimPolicy
    Retain             #删除PV后保持原装,最后需要管理员手动删除
    Recycle         #空间回收,及删除存储卷上的所有数据(包括目录和隐藏文件),目前仅支持NFS和hostPath
    Delete          #自动删除存储卷
volumeMode          #卷类型,kubectl explain PersistentVolume.spec.volumeMode定义存储卷使用的文件系统是块设备还是文件系统,默认为文件系统
mountOptions        #附加的挂载选项列表,实现更精细的权限控制 如:ro 


示例:
apiVersion: v1
kind: PersistentVolume          #定义kind类型为PV
metadata:
  name: zookeeper-datadir-pv-1 
  namespace: magedu              #pv没有namespace概念,属于全局性的,此参数可以不设置。
spec:
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce 
  nfs:                            #NFS服务器
    server: 172.31.1.103
    path: /data/k8sdata/magedu/zookeeper-datadir-1 




PersistentVolumeClaim创建参数:
accessModes :        #PVC 访问模式,#kubectl explain PersistentVolumeClaim.spec.volumeMode
    ReadWriteOnce   #PVC只能被单个节点以读写权限挂载,RWO
    ReadOnlyMany    #PVC以可以被多个节点挂载但是权限是只读的,ROX
    ReadWriteMany   #PVC可以被多个节点是读写方式挂载使用,RWX
resources:         #定义PVC创建存储卷的空间大小
volumeName             #要绑定的PV名称

volumeMode             #卷类型,定义PVC使用的文件系统是块设备还是文件系统,默认为文件系统
selector:             #标签选择器,选择要绑定的PV
matchLabels         #匹配标签名称
matchExpressions     #基于正则表达式匹配


示例:
apiVersion: v1
kind: PersistentVolumeClaim  #定义kind类型为PVC  
metadata:
  name: zookeeper-datadir-pvc-1         #定义PVC名称,容器调用使用。
  namespace: magedu
spec:
  accessModes:                          #访问模式,
    - ReadWriteOnce
  volumeName: zookeeper-datadir-pv-1      #调用PV名称。
  resources:                               #定义PVC创建存储卷的空间大小
    requests:
      storage: 10Gi                      #使用大小,要比PV的值小,如果容器已运行,不随意变更大小。






示例:
安装nfs服务器
[root@localhost7B ]# cat  /etc/exports
/data/k8sdata  *(rw,no_root_squash)

[root@localhost7B ]# mkdir /data/k8sdata/magedu/zookeeper-datadir-1 -p 
[root@localhost7B ]# mkdir /data/k8sdata/magedu/zookeeper-datadir-2 -p 
[root@localhost7B ]# mkdir /data/k8sdata/magedu/zookeeper-datadir-3 -p 

[root@localhost7B ]# systemctl  restart  nfs-server.service

#写数据测试
mount -t nfs 192.168.80.110:/data/k8sdata/magedu/zookeeper-datadir-1  /mnt
cp  /etc/passwd  /mnt
umount  /mnt/



#创建PV
[root@localhost7C pv]# cat persistentvolume.yaml 
---
apiVersion: v1
kind: PersistentVolume  
metadata:
  name: zookeeper-datadir-pv-1
  namespace: default          
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce 
  nfs:
    server: 192.168.80.110
    path: /data/k8sdata/magedu/zookeeper-datadir-1 

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: zookeeper-datadir-pv-2
  namespace: default
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  nfs:
    server: 192.168.80.110 
    path: /data/k8sdata/magedu/zookeeper-datadir-2 

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: zookeeper-datadir-pv-3
  namespace: default
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  nfs:
    server: 192.168.80.110  
    path: /data/k8sdata/magedu/zookeeper-datadir-3 

#创建PVC
[root@localhost7C pv]# cat persistentvolumeclaim.yaml 
apiVersion: v1
kind: PersistentVolumeClaim            #定义kind类型为PVC  
metadata:
  name: zookeeper-datadir-pvc-1
  namespace: default
spec:
  accessModes:                          #访问模式,
    - ReadWriteOnce
  volumeName: zookeeper-datadir-pv-1    #调用PV名称。
  resources:                               #定义PVC创建存储卷的空间大小
    requests:
      storage: 2Gi              #使用大小,要比PV的值小,如果容器已运行,不随意变更大小。
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: zookeeper-datadir-pvc-2
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  volumeName: zookeeper-datadir-pv-2
  resources:
    requests:
      storage: 3Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: zookeeper-datadir-pvc-3
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  volumeName: zookeeper-datadir-pv-3
  resources:
    requests:
      storage: 4Gi


#pod调用 
[root@localhost7C pv]# cat  nginx.yaml 
kind: Deployment
apiVersion: apps/v1
metadata:
  name: nginx1
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-selector
  template:
    metadata:
      labels:
        app: nginx-selector
    spec:
      containers:
      - name: magedu-nginx-container
        image: harbor.zzhz.com/baseimage/nginx:latest
        #command: ["/apps/tomcat/bin/run_tomcat.sh"]
        #imagePullPolicy: IfNotPresent
        imagePullPolicy: Always
        ports:
        - containerPort: 80
          protocol: TCP
          name: http
        volumeMounts:
        - mountPath: "/zookeeper/data"          #pod挂载路径
          name: zookeeper-datadir-pvc-1            #调用volumes名称
      volumes:                                    #定义类型
        - name: zookeeper-datadir-pvc-1            #自定义名称
          persistentVolumeClaim:
            claimName: zookeeper-datadir-pvc-1   #调用PVC
---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: magedu-nginx-service-label
  name: magedu-nginx-service
  namespace: default
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30080
  selector:
    app: nginx-selector



[root@localhost7C pv]# kubectl get persistentvolumes
NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                             STORAGECLASS   REASON   AGE
zookeeper-datadir-pv-1   5Gi        RWO            Retain           Bound    default/zookeeper-datadir-pvc-1                           15m
zookeeper-datadir-pv-2   5Gi        RWO            Retain           Bound    default/zookeeper-datadir-pvc-2                           16m
zookeeper-datadir-pv-3   5Gi        RWO            Retain           Bound    default/zookeeper-datadir-pvc-3                           16m

[root@localhost7C pv]# kubectl get persistentvolumeclaims 
NAME                      STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
zookeeper-datadir-pvc-1   Bound    zookeeper-datadir-pv-1   5Gi        RWO                           16m
zookeeper-datadir-pvc-2   Bound    zookeeper-datadir-pv-2   5Gi        RWO                           16m
zookeeper-datadir-pvc-3   Bound    zookeeper-datadir-pv-3   5Gi        RWO                           16m

[root@localhost7C pv]# kubectl  describe  persistentvolume zookeeper-datadir-pv-1
Name:            zookeeper-datadir-pv-1
Labels:          <none>
Annotations:     kubectl.kubernetes.io/last-applied-configuration:
                   {"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{},"name":"zookeeper-datadir-pv-1"},"spec":{"accessModes":["ReadWri...
                 pv.kubernetes.io/bound-by-controller: yes
Finalizers:      [kubernetes.io/pv-protection]
StorageClass:    
Status:          Bound
Claim:           default/zookeeper-datadir-pvc-1
Reclaim Policy:  Retain
Access Modes:    RWO
VolumeMode:      Filesystem
Capacity:        5Gi
Node Affinity:   <none>
Message:         
Source:
    Type:      NFS (an NFS mount that lasts the lifetime of a pod)
    Server:    192.168.80.110
    Path:      /data/k8sdata/magedu/zookeeper-datadir-1
    ReadOnly:  false
Events:        <none>

[root@localhost7C pv]# kubectl  describe  persistentvolumeclaims zookeeper-datadir-pvc-1
Name:          zookeeper-datadir-pvc-1
Namespace:     default
StorageClass:  
Status:        Bound
Volume:        zookeeper-datadir-pv-1
Labels:        <none>
Annotations:   kubectl.kubernetes.io/last-applied-configuration:
                 {"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"name":"zookeeper-datadir-pvc-1","namespace":"default"},"sp...
               pv.kubernetes.io/bind-completed: yes
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      5Gi
Access Modes:  RWO
VolumeMode:    Filesystem
Mounted By:    nginx1-5b7d98d47c-58zjd
Events:        <none>


#测试
[root@localhost7C pv]# kubectl exec  -it  nginx1-5b7d98d47c-58zjd  bash
root@nginx1-5b7d98d47c-58zjd:/# df  -h
Filesystem                                               Size  Used Avail Use% Mounted on
overlay                                                   15G  5.0G   10G  34% /
tmpfs                                                     64M     0   64M   0% /dev
tmpfs                                                    982M     0  982M   0% /sys/fs/cgroup
/dev/mapper/centos-root                                   15G  5.0G   10G  34% /etc/hosts
192.168.80.110:/data/k8sdata/magedu/zookeeper-datadir-1   20G  9.2G   11G  46% /zookeeper/data
shm                                                       64M     0   64M   0% /dev/shm



[root@localhost7C pv]# kubectl exec  -it nginx1-5b7d98d47c-58zjd bash
root@nginx1-5b7d98d47c-58zjd:/# ls /zookeeper/data/       
passwd