k8s-pv/pvc
默认情况下容器中的磁盘文件是非持久化的,对于运行在容器中的应用来说面临两个问题, 第一:当容器挂掉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