k8s从入门到实战(十一):k8s存储之pv与pvc使用

689 阅读3分钟
前言

在之前我们使用了原生方式进行数据挂载,但这种方式挂载会有几个问题:

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

进入容器中确实能看到我们新增的这个文件

image.png

现在是落在02这个pv 这个pv有1G的容量,你可以尝试下载一个大于1G的,超过以后会报错

以上使用的是静态供应,需要我们手动创建pv池,其实还可以支持动态供应,这个后面有机会再单独细说