前言
在之前我们使用了原生方式进行数据挂载,但这种方式挂载会有几个问题:
1.挂载的外部文件夹(比如上面的/nfs/data/nginx-pv)我们得自己创建
2.如果我们的pod不要了,我们上面挂载的目录的文件还会在,不会跟着删(你可以测试删掉pod,去nfs挂载的目录去看下)这个问题,当你pod很多的时候,那残留的文件就会很大
3.对每个pod能使用的空间没有限制,当某个pod使用很大,甚至用满了的时候,就会影响其他pod的使用
针对上面的问题,k8s也给我们提供了相关的解决方案那就是pc跟pvc
PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置,说白了就是你数据真正存储的地方
PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格,以前我们是直接使用,现在我们需要申请才能使用了,而且你申请的时候你得告知你需要使用多大的空间,这个申请书就是pvc,这个申请书跟空间做了绑定,你的pod删了,也带着这个申请书一起删,申请书删了,你申请的空间也就跟着一起删了
实践
创建pv池
#nfs主节点先创建几个空目录
mkdir -p /nfs/data/01
mkdir -p /nfs/data/02
mkdir -p /nfs/data/03
创建pv
注意修改nfs server地址
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv01-10m
spec:
capacity:
storage: 10M
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/01
server: 172.16.55.75
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv02-1gi
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/02
server: 172.16.55.75
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv03-3gi
spec:
capacity:
storage: 3Gi
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/03
server: 172.16.55.75
你也可以把上面的文件分成3个文件
执行该文件
kubectl apply -f pv.yaml
查看下有多少这种资源
[root@k8s-master opt]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv01-10m 10M RWX Retain Available nfs 4s
pv02-1gi 1Gi RWX Retain Available nfs 4s
pv03-3gi 3Gi RWX Retain Available nfs 4s
当我们创建好pv以后,我们就可以创建pvc,pvc就是我们的申请书
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nginx-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 200Mi
storageClassName: nfs
执行上面文件
kubectl apply -f pvc.yaml
再次查看pvc
[root@k8s-master opt]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv01-10m 10M RWX Retain Available nfs 36s
pv02-1gi 1Gi RWX Retain Bound default/nginx-pvc nfs 36s
pv03-3gi 3Gi RWX Retain Available nfs 36s
发现这个pv02-1gi绑定了我们刚才的pvc,为什么是这个,因为我们申请的是200M,01太小,03太大,k8s帮我们自动做了选择
创建Pod绑定PVC
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-deploy-pvc
name: nginx-deploy-pvc
spec:
replicas: 2
selector:
matchLabels:
app: nginx-deploy-pvc
template:
metadata:
labels:
app: nginx-deploy-pvc
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
persistentVolumeClaim:
claimName: nginx-pvc
执行上面文件
kubectl apply -f pvc-deploy.yaml
可以看到是在02这个pv里面
[root@k8s-master 02]# kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/pv01-10m 10M RWX Retain Available nfs 4m49s
persistentvolume/pv02-1gi 1Gi RWX Retain Bound default/nginx-pvc nfs 4m49s
persistentvolume/pv03-3gi 3Gi RWX Retain Available nfs 4m49s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/nginx-pvc Bound pv02-1gi 1Gi RWX nfs 4m19s
我们进入到02里面新建个文件
cd /nfs/data/02
echo 111 > index.html
进入容器中确实能看到我们新增的这个文件
现在是落在02这个pv 这个pv有1G的容量,你可以尝试下载一个大于1G的,超过以后会报错
以上使用的是静态供应,需要我们手动创建pv池,其实还可以支持动态供应,这个后面有机会再单独细说