PV(persistentVolume) 和 PVC(persistentVolumeClaim) 一一对应,多个Pod 可以访问同一个PVC。PV没有名称空间限制,不属于名称空间级别的,PVC是属于名称空间级别的。

16291280287540_upload.png


回收策略:persistentVolumeReclaimPolicy

Recycle    回收,使其可以再次被绑定

Delete      删除,删除数据,删除pv

Retain      保留,保留数据


快速使用


官方文档:

kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-persistent-volume-storage

创建pv、pvc:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: prometheus
spec:
  storageClassName: manual # 1.2x之后要使用名为 manual的sc,表示使用手动创建的pv,否者会使用默认的sc创建pv
  capacity:
    storage: 20Gi
  accessModes:
  - ReadWriteMany
  hostPath:
    path: /data
    type: DirectoryOrCreate
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: prometheus
  namespace: prometheus
spec:
  storageClassName: manual # 1.2x之后要使用名为 manual的sc,表示使用手动创建的pv,否者会使用默认的sc创建pv
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 20Gi



hostPath方式创建PV,PVC


PV:PV属于集群级别。

capacity.storage

accessModes

hostPath

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
spec:
  capacity:
    storage: 1Gi
  accessModes:
  - ReadWriteMany
  hostPath:
    path: /data
    type: DirectoryOrCreate

PVC:PVC属于名称空间级别。

accessModes

resources.requests.storage

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc001
  namespace: default
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

在Pod中使用PVC:Pod和PVC要属于通通一个名称空间。

volumes.persistentVolumeClaim.claimName

apiVersion: v1
kind: Pod
metadata:
  name: pod-use-pvc
  namespace: default
spec:
  containers:
  - name: busybox
    image: busybox:1.28
    command: ["sleep","3600"]
    volumeMounts:
    - name: code
      mountPath: /data/
  volumes:
  - name: code
    persistentVolumeClaim:
      claimName: pvc001

带有节点选择的hostPath的pv

apiVersion: v1
kind: PersistentVolume
metadata:
  name: test-data
spec:
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchFields:
        - key: metadata.name
          operator: In
          values:
          - k8s-node01
  persistentVolumeReclaimPolicy: Recycle
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 10Gi
  hostPath:
    path: /data/test-data
    type: DirectoryOrCreate



使用nfs方式创建PV


1、创建nfs 并导出

创建目录:

mkdir vol{1,2,3,4,5}

写配置:

vim /etc/exports
/data/vol1  192.168.1.0/24(rw,no_root_squash)
/data/vol2  192.168.1.0/24(rw,no_root_squash)
/data/vol3  192.168.1.0/24(rw,no_root_squash)
/data/vol4  192.168.1.0/24(rw,no_root_squash)
/data/vol5  192.168.1.0/24(rw,no_root_squash)

导出券:

exportfs -arv

查看是否成功导出:

showmount -e

2、创建pv

编写yaml文件

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv1
  namespace: default
  labels:
    name: pv1
spec:
  nfs:
    path: /data/vol1
    server: nfs01
  accessModes: ["ReadWriteOnce","ReadWriteMany","ReadOnlyMany"]
  capacity: 
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv2
  namespace: default
  labels:
    name: pv2
spec:
  nfs:
    path: /data/vol2
    server: nfs01
  accessModes: ["ReadWriteOnce","ReadOnlyMany"]
  capacity:
    storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv3
  namespace: default
  labels:
    name: pv3
spec:
  nfs:
    path: /data/vol3
    server: nfs01
  accessModes: ["ReadWriteOnce","ReadWriteMany","ReadOnlyMany"]
  capacity:
    storage: 3Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv4
  namespace: default
  labels:
    name: pv4
spec:
  nfs:
    path: /data/vol4
    server: nfs01
  accessModes: ["ReadWriteMany","ReadOnlyMany"]
  capacity:
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv5
  namespace: default
  labels:
    name: pv5
spec:
  nfs:
    path: /data/vol5
    server: nfs01
  accessModes: ["ReadWriteOnce","ReadWriteMany"]
  capacity:
    storage: 4Gi

创建pv

kubectl apply -f volumes-pv.yaml

查看pv

kubectl get pv

pv中的数据默认是保留的 Retain ,也可以有其他设置。


PVC


3、创建pvc

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
  namespace: default
  labels:
    name: pvc
spec:
  accessModes: ["ReadWriteMany"]
  resources:
    requests:
      storage: 2Gi

创建pvc

kubectl apply -f volumes-pvc.yaml

查看pvc

kubectl get pvc


4、创建Pod 并使用pvc

apiVersion: v1
kind: Pod
metadata: 
  name: busybox
  namespace: default
spec:
  containers:
  - name: busybox-pvc
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: code
      mountPath: /usr/share/nginx/html/
  volumes:
  - name: code
    persistentVolumeClaim:
      claimName: mypvc

创建pod

kubectl apply -f volumes-pod-pvc.yaml

这时查看pv就可以看到对应的pv已近处于Bind状态了。



使用StorageClass的动态创建PV


先创建:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: tz-channel-data-gateway-pvc
  namespace: default
spec:
  storageClassName: managed-nfs-storage # 使用storageClass
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 20Gi