当前位置:   article > 正文

持久化存储

持久化存储

回到目录

pod有生命周期,生命周期结束后pod里的数据会消失(如配置文件,业务数据等)。

解决: 我们需要将数据与pod分离,将数据放在专门的存储卷上

pod在k8s集群的节点中是可以调度的, 如果pod挂了被调度到另一个节点,那么数据和pod的联系会中断。

解决: 所以我们需要与集群节点分离的存储系统才能实现数据持久化

简单来说: volume提供了在容器上挂载外部存储的能力

1 存储卷分类

参考链接

  • 本地存储卷

    • emptyDir pod删除,数据也会被清除, 用于数据的临时存储

    • hostPath 宿主机目录映射(本地存储卷)

  • 网络存储卷

    • NAS类 nfs等

    • SAN类 iscsi,FC等

    • 分布式存储 glusterfs,cephfs,rbd,cinder等

    • 云存储 aws,azurefile等

2 本地存储卷-emptyDir

  • 作用:用于一个pod中的容器间数据共享,常用于数据临时存储

  • 特点:pod删除,数据也被清除;

  • 存储介质

    可以是任意类型,如 SSD、磁盘或网络存储。可以将 emptyDir.medium 设置为 Memory 让 k8s 使用 tmpfs(内存支持文件系统),速度比较快,但是重启 tmpfs 节点时,数据会被清除,且设置的大小会计入到 Container 的内存限制中。

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: test-pd
  5. spec:
  6. containers:
  7. - image: nginx
  8. name: nginx-emptydir
  9. volumeMounts: # 挂载数据卷
  10. - mountPath: /cache # 挂载路径
  11. name: cache-volume # 挂载的数据卷名
  12. volumes: # 定义数据卷
  13. - name: cache-volume # 数据卷名
  14. emptyDir: {} # 是emptyDir

3 本地存储卷-hostPath

将节点上的文件或目录挂载到 Pod 上,此时该目录会变成持久化存储目录,即使 Pod 被删除后重启,也可以重新加载到该目录,该目录下的文件不会丢失

  • 应用场景

    pod内与集群节点目录映射(pod中容器想访问节点上数据,例如监控,只有监控访问到节点主机文件才能知道集群节点主机状态)

  • 缺点

    如果集群节点挂掉,控制器在另一个集群节点拉起容器,数据就会变成另一台集群节点主机的了(无法实现数据共享)

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: test-pd
  5. spec:
  6. containers:
  7. - image: nginx
  8. name: nginx-volume
  9. volumeMounts:
  10. - mountPath: /test-pd # 挂载到容器的哪个目录
  11. name: test-volume # 挂载哪个 volume
  12. volumes:
  13. - name: test-volume
  14. hostPath:
  15. path: /data # 节点中的目录
  16. type: Directory # 检查类型,在挂载前对挂载目录做什么检查操作,有多种选项,默认为空字符串,不做任何检查


类型:
空字符串:默认类型,不做任何检查
DirectoryOrCreate:如果给定的 path 不存在,就创建一个 755 的空目录
Directory:这个目录必须存在
FileOrCreate:如果给定的文件不存在,则创建一个空文件,权限为 644
File:这个文件必须存在
Socket:UNIX 套接字,必须存在
CharDevice:字符设备,必须存在
BlockDevice:块设备,必须存在

4 网络存储卷 nfs

nfs 卷能将 NFS (网络文件系统) 挂载到你的 Pod 中。 不像 emptyDir 那样会在删除 Pod 的同时也会被删除,nfs 卷的内容在删除 Pod 时会被保存,卷只是被卸载。 这意味着 nfs 卷可以被预先填充数据,并且这些数据可以在 Pod 之间共享。

4.1 环境安装
  1. # 集群内所有节点安装 安装 nfs
  2. yum install nfs-utils -y
  3. # 作为nfs服务器节点 启动 nfs服务器
  4. systemctl start nfs-server
  5. # 查看 nfs 版本
  6. cat /proc/fs/nfsd/versions

在规划作为存储卷的节点上创建共享目录

  1. # 创建共享目录
  2. mkdir -p /data/nfs
  3. cd /data/nfs
  4. #创建读写权限目录
  5. mkdir rw
  6. #创建只读权限目录
  7. mkdir ro
  8. #设置共享
  9. vim /etc/exports
  10. #写入: 目录路径 运行访问网段,如192.168.113.0/24,在113网段都可访问,*则是运行所有访问
  11. #权限rw:读写,ro:只读
  12. /data/nfs/rw *(rw,no_root_squash,sync)
  13. /data/nfs/ro *(ro,no_root_squash,sync)
  14. #配置生效
  15. exportfs -f
  16. #重启服务
  17. systemctl reload nfs-server
4.2 在其他节点进行测试
  1. #在k8s-node3上【非nfs服务器节点】
  2. #先创建目录
  3. mkdir -p /mnt/nfs/rw
  4. mkdir -p /mnt/nfs/ro
  5. #挂载
  6. #ip为设置共享目录的节点ip,紧跟共享目录路径 对应到当前节点目录
  7. mount -t nfs 10.147.20.103:/data/nfs/ro /mnt/nfs/ro
  8. #访问/mnt/nfs/ro即可
  9. #查看当前节点挂载目标节点nfs
  10. [root@k8s-node4 ro]# showmount -e 10.147.20.103
  11. Export list for 10.147.20.103:
  12. /data/nfs/rw *
  13. /data/nfs/ro *
4.3 使用

创建test-nfs-deploy.yaml

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: volume-nfs
  5. spec:
  6. replicas: 2
  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:1.15-alpine
  18. imagePullPolicy: IfNotPresent
  19. volumeMounts: # 挂载数据卷
  20. - name: documentroot # 挂载数据卷的名称
  21. mountPath: /usr/share/nginx/html # 挂载到容器中的路径
  22. ports:
  23. - containerPort: 80
  24. volumes: # 定义数据卷
  25. - name: documentroot # 数据卷名称
  26. nfs: # 使用nfs
  27. server: 10.147.20.103 # nfs服务器的ip或者域名
  28. path: /data/nfs # nfs服务器的nfs共享目录路径

验证

  1. #1. 创建deplyment
  2. [root@k8s-master1 nfs-test]# kubectl create -f test-nfs-deploy.ymal
  3. deployment.apps/volume-nfs created
  4. #2. 查看deployment和pod
  5. [root@k8s-master1 nfs-test]# kubectl get deploy
  6. NAME READY UP-TO-DATE AVAILABLE AGE
  7. nginx-server1 2/2 2 2 19h
  8. volume-nfs 2/2 2 2 15s
  9. [root@k8s-master1 nfs-test]# kubectl get po
  10. NAME READY STATUS RESTARTS
  11. volume-nfs-856699bcc8-9vxv5 1/1 Running 0
  12. volume-nfs-856699bcc8-hzklc 0/1 ContainerCreating 0
  13. #3. 进入其中一个pod
  14. [root@k8s-master1 nfs-test]# kubectl exec -it volume-nfs-856699bcc8-9vxv5 -- /bin/sh
  15. / # ls
  16. bin etc lib mnt proc run srv tmp var
  17. dev home media opt root sbin sys usr
  18. #4. 进入共享目录/usr/share/nginx/html
  19. / # cd /usr/share/
  20. /usr/share # ls
  21. GeoIP apk man misc nginx zoneinfo
  22. /usr/share # cd nginx/
  23. /usr/share/nginx # ls
  24. html
  25. usr/share/nginx # cd html/
  26. #5. 查看,有共享的目录ro和rw
  27. /usr/share/nginx/html # ls
  28. ro rw
  29. #6. 进入ro,查看有共享的文件
  30. /usr/share/nginx/html # cd ro/
  31. /usr/share/nginx/html/ro # ls
  32. Readme.md index.html
  33. /usr/share/nginx/html/ro # cat index.html
  34. volume-nfs
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/981390
推荐阅读
相关标签
  

闽ICP备14008679号