探索k8s集群的存储卷 emptyDir hostPath nfs

目录

一 含义

查看支持的存储卷类型

emptyDir存储卷  

1.1 特点

1.2 用途 

1.3部署 

二、hostPath存储卷 


一 含义

容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失——容器以干净的状态(镜像最初的状态)重新启动。其次,在Pod中同时运行多个容器时,这些容器之间通常需要共享文件。Kubernetes 中的Volume抽象就很好的解决了这些问题。Pod中的容器通过Pause容器共Volume。
 

查看支持的存储卷类型

kubectl explain pod.spec.volumes

 

 

常用的有:emptyDir、hostPath、nfs、persistentVolumeClaim  

emptyDir存储卷  

当Pod被分配给节点时,首先创建emptyDir卷,并且只要该Pod在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的。Pod 中的容器可以读取和写入emptyDir卷中的相同文件,尽管该卷可以挂载到每个容器中的相同或不同路径上。当出于任何原因从节点中删除 Pod 时,emptyDir中的数据将被永久删除。(将数据卷挂载到容器里面,如果容器被删除,则里面的数据也会被永久删除)

1.1 特点
  • 临时性存储:

emptyDir 提供的存储是临时的,其生命周期与所属的 Pod 相关。

当 Pod 被删除时,emptyDir 中的数据也会被清除,因此不适合用于持久化存储。

  • Pod 内容器之间的共享:

emptyDir 在同一个 Pod 中的所有容器之间共享,容器可以读写其中的数据。pod里面的容器挂载数据卷里面的内容都是一致的。

1.2 用途 

适用于需要在同一个 Pod 中的多个容器之间进行临时数据交换或共享的场景。

例如,可以用于容器间的缓存共享、临时文件存储等用途。

1.3部署 
apiVersion: v1
kind: Pod
metadata:
  name: pod-emptydir
  namespace: default
  labels:
    app: myapp
spec:
  containers:
  - name: myapp
    image: soscscs/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
        #定义容器挂载内容
    volumeMounts:
        #使用的存储卷名称,如果跟下面volume字段name值相同,则表示使用volume的这个存储卷
    - name: html
          #挂载至容器中哪个目录
      mountPath: /usr/share/nginx/html/
  - name: busybox
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: html
          #在容器内定义挂载存储名称和挂载路径
      mountPath: /data/
    command: ['/bin/sh','-c','while true;do echo $(date) >> /data/index.html;sleep 2;done']
  #定义存储卷
  volumes:
  #定义存储卷名称  
  - name: html
    #定义存储卷类型
    emptyDir: {}

 

kubectl apply -f pod-emptydir.yaml
 
kubectl get pods -o wide

 

 

随后,利用同样的方法去查看 busybox容器里面

两个容器里面的内容是一致的,两个数据目录里面的内容是同步的

在上面定义了2个容器,其中一个容器是输入日期到index.html中,然后验证访问nginx的html是否可以获取日期。以验证两个容器之间挂载的emptyDir实现共享。

 因为emptydir是临时存在的:

删除之前创建的pod  随后,再重新apply -f 生成新的yaml文件和新的pod

随后,再进入查看里面的内容是否发生改变

删除pod

随后,进行重新创建pod 

 随后,再进入pod容器里面查看数据 是否能保存   之前的数据丢失

二、hostPath存储卷 (只能在单个节点进行存储)

例如 在node01上面创建目录,并且写入内容,随后将此目录共享到pod容器里面

补充:在yaml文件里面 主要hostpath有以下几种类型:

查看hostPath中必须要写的类型

apiVersion: v1
kind: Pod
metadata:
  name: pod01
  namespace: default
spec:
  containers:
  - name: myapp
    image: soscscs/myapp:v1
        #定义容器挂载内容
    volumeMounts:
        #使用的存储卷名称,如果跟下面volume字段name值相同,则表示使用volume的这个存储卷
    - name: html
          #挂载至容器中哪个目录
      mountPath: /usr/share/nginx/html
          #读写挂载方式,默认为读写模式false
          readOnly: false
  #volumes字段定义了paues容器关联的宿主机或分布式文件系统存储卷
  volumes:
    #存储卷名称
    - name: html
          #路径,为宿主机存储路径
      hostPath:
            #在宿主机上目录的路径
        path: /data/pod/volume1
                #定义类型,这表示如果宿主机没有此目录则会自动创建
        type: DirectoryOrCreate

 因为挂载到node01上面,所以在node01上面操作 

去node01里面的/data/pod/volume1 如果没有的情况下,会自动创建,并且写入数据

随后,去容器里面进行查看,node节点跟pod容器共享数据成功

删除pod,再重建,验证是否依旧可以访问原来的内容

kubectl delete -f pod-hostpath.yaml  
kubectl apply -f pod-hostpath.yaml 

 删除pod,再重建,指定到node02节点,验证是否依旧可以访问原来的内容 

 随后,进入到node02节点上

在自己节点本身是可以可读可写的,而容器里面是只能读,不能写

举例说明

进入到容器里面

并且hostpath指定的是一个节点,不能实现跨主机数据持久化,在node02上面的是this is node01 而指定调度到node02时,指定的是this is node02  不能实现跨主机数据持久化

 

 hostpath:可以实现持久化存储,使用node节点的目录或文件挂载到容器,但是存储空间会受到node节点单机限制,node节点故障数据会丢失,pod跨节点不能共享数据

 hostPath特点

2.3 用途

三、nfs共享存储卷

nfs:可以实现持久化存储,使用nfs将存储设备空间挂载到容器中,pod可以跨node节点共享数据

3.2用途 

3.3部署 

准备一台新的机器去下载nfs

 

 

 随后,去node节点上面查看是否有共享数据

node1:

node2:

随后,将nfs上的主机名修改为stor01

并且在node节点上面添加映射 node1 node2一起操作

 

 master节点操作

 

 在nfs服务器上创建index.html

 master节点操作

 

将nfs的共享目录挂载到容器里面,随后容器跟共享目录的数据一致,可读可写。

假设如果要指定容器在node01上,因为刚刚没有指定的情况下是指定在node02上的

apiVersion: v1
kind: Pod
metadata:
  name: pod-vol-nfs
  namespace: default
spec:
  nodeName: node01
  containers:
  - name: myapp
    image: soscscs/myapp:v1
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
  volumes:
    - name: html
      nfs:
        path: /opt/k8s
        server: stor01
~                            

 随后,删除并重新建立yaml文件

 表示,nfs可以跨主机保存数据

nfs总结:将nfs服务的共享数据卷挂载到pod容器中,有持久化数据的能力,且也能实现跨node节点的pod共享数据。

  • 23
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值