Pod使用Volume步骤:
1、在Pod上定义存储卷,并关联至目标存储服务上;
2、在需要用到存储卷的容器上,挂载其所属的Pod的存储卷;

存储卷类型:
Host级别:hostPath, Local
网络级别:NFS、GlusterFS、rbd(块设备)、CephFS(文件系统)、…
临时存储:emptyDir

本质上,K8s volume是一个目录,这点和Docker volume差不多,当Volume被mount到Pod上,这个Pod中的所有容器都可以访问这个volume,在生产场景中,我们常用的类型有这几种:
emptyDir:在宿主机上创建一个临时空目录并挂载到容器,pod删,emptyDir数据也会删
hostPath:挂载宿主机目录或文件到容器
PersistentVolume(PV) & PersistentVolumeClaim(PVC)
StorageClass

pv 持久卷
pvc 持久卷消费
先创建pv.yaml,再创建pvc.yaml,把pv绑定到pvc上
pvc挂载到pv上,status为Bound
pv被pvc消费,claim为pvc
deployment.yaml则开始挂载这个pvc
如何回收pvc以及pv

PV与PVC绑定依据:存储容量、匹配模式

创建nfs

vi nfs-nginx.yaml

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-dep1
  5. spec:
  6. replicas: 1
  7. selector:
  8. matchLabels:
  9. app: nginx
  10. template:
  11. metadata:
  12. labels:
  13. app: nginx
  14. spec:
  15. containers:
  16. - name: nginx
  17. image: nginx
  18. volumeMounts:
  19. - name: wwwroot
  20. mountPath: /usr/share/nginx/html
  21. ports:
  22. - containerPort: 80
  23. volumes:
  24. - name: wwwroot
  25. nfs:
  26. server: 192.168.xxx.xxx # nfs服务器地址
  27. path: /data/nfs

kubectl apply -f nfs-nginx.yaml
kubectl get pods
kukbectl exec -it pod-name /bin/bash
ls /usr/share/nginx/html # 在pod中查看挂载目录是否有内容

创建pv

vi pv.yaml

  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4. name: my-pv
  5. spec:
  6. capacity:
  7. storage: 5Gi
  8. accessModes:
  9. - ReadWriteMany
  10. nfs:
  11. path: /data/nfs
  12. server: 192.168.44.134

kubectl apply -f pv.yaml

创建pvc

vi pvc.yaml

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-dep1
  5. spec:
  6. replicas: 3
  7. selector:
  8. matchLabels:
  9. app: nginx
  10. template:
  11. metadata:
  12. labels:
  13. app: nginx
  14. spec:
  15. containers:
  16. - name: nginx
  17. image: nginx
  18. volumeMounts:
  19. - name: wwwroot
  20. mountPath: /usr/share/nginx/html
  21. ports:
  22. - containerPort: 80
  23. volumes:
  24. - name: wwwroot
  25. persistentVolumeClaim:
  26. claimName: my-pvc
  27. ---
  28. apiVersion: v1
  29. kind: PersistentVolumeClaim
  30. metadata:
  31. name: my-pvc
  32. spec:
  33. accessModes:
  34. - ReadWriteMany
  35. resources:
  36. requests:
  37. storage: 5Gi

kubectl apply -f pvc.yaml
kubectl get pv,pvc
kubectl get pods

emptyDir

一般emptyDir卷用于Pod中的不同Container共享数据。它可以被挂载到相同或不同的路径上
如果pod删除,emptyDir卷中的数据也将被删除,因为主要是用来做数据共享的,并不是存储
直接指定emptyDir为{}即可

  1. volumeMounts:
  2. - mountPath: /share
  3. name: share-volume
  4. volumes:
  5. - name: share-volume
  6. emptyDir: {}

hostPath

nfs

基于nfs创建一个PV来实现的

  1. # 官网实现
  2. apiVersion: v1
  3. kind: PersistentVolume
  4. metadata:
  5. name: nfs
  6. spec:
  7. capacity:
  8. storage: 1Mi
  9. accessModes:
  10. - ReadWriteMany
  11. nfs:
  12. server: nfs-server.default.svc.cluster.local
  13. path: "/"

图片.png
pvc不用关心存储集群是用什么,只需要关心与pv的关联
pv分两种:动态pv、静态pv
静态pv:nfs (手动创建pv)
动态pv:ceph gfs (动态生成pv)