一、PV、PVC图解
一些概念:
Volume:NFS、CEPH、GFS
PersistentVolume:NFS、CEPG/GFS
PV、PVC
PV:由k8s配置的存储,PV同样是集群的一类资源,yaml。
PVC:对PV的申请,
PersistentVolumeClaim
PV文档:https://kubernetes.io/docs/concepts/storage/persistent-volumes/
Nfs类型的PV:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0003
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: slow
mountOptions:
- hard
- nfsvers=4.1
nfs:
path: /tmp
server: 172.17.0.2
persistentVolumeReclaimPolicy:#类型
Recycle: 回收,rm -rf
Deployment -> PVC PV, Recycle。
Retain:保留。
Delete:PVC –-> PV,删除PVC后PV也会被删掉,这一类的PV,需要支持删除的功能,动态存储默认方式。
Capacity:PV的容量。
volumeMode:挂载的类型,Filesystem,block
accessModes:这个的PV访问模式:
ReadWriteOnce:RWO,可以被单节点以读写的模式挂载。
ReadWriteMany:RWX,可以被多节点以读写的形式挂载。
ReadOnlyMany:ROX,可以被多个节点以只读的形式挂载。
storageClassName:PV的类,可以说是一个类名,PVC和PV的这个名字一样,才能被绑定。
Pv的状态:
Available:空闲的PV,没有被任何PVC绑定。
Bound:已经被PVC绑定
Released:PVC被删除,但是资源未被重新使用
Failed:自动回收失败。
二、创建一个NFS的PV
[root@k8s-master01 app]# cat nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0001
spec:
capacity:
storage: 5Gi # 定义内存大小,PVC的要比这个小
volumeMode: Filesystem # 文件系统类型
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle # 策略上面有介绍
storageClassName: nfs-slow # 这个名字是PVC创建的时候要对应的名字
mountOptions:
- hard
- nfsvers=4.1
nfs: #对应上nfs服务器的 ip 共享的文件夹
path: /data/nfs
server: 192.168.1.104
# CREATE pv
[root@k8s-master01 app]# kubectl create -f nfs-pv.yaml
persistentvolume/pv0001 created
# 查看PV
[root@k8s-master01 app]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv0001 5Gi RWO Recycle Available nfs-slow 2m3s
三、创建一个PVC
# 绑定到指定类型的PV
[root@k8s-master01 app]# cat test-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim # PVC的名字,可自取
spec:
accessModes:
- ReadWriteMany
volumeMode: Filesystem
resources:
requests:
storage: 2Gi
storageClassName: nfs-slow # 名字要对应上想绑定的PV上
# create PVC
[root@k8s-master01 app]# kubectl create -f test-pvc.yaml
persistentvolumeclaim/myclaim created
# 查看PVC
[root@k8s-master01 app]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
myclaim Bound pv0001 5Gi RWX nfs-slow 34s
# 再次查看PV,可看到状态已经发生改变
[root@k8s-master01 app]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv0001 5Gi RWX Recycle Bound default/myclaim nfs-slow 13m
四、更改deployment使用PVC类型的volume
# 更改后的yaml,在对应位置加上以下参数调用PVC
volumeMounts:
- mountPath: /opt/pvc
name: mypd
volumes:
- name: mypd
persistentVolumeClaim:
claimName: myclaim
# 然后进入容器查看是否挂载成功
[root@k8s-master01 app]# kubectl exec -it nginx-5bb6d88dfb-w78k8 -c nginx2 -- bash
root@nginx-5bb6d88dfb-w78k8:/# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 37G 4.3G 33G 12% /
tmpfs 64M 0 64M 0% /dev
tmpfs 985M 0 985M 0% /sys/fs/cgroup
/dev/mapper/centos-root 37G 4.3G 33G 12% /mnt
192.168.1.104:/data/nfs 37G 3.0G 35G 9% /opt/pvc # 这就是刚刚挂载的PVC
# 文件能共享
root@nginx-5bb6d88dfb-w78k8:/opt/pvc# ls
pvc qqq test
root@nginx-5bb6d88dfb-w78k8:/opt/pvc# echo 11 > test
root@nginx-5bb6d88dfb-w78k8:/opt/pvc# cat test
11
很多情况下:
创建PVC之后,一直绑定不上PV(Pending):
1. PVC的空间申请大小大于PV的大小
2. PVC的StorageClassName没有和PV的一致
3. PVC的accessModes和PV的不一致
创建挂载了PVC的Pod之后,一直处于Pending状态:
1. PVC没有被创建成功,或者被创建
2. PVC和Pod不在同一个Namespace
删除PVC后k8s会创建一个用于回收的Pod根据PV的回收策略进行pv的回收回收完以后PV的状态就会变成可被绑定的状态也就是空闲状态其他的Pending状态的PVC如果匹配到了这个PV,他就能和这个PV进行绑定。