赞
踩
pod有生命周期,生命周期结束后pod里的数据会消失(如配置文件,业务数据等)。
解决: 我们需要将数据与pod分离,将数据放在专门的存储卷上
pod在k8s集群的节点中是可以调度的, 如果pod挂了被调度到另一个节点,那么数据和pod的联系会中断。
解决: 所以我们需要与集群节点分离的存储系统才能实现数据持久化
简单来说: volume提供了在容器上挂载外部存储的能力
本地存储卷
emptyDir pod删除,数据也会被清除, 用于数据的临时存储
hostPath 宿主机目录映射(本地存储卷)
网络存储卷
NAS类 nfs等
SAN类 iscsi,FC等
分布式存储 glusterfs,cephfs,rbd,cinder等
云存储 aws,azurefile等
作用:用于一个pod中的容器间数据共享,常用于数据临时存储
特点:pod删除,数据也被清除;
存储介质
可以是任意类型,如 SSD、磁盘或网络存储。可以将 emptyDir.medium 设置为 Memory 让 k8s 使用 tmpfs(内存支持文件系统),速度比较快,但是重启 tmpfs 节点时,数据会被清除,且设置的大小会计入到 Container 的内存限制中。
- apiVersion: v1
- kind: Pod
- metadata:
- name: test-pd
- spec:
- containers:
- - image: nginx
- name: nginx-emptydir
- volumeMounts: # 挂载数据卷
- - mountPath: /cache # 挂载路径
- name: cache-volume # 挂载的数据卷名
- volumes: # 定义数据卷
- - name: cache-volume # 数据卷名
- emptyDir: {} # 是emptyDir
将节点上的文件或目录挂载到 Pod 上,此时该目录会变成持久化存储目录,即使 Pod 被删除后重启,也可以重新加载到该目录,该目录下的文件不会丢失
应用场景
pod内与集群节点目录映射(pod中容器想访问节点上数据,例如监控,只有监控访问到节点主机文件才能知道集群节点主机状态)
缺点
如果集群节点挂掉,控制器在另一个集群节点拉起容器,数据就会变成另一台集群节点主机的了(无法实现数据共享)
- apiVersion: v1
- kind: Pod
- metadata:
- name: test-pd
- spec:
- containers:
- - image: nginx
- name: nginx-volume
- volumeMounts:
- - mountPath: /test-pd # 挂载到容器的哪个目录
- name: test-volume # 挂载哪个 volume
- volumes:
- - name: test-volume
- hostPath:
- path: /data # 节点中的目录
- type: Directory # 检查类型,在挂载前对挂载目录做什么检查操作,有多种选项,默认为空字符串,不做任何检查
-
类型:
空字符串:默认类型,不做任何检查
DirectoryOrCreate:如果给定的 path 不存在,就创建一个 755 的空目录
Directory:这个目录必须存在
FileOrCreate:如果给定的文件不存在,则创建一个空文件,权限为 644
File:这个文件必须存在
Socket:UNIX 套接字,必须存在
CharDevice:字符设备,必须存在
BlockDevice:块设备,必须存在
nfs 卷能将 NFS (网络文件系统) 挂载到你的 Pod 中。 不像 emptyDir 那样会在删除 Pod 的同时也会被删除,nfs 卷的内容在删除 Pod 时会被保存,卷只是被卸载。 这意味着 nfs 卷可以被预先填充数据,并且这些数据可以在 Pod 之间共享。
- # 集群内所有节点安装 安装 nfs
- yum install nfs-utils -y
-
- # 作为nfs服务器节点 启动 nfs服务器
- systemctl start nfs-server
-
- # 查看 nfs 版本
- cat /proc/fs/nfsd/versions
在规划作为存储卷的节点上创建共享目录
- # 创建共享目录
- mkdir -p /data/nfs
- cd /data/nfs
- #创建读写权限目录
- mkdir rw
- #创建只读权限目录
- mkdir ro
-
- #设置共享
- vim /etc/exports
- #写入: 目录路径 运行访问网段,如192.168.113.0/24,在113网段都可访问,*则是运行所有访问
- #权限rw:读写,ro:只读
- /data/nfs/rw *(rw,no_root_squash,sync)
- /data/nfs/ro *(ro,no_root_squash,sync)
-
- #配置生效
- exportfs -f
- #重启服务
- systemctl reload nfs-server
- #在k8s-node3上【非nfs服务器节点】
-
- #先创建目录
- mkdir -p /mnt/nfs/rw
- mkdir -p /mnt/nfs/ro
-
- #挂载
- #ip为设置共享目录的节点ip,紧跟共享目录路径 对应到当前节点目录
- mount -t nfs 10.147.20.103:/data/nfs/ro /mnt/nfs/ro
-
- #访问/mnt/nfs/ro即可
-
- #查看当前节点挂载目标节点nfs
- [root@k8s-node4 ro]# showmount -e 10.147.20.103
- Export list for 10.147.20.103:
- /data/nfs/rw *
- /data/nfs/ro *
创建test-nfs-deploy.yaml
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: volume-nfs
- spec:
- replicas: 2
- selector:
- matchLabels:
- app: nginx
- template:
- metadata:
- labels:
- app: nginx
- spec:
- containers:
- - name: nginx
- image: nginx:1.15-alpine
- imagePullPolicy: IfNotPresent
- volumeMounts: # 挂载数据卷
- - name: documentroot # 挂载数据卷的名称
- mountPath: /usr/share/nginx/html # 挂载到容器中的路径
- ports:
- - containerPort: 80
- volumes: # 定义数据卷
- - name: documentroot # 数据卷名称
- nfs: # 使用nfs
- server: 10.147.20.103 # nfs服务器的ip或者域名
- path: /data/nfs # nfs服务器的nfs共享目录路径
验证
- #1. 创建deplyment
- [root@k8s-master1 nfs-test]# kubectl create -f test-nfs-deploy.ymal
- deployment.apps/volume-nfs created
-
- #2. 查看deployment和pod
- [root@k8s-master1 nfs-test]# kubectl get deploy
- NAME READY UP-TO-DATE AVAILABLE AGE
- nginx-server1 2/2 2 2 19h
- volume-nfs 2/2 2 2 15s
-
- [root@k8s-master1 nfs-test]# kubectl get po
- NAME READY STATUS RESTARTS
- volume-nfs-856699bcc8-9vxv5 1/1 Running 0
- volume-nfs-856699bcc8-hzklc 0/1 ContainerCreating 0
-
- #3. 进入其中一个pod
- [root@k8s-master1 nfs-test]# kubectl exec -it volume-nfs-856699bcc8-9vxv5 -- /bin/sh
- / # ls
- bin etc lib mnt proc run srv tmp var
- dev home media opt root sbin sys usr
- #4. 进入共享目录/usr/share/nginx/html
- / # cd /usr/share/
- /usr/share # ls
- GeoIP apk man misc nginx zoneinfo
- /usr/share # cd nginx/
- /usr/share/nginx # ls
- html
- usr/share/nginx # cd html/
-
- #5. 查看,有共享的目录ro和rw
- /usr/share/nginx/html # ls
- ro rw
-
- #6. 进入ro,查看有共享的文件
- /usr/share/nginx/html # cd ro/
- /usr/share/nginx/html/ro # ls
- Readme.md index.html
- /usr/share/nginx/html/ro # cat index.html
- volume-nfs
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。