K8S之持久化存储

持久化存储

  • 支持的持久化存储类型
  • EmptyDir
  • HostPath
  • NFS

在K8S中部署的应用都是以pod容器的形式运行的,假如部署数据库服务 例如:MySQL、Redis等,需要对产生的数据做备份。如果pod不挂载数据卷,那pod被删除或重启后这些数据会随之消失,想要长久的保留这些数据就要用到pod数据持久化存储。

支持的持久化存储类型

查看K8S支持哪些存储

kubectl explain pods.spec.volumes

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

常用的如下:

  • emptyDir :临时性存储卷类型
  • hostPath :在节点上使用本地磁盘进行数据存储
  • nfs:通过 Network File System(网络文件系统)共享文件系统进行数据存储
  • persistentVolumeClaim:持久卷声明,是K8S的一个特定类型的存储资源
  • glusterfs:通过分布式文件系统GlusterFS进行数据存储
  • cephfs:通过分布式文件系统Ceph进行数据存储
  • configMap: 通过ConfigMap资源存储应用程序的配置文件
  • secret:通过Secret资源存储应用程序的机密信息

本篇对前三种进行展开介绍,并例举实践中的使用

EmptyDir

emptyDir类型的Volume是在Pod分配到Node上时被创建,K8S会在Node上自动分配一个目录,无需指定宿主机Node上对应的目录文件。 这个目录的初始内容为空,当Pod从Node上移除时,emptyDir中的数据会被永久删除。
emptyDir 主要用于某些应用程序无需永久保存的临时目录,多个容器的共享目录等。

实践

创建一个pod,挂载临时目录emptyDir

vim emptydir.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-empty
spec:containers:- name: container-emptyimage: nginximagePullPolicy: IfNotPresentvolumeMounts:- name: cache-volume  # 匹配volumes.name。把卷挂载到容器里mountPath: /cache   # 挂载到容器里的目录下 volumes:- name: cache-volume emptyDir:{}

更新资源清单文件

kubectl apply -f emptydir.yaml
kubectl describe pods pod-empty

在这里插入图片描述

查看分配到Node上的临时目录存在的位置

1、查看pod的uid

kubectl get pods pod-empty -o yaml | grep uid

在这里插入图片描述

uid: adff4bf3-62ac-41fe-9b25-abcae1c8598a

2、查看pod调度到哪个节点

kubectl get pods -o wide | grep empty

在这里插入图片描述

3、登录到k8s-node1上

ps. 安装tree 方便看目录结构

 yum install tree -y

根据 uid 看目录

tree /var/lib/kubelet/pods/adff4bf3-62ac-41fe-9b25-abcae1c8598a

在这里插入图片描述

由上可知,临时目录在本地的/var/lib/kubelet/pods/adff4bf3-62ac-41fe-9b25-abcae1c8598a/volumes/kubernetes.io~empty-dir/cache-volume/下

pod删了,临时目录也没了

kubectl delete -f emptydir.yaml

在这里插入图片描述

在这里插入图片描述

该类型可使用的场景:测试数据

HostPath

hostPath Volume是指Pod挂载宿主机上的目录或文件。 hostPath Volume使得容器可以使用宿主机的文件系统进行存储,hostpath(宿主机路径):节点级别的存储卷,在pod被删除,这个存储卷还是存在的,不会被删除。
所以只要同一个pod被调度到同一个节点上来,在pod被删除重新被调度到这个节点之后,对应的数据依然是存在的。

查看hostPath存储卷的用法

kubectl explain pods.spec.volumes.hostPath

在这里插入图片描述

hostPath的type类型:
在这里插入图片描述

实践

创建一个pod,挂载hostPath存储卷

vim hostpath.yaml 
apiVersion: v1
kind: Pod
metadata:name: pod-hostpath
spec:containers:- name: container-nginximage: nginximagePullPolicy: IfNotPresentvolumeMounts:- name: hostpath-volumemountPath: /hostpath-nginx- name: container-tomcatimage: tomcat:8.5-jre8-alpineimagePullPolicy: IfNotPresentvolumeMounts:- name: hostpath-volumemountPath: /hostpath-tomcatvolumes:- name: hostpath-volumehostPath:path: /data-hostpath  # 必须字段,指定存储目录type: DirectoryOrCreate # 表示本地有/data-hostpath目录,就用本地的,本地没有就会在pod调度到的节点自动创建一个

更新资源清单文件

kubectl apply -f hostpath.yaml

查看pod调度到了哪个物理节点

kubectl get pods -o wide | grep hostpath

在这里插入图片描述

由上面可以知道pod调度到了k8s-node1上,登录到k8s-node1机器,查看是否在这台机器创建了存储目录

ll /data-hostpath/

在这里插入图片描述

上面可以看到已经创建了存储目录/data-hostpath,这个【/data-hostpath】会作为pod的持久化存储目录

在k8s-node1上的/data-hostpath下创建一个目录

cd /data-hostpathmkdir aa

测试存储卷是否可以正常使用

1、登录到nginx容器

kubectl exec -it pod-hostpath -c container-nginx -- /bin/bash 
cd /hostpath-nginx/ 

/hostpath-nginx/目录存在,说明已经把宿主机目录挂载到了容器里

ls

在这里插入图片描述

2、登录到tomcat容器

kubectl exec -it pod-hostpath -c container-tomcat -- /bin/bash
cd /hostpath-tomcat/

/hostpath-tomcat/目录存在,说明已经把宿主机目录挂载到了容器里

ls

在这里插入图片描述

通过上面测试可以看到,同一个pod里的 container-nginx 和 container-tomcat 这两个容器是共享存储卷的

删除pod,指定调度到另外的node上

kubectl delete -f hostpath.yaml
vim hostpath.yaml 
apiVersion: v1
kind: Pod
metadata:name: pod-hostpath
spec:nodeName: k8s-node2 # 指定调度到node2节点上containers:- name: container-nginximage: nginximagePullPolicy: IfNotPresentvolumeMounts:- name: hostpath-volumemountPath: /hostpath-nginx- name: container-tomcatimage: tomcat:8.5-jre8-alpineimagePullPolicy: IfNotPresentvolumeMounts:- name: hostpath-volumemountPath: /hostpath-tomcatvolumes:- name: hostpath-volume hostPath: path: /data-hostpathtype: DirectoryOrCreate

更新资源清单文件

kubectl apply -f hostpath.yaml

看容器里的目录,登录到nginx容器

kubectl exec -it pod-hostpath -c container-nginx -- /bin/bash 
cd /hostpath-nginx 
ls

在这里插入图片描述

aa 文件不在了

hostpath存储卷缺点:单节点,pod删除之后重新创建必须调度到同一个node节点,数据才不会丢失

NFS

以上 emptyDir 和 hostPath 是两种本地存储解决方案,仅适用于单个节点上的容器。如果需要在多个Pod或多节点之间共享持久化存储,可使用NFS。
NFS存储允许多个Pod从网络共享中读取数据,还支持高可用性配置,可以使用多个NFS服务器来提供容错和负载均衡。此外NFS还支持更高级的存储管理功能,如快照和备份,以及可配置的访问控制策略。

实践

1、搭建NFS服务
以k8s的控制节点(k8s-master1)作为NFS服务端

yum install nfs-utils -y

该命令的主要作用是使用yum包管理器自动安装nfs-utils软件包,以支持NFS协议的功能。

2、在宿主机创建NFS需要的共享目录,作为NFS服务端

mkdir /data/volumes -pv 

-p表示:创建目录的过程中,如果父级不存在,则自动创建父目录。
-v表示:可向用户展示更多信息,例如显示执行mkdir创建了哪些目录等。

3、配置NFS共享服务器上的/data/volumes目录

执行以下命令启动NFS

systemctl start nfs

编辑配置NFS服务访问的目录/data/volumes的访问权限

vim /etc/exports
# 允许任何客户端挂载
/data/volumes *(rw,no_root_squash)

参数说明:

  • /data/volumes:要共享的目录
  • ‘**’:允许哪些客户端挂载NFS共享的目录,“*”表示允许任何能访问NFS服务的网段客户端挂载NFS共享的目录
  • rw 该主机对该共享目录有读写权限
  • no_root_squash 登入:用户具有根目录的完全管理访问权限
    在这里插入图片描述

4、使NFS配置生效

执行以下命令使NFS配置生效

exportfs -arv

在这里插入图片描述

service nfs restart

查看nfs是否启动成功

systemctl enable nfs

查看nfs是否启动成功

systemctl status nfs

在这里插入图片描述

Active: active
看到nfs是active,说明nfs正常启动了

5、k8s-node2和k8s-node1上也安装nfs驱动

yum install nfs-utils -ysystemctl enable nfs --now

在k8s-node1上手动挂载

mkdir /test 
mount 192.168.40.182:/data/volumes /test/

以上【192.168.40.182】为服务端(k8s-master1)的IP

df -h

在这里插入图片描述
nfs可以被正常挂载

手动卸载

umount /test

6、创建Pod,挂载NFS共享出来的目录

vim nfs.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-test
spec:replicas: 3selector:matchLabels:storage: nfstemplate: metadata:labels:storage: nfsspec:containers:- name: container-nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80protocol: TCPvolumeMounts:- name: nfs-volumesmountPath: /usr/share/nginx/htmlvolumes:- name: nfs-volumesnfs:server: 192.168.40.182 # 安装nfs服务的地址path: /data/volumes    # nfs的共享目录

更新资源清单文件

kubectl apply -f nfs.yaml

查看pod是否创建成功

kubectl get pods -owide

在这里插入图片描述

登录到nfs服务器,在共享目录创建一个index.html

cd /data/volumes/vim index.html 

在这里插入图片描述

请求pod,看结果
在这里插入图片描述

通过上面可以看到,在共享目录创建的index.html已经被pod挂载了
登录到pod验证下

kubectl exec -it nfs-test-65db89988d-4hs7h  -- /bin/bash
cat /usr/share/nginx/html/index.html 

在这里插入图片描述

上面说明挂载nfs存储卷成功了,nfs支持多个客户端挂载,可以创建多个pod,挂载同一个nfs服务器共享出来的目录;
但是nfs如果宕机了,数据也就丢失了,想要高可用可使用分布式存储,常见的分布式存储有glusterfs和cephfs。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/750994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows server Database 2025 安装 i225/i226 网卡驱动

windows这比坏得很,intel消费级网卡不准在服务器系统上安装。你要说他是异构不支持?他就纯粹恶心人。 之前已经安装过一次,但是今天database预览版一更新,又给我把网卡驱动杀了,气死,写一篇教程。 1.去官网…

SQLite优化实践:数据库设计、索引、查询和分库分表策略

文章目录 一、数据库设计优化1.1 合理选择数据类型1.2 使用NOT NULL约束1.3 使用默认值1.4 避免使用过多的列 二、索引优化2.1 为经常用于查询条件的列创建索引2.2 为经常用于排序和分组的列创建索引2.3 避免过多的索引2.4 使用覆盖索引 三、查询优化3.1 使用预编译语句3.2 优化…

​​SQLiteC/C++接口详细介绍之sqlite3类(十一)

返回目录:SQLite—免费开源数据库系列文章目录 上一篇:​​SQLiteC/C接口详细介绍之sqlite3类(十) 下一篇:​​SQLiteC/C接口详细介绍之sqlite3类(十二)(未发表) 33.sq…

C语言学习过程总结(18)——指针(6)

一、数组指针变量 在上一节中我们提到了,指针数组的存放指针的数组,那数组指针变量是什么呢? 显而易见,数组指针变量是指针 同样类比整型指针变量和字符指针变量里面分别存放的是整型变量地址和字符变量地址,我们可以…

Helm的资源安装和基本使用

目录 一.Helm的出现 二.Helm工具 1.部署helm 2.helm可用命令介绍 三.chart 1.添加、查看、删除存储库 2.查找chart、查看chart信息、安装chart等 3.安装chart后产生的release 四.安装mysql举例 1.固定chart安装 2.自定义chart安装 一.Helm的出现 在前面的k8s部署po…

13. C++类的简单理解

全面理解C中的类 1. 类的访问属性:public,protect,private C中类的成员变量和函数都带有三种属性中的一种,假如没有特别声明,那么就默认是私有的(除了构造函数)。public表示是公开的&#xff…

[WUSTCTF2020]颜值成绩查询 --不会编程的崽

这题也是一个很简单的盲注题目,这几天sql与模板注入做麻了,也是轻松拿捏。 它已经提示,enter number,所有猜测这里后台代码并没有使用 " 闭合。没有明显的waf提示, 但是or,and都没反应。再去fuzz一…

二叉树OJ练习

本文旨在讲解有关二叉树的OJ题目,希望读完本文,能让读者都二叉树有更深一步的认识! 正文开始! 106. 根据二叉树创建字符串 算法思想: 根据题目的输出结果,可以观察出如下规律! 1.若左右结点都…

Spring Boot整合STOMP实现实时通信

目录 引言 代码实现 配置类WebSocketMessageBrokerConfig DTO 工具类 Controller common.html stomp-broadcast.html 运行效果 完整代码地址 引言 STOMP(Simple Text Oriented Messaging Protocol)作为一种简单文本导向的消息传递协议&#xf…

sqllab第二十七A关通关笔记

知识点: 双引号闭合union select 大小写绕过 Union Select这里不能进行错误注入,无回显 经过测试发现这是一个双引号闭合 构造payload:id1"%09and%091"1 页面成功回显 构造payload:id0"%09uNion%09SElect%091,2,3%09"1 页面成功…

在雄安新区买新房要注意什么?有哪些注意事项?

雄安新区新建住宅均价每平方米11735元起,二手房每平方米8950元起。 整体价格非常有优势。 雄安新区房价走势与区域发展直接相关。 而且,雄安新区已经成立五周年了。 2022年,雄安新区多项重点项目将陆续竣工。 雄安新区城市基础设施建设已初具…

Linux之shell循环

华子目录 for循环带列表的for循环格式分析示例shell允许用户指定for语句的步长,格式如下示例 不带列表的for循环示例 基于C语言风格的for循环格式示例注意 while循环格式示例 until循环作用格式示例 循环控制breakcontinue详细语法示例 循环嵌套示例 for循环 for循…

深度学习——SAM(Segment-Anything)代码详解

目录 引言代码目录segment-anything 代码详解build_sam.pypredictor.pyautomatic_mask_generator.py 引言 从去年年初至今,SAM(Segment Anything )已经问世快一年了,SAM凭借其强大而突出的泛化性能在各项任务上取得了优异的表现,广大的研究者…

源码编译部署LAMP

编译部署LAMP 配置apache [rootzyq ~]#: wget https://downloads.apache.org/apr/apr-1.7.4.tar.gz --2023-12-11 14:35:57-- https://downloads.apache.org/apr/apr-1.7.4.tar.gz Resolving downloads.apache.org (downloads.apache.org)... 88.99.95.219, 135.181.214.104…

BUUCTF-WEB1

[ACTF2020 新生赛]Exec1 1.打开靶机 是一个ping命令 2.利用管道符“|” ping一下本地主机并查看ls ping 127.0.0.1 | ls 可以看到回显的内容是一个文件 127.0.0.1 | cat index.php #查看主机下index.php 127.0.0.1 | ls / #查看主机根目录下的文件 看的一个flag文件 …

数据仓库数据分层详解

数据仓库中的数据分层是一种重要的数据组织方式,其目的是为了在管理数据时能够对数据有一个更加清晰的掌控。以下是数据仓库中的数据分层详解: 原始数据层(Raw Data Layer):这是数仓中最底层的层级,用于存…

jupyter闪退和自动跳转问题

1.闪退问题 当我们点击jupyter时,它会闪一下,然后无法进入,这个时候我们可以去prompt命令行输入jupyter notebook启动试试,如果还不行,我们可以根据报错去解决,一般csdn上都有对应情况,直接搜索…

Linux-新手小白速秒Hadoop集群全生态搭建(图文混编超详细)

在之前的文章中,我教会大家如何一步一步搭建一个Hadoop集群,但是只提供了代码,怕有些朋友会在一些地方产生疑惑,今天我来以图文混排的方式,一站式交给大家如何搭建一个Hadoop高可用集群包括(HadoopHA&#…

el-select使用filterable下拉无法关闭得问题

这里推荐一个前端框架 sakuya / SCUI,他里面有个formTable,可以解决很多订单明细保存得问题。基本沿用element-plus的前端使用模式,让表单表格变的非常容易。 这个的供应商插件,当使用filterable后,点击表格重的选项&…

Redis Desktop Manager:一站式Redis数据库管理与优化

Redis Desktop Manager是一款功能强大的Redis桌面管理工具,也被称作Redis可视化工具。以下是其主要的功能特色: 连接管理:Redis Desktop Manager支持连接多个Redis服务器,用户可以在同一界面下管理多个数据库,大大提高…