k8s中EmptyDir、HostPath、NFS三种基本存储方式介绍

2023-12-18 18:45

本文主要是介绍k8s中EmptyDir、HostPath、NFS三种基本存储方式介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一.数据存储介绍

二.EmptyDir

1.简介

2.案例演示

三.HostPath

1.简介

2.案例演示

(1)介绍一下type类型

(2)简单演示

(3)数据同步功能

四.NFS

1.简介

2.案例演示

(1)简单演示

(2)模拟同步功能和node异常


 

一.数据存储介绍

在此前我们所看到的service、pod等的演示实验中的其资源经常被删除重建,数据经常清除,那么我们需要一个东西去解决持久化保存容器数据的问题。

Volume创建出来是Pod中能够被多个容器访问的共享目录,它被定义在Pod上,然后被一个Pod里的多个容器挂载到具体的文件目录下,k8s通过Volume实现在同一个Pod中不同容器之间的数据共享以及数据的持久化存储。

pod中容器的生命状态和volume数据保持独立,这篇文章先主要介绍emptydir、hostpath、nfs三种基本存储类型,当然基本存储类型不止这三种。

二.EmptyDir

1.简介

(1)emptydir是volume中最基础的类型,表示一个空目录,在关联的pod被删除后,emptydir也跟着被删除了(永久)。

(2)当使用EmptyDir类型的volume时,工作区域是在pod内,Kubernetes会为每个Pod创建一个空目录,并将该目录挂载到Pod的每个容器中。这意味着所有在同一Pod中运行的容器都可以访问该卷,并在其中读取和写入数据。

(3)像下面这个两个容器共享目录的例子或者那种不需要永久存储数据的环境下可以使用。

2.案例演示

如下,创建一个关于nginx和busybox的pod,指定volumes类型为emptydir,并进行访问测试,手动将获取的日志文件拷贝到主机

[root@k8s-master volume]# cat testemptydir.yaml 
apiVersion: v1
kind: Pod
metadata:name: my-nginx-emptydirnamespace: myns
spec:containers:- name: nginx   #nginx分配来产生日志image: nginxports:- name: nginx-portcontainerPort: 80volumeMounts:- name: myvolume    #将名为myvolume的volume挂载到/var/log/nginxmountPath: /var/log/nginx- name: busybox   #busybox分配来输出日志image: busyboxcommand: ["/bin/sh","-c","tail -f /logs/access.log"]    #持续监控访问日志情况,因为已经挂载到一起,所以应该是挂载后的/logs/access.logvolumeMounts:- name: myvolume  #将名为myvolume的volume挂载到/logs,这样在busybox容器中的/logs下就可以看到/var/log/nginx下的日志文件mountPath: /logsvolumes:- name: myvolume    #指定volume名称emptyDir: {}   #指定volume类型
​
[root@k8s-master volume]# kubectl apply -f testemptydir.yamlpod/my-nginx-emptydir created
​
[root@k8s-master volume]# kubectl get pods -n myns -o wide    #在集群其他节点访问几次podIP,
NAME                READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
my-nginx-emptydir   2/2     Running   0          80s   10.244.36.65   k8s-node1   <none>           <none>
​
[root@k8s-master volume]# kubectl logs -f my-nginx-emptydir -n myns -c busybox
#通过logs命令来观测busybox日志变化
#-f持续监控变化,-c指定容器名称
192.168.2.151 - - [12/Dec/2023:13:47:31 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
10.244.169.128 - - [12/Dec/2023:13:47:38 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
192.168.2.151 - - [12/Dec/2023:13:48:14 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
192.168.2.151 - - [12/Dec/2023:13:48:15 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
​
[root@k8s-master volume]# kubectl cp my-nginx-emptydir:logs/access.log -n myns -c busybox /root/volume/access1
#可以使用cp命令将容器内挂载的日志文件拷贝到主机,如上
[root@k8s-master volume]# ll
total 8
-rw-r--r-- 1 root root 377 Dec 12 22:06 access1
-rw-r--r-- 1 root root 464 Dec 12 21:44 testemptydir.yaml
[root@k8s-master volume]# cat access1 
192.168.2.151 - - [12/Dec/2023:13:47:31 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
10.244.169.128 - - [12/Dec/2023:13:47:38 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
192.168.2.151 - - [12/Dec/2023:13:48:14 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
192.168.2.151 - - [12/Dec/2023:13:48:15 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"

三.HostPath

1.简介

(1)hostpath是将node上实际目录挂载到pod中提供给容器使用,工作区域是在node上,pod丢失但数据还在主机上,就可以解决emptydir中pod和数据一起被销毁的问题。

(2)同时在容器中的挂载的目录和主机上的这个实际目录是同步的。

2.案例演示

(1)介绍一下type类型

DirectoryOrCreate:目录存在就使用,不存在就先创建后使用

FileOrCreate:文件存在就使用,不存在就先创建后使用

Directory:目录必须存在,否则运行不成功

File:文件必须存在,否则运行不成功

Socket:unix套接字必须存在,否则运行不成功

CharDevice:字符设备必须存在,否则运行不成功

BlockDevice:块设备必须存在,否则运行不成功

(2)简单演示

如下,创建了一个关于nginx和busybox的pod,指定运行在node1(我已经label该node的标签为“name=node1”),将共享目录内的日志文件同步到运行pod的主机上

[root@k8s-master volume]# cat testemptydir.yaml 
apiVersion: v1
kind: Pod
metadata:name: my-nginx-hostpathnamespace: myns
spec:nodeSelector:name: node1containers:- name: nginximage: nginxports:- name: nginx-portcontainerPort: 80volumeMounts:- name: myvolumemountPath: /var/log/nginx- name: busyboximage: busyboxcommand: ["/bin/sh","-c","tail -f /logs/access.log"]volumeMounts:- name: myvolumemountPath: /logsvolumes:- name: myvolumehostPath:path: /root/volumes/logstype: DirectoryOrCreate   #使用DirectoryOrCreate类型
​
[root@k8s-master volume]# kubectl get pods -n myns -o wide
NAME                READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
my-nginx-hostpath   2/2     Running   0          57s   10.244.36.66   k8s-node1   <none>           <none>
​
[root@k8s-master volume]# kubectl logs -f my-nginx-hostpath -c busybox -n myns  #在node1上curl后查看pod日志
192.168.2.151 - - [13/Dec/2023:12:52:06 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
192.168.2.151 - - [13/Dec/2023:12:52:35 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
192.168.2.151 - - [13/Dec/2023:12:52:36 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
​
[root@k8s-node1 ~]# ls /root/volumes/logs/   #我本没有此目录,查看是否新建了该目录
access.log  error.log
​

(3)数据同步功能

在主机的实际目录中新建文件,查看容器中是否新建

[root@k8s-node1 ~]# cat /root/volumes/logs/access.log    #如下是目录文件同步情况测试,正常
192.168.2.151 - - [13/Dec/2023:12:52:06 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
192.168.2.151 - - [13/Dec/2023:12:52:35 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
192.168.2.151 - - [13/Dec/2023:12:52:36 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
[root@k8s-master volume]# kubectl exec my-nginx-hostpath -it -c busybox -n myns -- /bin/sh -c "ls /logs"
access.log  error.log
[root@k8s-node1 logs]# touch su.txt
[root@k8s-master volume]# kubectl exec my-nginx-hostpath -it -c busybox -n myns -- /bin/sh -c "ls /logs"
access.log  error.log   su.txt
[root@k8s-node1 logs]# pwd
/root/volumes/logs
[root@k8s-node1 logs]# ll
total 8
-rw-r--r-- 1 root root  282 Dec 13 20:52 access.log
-rw-r--r-- 1 root root 2555 Dec 13 22:00 error.log
-rw-r--r-- 1 root root    0 Dec 13 20:55 su.txt

四.NFS

1.简介

(1)NFS作为一个网络文件系统,将pod中存储的数据存储连接到nfs系统,在nfs和主机的关联性不故障情况下数据就不会丢失

(2)工作在运行pod的node之外,需要这个pod和node上的nfs有关联。顺利解决hostpath存储类型node故障时数据异常的问题

2.案例演示

(1)简单演示

如上创建了一个关于nginx和busybox的pod,指定volumes类型为nfs,在所有节点上安装了nfs-utils(没有部署ansible的可以手动下载nfs),且在master节点上把实际目录共享了出来

[root@k8s-master volume]# cat testemptydir.yaml 
apiVersion: v1
kind: Pod
metadata:name: my-nginx-nfsnamespace: myns
spec:containers:- name: nginximage: nginxports:- name: nginx-portcontainerPort: 80volumeMounts:- name: myvolumemountPath: /var/log/nginx- name: busyboximage: busyboxcommand: ["/bin/sh","-c","tail -f /logs/access.log"]volumeMounts:- name: myvolumemountPath: /logsvolumes:- name: myvolumenfs:server: 192.168.2.150    #指定nfs服务器的IP地址,在/etc/hosts做了host解析的可以直接写主机名path: /root/volume/share    #nfs服务器上共享出来的目录
​
[root@k8s-master volume]# yum install -y nfs-utils
[root@k8s-master volume]# ansible all -m yum -a "name=nfs-utils"   #所有节点安装nfs-utils
k8s-node2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "msg": "", "rc": 0, "results": ["1:nfs-utils-1.3.0-0.68.el7.2.x86_64 providing nfs-utils is already installed"]
}
k8s-node1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "msg": "", "rc": 0, "results": ["1:nfs-utils-1.3.0-0.68.el7.2.x86_64 providing nfs-utils is already installed"]
}
​
[root@k8s-master volume]# mkdir share   #在当前路径下创建一个共享目录
[root@k8s-master volume]# vim /etc/exports   #编辑/etc/exports文件,允许网段内主机进行访问
/root/volume/share 192.168.2.0/24(rw,no_root_squash)
[root@k8s-master volume]# systemctl start nfs
[root@k8s-master volume]# systemctl enable nfs
​
​
[root@k8s-master volume]# kubectl get pods -n myns -o wide   #到node2上测试后查看pod日志
NAME           READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
my-nginx-nfs   2/2     Running   0          8s    10.244.169.131   k8s-node2   <none>           <none>
​
[root@k8s-master volume]# kubectl logs -f my-nginx-nfs -c busybox -n myns 
192.168.2.152 - - [13/Dec/2023:13:40:08 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
192.168.2.152 - - [13/Dec/2023:13:40:10 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
192.168.2.152 - - [13/Dec/2023:13:40:11 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
​
[root@k8s-master volume]# ll share/   #查看当前该目录下已经有文件
total 8
-rw-r--r-- 1 root root 282 Dec 13 21:40 access.log
-rw-r--r-- 1 root root 618 Dec 13 21:39 error.log
[root@k8s-master volume]# cat share/access.log 
192.168.2.152 - - [13/Dec/2023:13:40:08 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
192.168.2.152 - - [13/Dec/2023:13:40:10 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"
192.168.2.152 - - [13/Dec/2023:13:40:11 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "-"

(2)模拟同步功能和node异常

在主机nfs共享目录中新建文件,查看容器中是否新建

[root@k8s-master share]# ll   #同步功能正常
total 8
-rw-r--r-- 1 root root 282 Dec 13 21:40 access.log
-rw-r--r-- 1 root root 618 Dec 13 21:39 error.log
[root@k8s-master share]# touch a.txt
[root@k8s-master share]# kubectl exec -it my-nginx-nfs -c busybox -n myns -- /bin/sh -c "ls /logs"
a.txt       access.log  error.log

 

这篇关于k8s中EmptyDir、HostPath、NFS三种基本存储方式介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/509417

相关文章

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

springboot security之前后端分离配置方式

《springbootsecurity之前后端分离配置方式》:本文主要介绍springbootsecurity之前后端分离配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的... 目录前言自定义配置认证失败自定义处理登录相关接口匿名访问前置文章总结前言spring boot secu

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

Flutter打包APK的几种方式小结

《Flutter打包APK的几种方式小结》Flutter打包不同于RN,Flutter可以在AndroidStudio里编写Flutter代码并最终打包为APK,本篇主要阐述涉及到的几种打包方式,通... 目录前言1. android原生打包APK方式2. Flutter通过原生工程打包方式3. Futte

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调