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

ops/2025/2/21 7:21:10/

目录

一 含义

查看支持的存储卷类型

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-emptydirnamespace: defaultlabels:app: myapp
spec:containers:- name: myappimage: soscscs/myapp:v1imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80#定义容器挂载内容volumeMounts:#使用的存储卷名称,如果跟下面volume字段name值相同,则表示使用volume的这个存储卷- name: html#挂载至容器中哪个目录mountPath: /usr/share/nginx/html/- name: busyboximage: busybox:latestimagePullPolicy: IfNotPresentvolumeMounts:- 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.yamlkubectl 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: pod01namespace: default
spec:containers:- name: myappimage: soscscs/myapp:v1#定义容器挂载内容volumeMounts:#使用的存储卷名称,如果跟下面volume字段name值相同,则表示使用volume的这个存储卷- name: html#挂载至容器中哪个目录mountPath: /usr/share/nginx/html#读写挂载方式,默认为读写模式falsereadOnly: 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-nfsnamespace: default
spec:nodeName: node01containers:- name: myappimage: soscscs/myapp:v1volumeMounts:- name: htmlmountPath: /usr/share/nginx/htmlvolumes:- name: htmlnfs:path: /opt/k8sserver: stor01
~                            

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

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

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


http://www.ppmy.cn/ops/45544.html

相关文章

如果有多个文件夹,怎么快速获得文件夹的名字呢

上一篇写到怎么批量建立文件夹,那么怎么获取批量文件夹的名字呢? 一、啊这,这真是一个好问题二、这个得用Python(文本末尾有打包程序,点击链接运行就可以了)(1)首先建立一个py文件&a…

Linux 使用 yum安装 ELK服务,yum 安装elasticsearch和Kibana(未写完)

文章目录 环境准备ELK组件介绍安装Elasticsearch安装Kibana 丢弃下载ELK 服务安装包Elasticsearch安装 Tips:关闭elasticsearch https修改 es 启动内存 环境准备 ELK组件介绍 ElasticSearch : 是一个近实时(NRT)的分布式搜索和分析引擎&…

微信小程序区分运行环境

wx.getAccountInfoSync() 是微信小程序的一个 API,它可以同步获取当前账号信息。返回对象中包含小程序 AppID、插件的 AppID、小程序/插件版本等信息。 返回的对象结构如下: 小程序运行环境,可选值有:develop(开发版&…

前端一个页面依赖多个接口解决之node接口聚合

首先先介绍一下页面的接口请求处理: 接口请求之间是否存在依赖性,主要有两种处理方式: 并行请求: 当这些接口彼此之间互不依赖时,可以同时发起多个请求。这时可以使用 Promise.all([…]) 来处理,这样可以…

Python魔法之旅-魔法方法(04)

目录 一、概述 1、定义 2、作用 二、主要应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类…

android 在onCreate方法中获得view的宽高

view在绘制完成后才会有自己的宽高,所以在onCreate中要获得view的宽高可以通过以下4中方法: 1、ViewTreeObserver:监听界面绘制事件,在layout时调用,使用完毕后记得removeListener 2、view.post,因为runn…

linux中基于docker安装RabbitMQ。

在线获取安装包: docker pull rabbitmq:3.8-management(3.8-management版本号)。 切换目录后使用命令加载镜像即可: docker load -i mq.tar 安装镜像(黏贴复制命令时,不腰复制黏贴注释,#只是为了…

elasticsearch有什么用

Elasticsearch是一个开源的分布式搜索和分析引擎,它被广泛用于构建实时的、可扩展的搜索和分析应用程序。以下是Elasticsearch的主要用途和功能:12 全文搜索:Elasticsearch提供强大的全文搜索功能,可以处理大量的文本数据&…