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

目录

[一 含义](#一 含义)

查看支持的存储卷类型

emptyDir存储卷

[1.1 特点](#1.1 特点)

[1.2 用途](#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共享数据。

相关推荐
小马爱打代码41 分钟前
zookeeper:一致性原理和算法
分布式·zookeeper·云原生
1024find4 小时前
Spark on k8s部署
大数据·运维·容器·spark·kubernetes
kura_tsuki4 小时前
[Docker集群] Docker 容器入门
运维·docker·容器
能不能别报错17 小时前
K8s学习笔记(十六) 探针(Probe)
笔记·学习·kubernetes
能不能别报错18 小时前
K8s学习笔记(十四) DaemonSet
笔记·学习·kubernetes
火星MARK19 小时前
k8s面试题
容器·面试·kubernetes
Serverless社区21 小时前
阿里云函数计算 AgentRun 全新发布,构筑智能体时代的基础设施
阿里云·云原生·serverless·函数计算
赵渝强老师21 小时前
【赵渝强老师】Docker容器的资源管理机制
linux·docker·容器·kubernetes
能不能别报错1 天前
K8s学习笔记(十五) pause容器与init容器
笔记·学习·kubernetes
稚辉君.MCA_P8_Java1 天前
kafka解决了什么问题?mmap 和sendfile
java·spring boot·分布式·kafka·kubernetes