持久化存储

回到目录

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 的内存限制中。

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

3 本地存储卷-hostPath

将节点上的文件或目录挂载到 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:块设备,必须存在

4 网络存储卷 nfs

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

4.1 环境安装
# 集群内所有节点安装 安装 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
4.2 在其他节点进行测试
#在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 *
4.3 使用

创建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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值