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 AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

Vue3视频播放组件 vue3-video-play使用方式

《Vue3视频播放组件vue3-video-play使用方式》vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听... 目录一、安装二、全局引入三、局部引入四、基本使用五、事件监听六、播放 HLS 流七、更多功能总结在 v

k8s中实现mysql主备过程详解

《k8s中实现mysql主备过程详解》文章讲解了在K8s中使用StatefulSet部署MySQL主备架构,包含NFS安装、storageClass配置、MySQL部署及同步检查步骤,确保主备数据一致... 目录一、k8s中实现mysql主备1.1 环境信息1.2 部署nfs-provisioner1.2.

Java发送SNMP至交换机获取交换机状态实现方式

《Java发送SNMP至交换机获取交换机状态实现方式》文章介绍使用SNMP4J库(2.7.0)通过RCF1213-MIB协议获取交换机单/多路状态,需开启SNMP支持,重点对比SNMPv1、v2c、v... 目录交换机协议SNMP库获取交换机单路状态获取交换机多路状态总结交换机协议这里使用的交换机协议为常

5 种使用Python自动化处理PDF的实用方法介绍

《5种使用Python自动化处理PDF的实用方法介绍》自动化处理PDF文件已成为减少重复工作、提升工作效率的重要手段,本文将介绍五种实用方法,从内置工具到专业库,帮助你在Python中实现PDF任务... 目录使用内置库(os、subprocess)调用外部工具使用 PyPDF2 进行基本 PDF 操作使用

k8s admin用户生成token方式

《k8sadmin用户生成token方式》用户使用Kubernetes1.28创建admin命名空间并部署,通过ClusterRoleBinding为jenkins用户授权集群级权限,生成并获取其t... 目录k8s admin用户生成token创建一个admin的命名空间查看k8s namespace 的