【Kubernetes】K8s 持久化存储方式

K8s 持久化存储方式

由于容器是一种无状态的服务,所以容器中的文件在宿主机上表现出来的都是临时存放(当容器崩溃或者重启时,容器中的文件会丢失)。另外,Kubernetes 也需要在 Pod 之间实现数据共享。为了解决这些问题,Kubernetes 与 Docker 一样,也通过使用 数据卷 的方式来实现 数据持久化

在 Kubernetes 中,数据卷具有明确的生命周期,该生命周期与 Pod 的生命周期相同。即使 Pod 中的容器崩溃或者重启了,其挂载的数据集依然存在。因此,Kubernetes 中数据卷的生命周期比 Pod 中运行的任何容器的生命同期都要长。Pod 中的容器可以访问挂载的数据卷、读写数据卷中的文件。

Kubernetes 允许 Pod 使用任意数据的数据卷,并支持各种类型的数据卷驱动程序。下面列举了 Kubernetes 支持的数据卷驱动程序。

类型
类型
类型
类型
awsElasticBlockStore(已弃用)azureDisk(已弃用)azureFile(已弃用)cephfs(已弃用)
cinder(已弃用)configMapdownwardAPIemptyDir
fc(光纤通道)gcePersistentDisk(已弃用)gitRepo (已弃用)glusterfs(已移除)
hostPathiscsilocalnfs
persistentVolumeClaimportworxVolume(已弃用)投射(projectedrbd
secretvsphereVolume(已弃用)

🚀 Kubernetes 支持多种类型的卷,详见《官方文档》。

要在 Kubernetes 中使用数据卷,则需要在 Pod 的描述文件中使用 spec.volumes 字段来指定数据卷的类型和挂载的目录,还需要使用 spec.containers.volumeMounts 字段来指定数据卷映射到容器的位置。

根据数据卷的挂载方式的不同,Kubernetes 中的数据卷分为:节点数据卷Host PathVolume)、网络数据卷NFS Volume)和 临时数据卷EmptyDir Volume)。

1.使用节点数据卷

节点数据卷(HostPath Volume)是指,将 node 节点上的某个文件或者目录挂载到 Pod 中的一个数据卷。节点数据卷与 Docker 的数据卷类似 —— 都把宿主机的目录挂载到容器下,因此要求在每个 node 节点上被挂载的目录必须存在。因为,Kubernetes 在创建 Pod 时,并不能确定将 Pod 分配到哪个 node 节点上。

下面来演示如何使用节点数据卷

创建 Pod 的描述文件 hostdir-demo.yaml,并在其中输入以下内容。

apiVersion: v1
kind: Pod
metadata:name: hostdir-demo
spec:containers:- name: container-demoimage: nginxvolumeMounts:- mountPath: /demo-podname: volume-demovolumes:- name: volume-demohostPath:path: /tmptype: Directory

🚀 这里在创建 Pod 的同时创建了一个节点数据卷,实现了将宿主机上的 /tmp 目录挂载到容器内部的 /demo-pod 目录下。

使用 kubectl apply -f 命令创建 Pod。

kubectl apply -f hostdir-demo.yaml

查看 Pod 的详细信息。

kubectl get pod -o wide

输出的信息如下。可以看到,Pod 被分配到 node01 节点上了。

在这里插入图片描述

进入 Pod 中的容器内。

kubectl exec -it hostdir-demo -c container-demo bash

查看 /demo-pod 目录下的内容。

ls /demo-pod/

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

在 node01 节点上删除 /tmp 目录下的内容,再次查看容器内的 /demo-pod 目录。这时会发现容器内挂载的文件也随之被删除了。

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

2.使用网络数据卷

网络数据卷(NFS Volume)能将网络文件系统 NFS 直接挂载到 Pod 中。在删除 Pod 时,网络数据卷不会同时被删除,只是被从挂载的 Pod 上卸载了。通过使用网络数据卷,可以在 Pod 被创建之前预先填充数据,这些数据可以在创建 Pod 时被直接传递给 Pod。

下面来演示如何使用节点数据卷,将把 master 节点作为 NFS Server 来使用。

在这里插入图片描述

执行以下命令在所有节点上安装并启动 NFS。

apt install -y nfs-kernel-server
systemctl enable nfs-server
systemctl start nfs-server
systemctl status nfs-server

在这里插入图片描述

在 master 节点上创建 /nfs 目录,并在该目录下生成一些测试文件。

mkdir /nfs
echo "<h1>Hello World and Hello NFS</h1>" > /nfs/index.html

在 master 节点上编辑 /etc/exports 文件,输入以下配置信息。该节点将作为 NFS Server。

echo "/nfs *(rw,sync,no_root_squash)" > /etc/exports

其中的参数说明如下。

  • /nfs:NFS 共享的目录。
  • *:可以访问所有的主机网段。
  • rw:可读写权限。如果是只读权限,则是 ro
  • sync:数据传输采用同步方式。采用同步方式可以保障数据的安全性,但传输速度较慢。如果采用异步方式,则是 async。在异步方式下,数据传输效率高,但安全性差。
  • no_root_squash:NFS 服务共享目录的属性。如果用户是 root,则它对这个目录就有 root 的权限了。

重启 master 节点上的 NFS 服务。

systemctl restart nfs-kernel-server

创建 Pod 的描述文件 nfsdir-demo.yaml,并在其中输入以下内容。

apiVersion: v1
kind: Pod
metadata:name: nfsdir-demo
spec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentvolumeMounts:- name: webrootmountPath: /usr/share/nginx/htmlports:- containerPort: 80volumes:- name: webrootnfs:server: 172.30.1.2path: /nfs

🚀 这里通过使用网络数据卷将 NFS Server 上的目录挂载到了容器内部 /usr/share/nginx/html 目录下。

使用 kubectl apply -f 命令创建 Pod。

kubectl apply -f nfsdir-demo.yaml

查看 Pod 的 IP 地址。

kubectl get pod -o wide

输出的信息如下:

在这里插入图片描述

使用 curl 命令访问 Pod IP 地址的 80 端口。

curl 192.168.0.6:80

将返回 Nginx 的首页,内容如下:

在这里插入图片描述

这里使用网络数据卷将事先准备好的 Nginx 首页 index.html 挂载到 Pod 容器的内部了。可以使用以下命令进入 Pod 容器的内部查看 usr/share/nginx/html 目录下的 index.html 文件。

kubectl exec -it nfsdir-demo -c nginx bash

在这里插入图片描述

3.使用临时数据卷

临时数据卷(EmptyDir Volume)是 Pod 生命周期中的一个临时目录。与其他数据卷所不同的是,当 Pod 的生命周期结束时(如 Pod 被删除),临时数据卷也会同时被删除。

利用临时数据卷,可以实现 Pod 内部多个容器之间的数据共享,也可以使用临时数据卷作为容器的临时目录来进行数据的缓存。

下面演示如何使用节点数据卷

创建 Pod 的描述文件 emptydir-demo.yaml,并在其中输入以下内容。

apiVersion: v1
kind: Pod
metadata:name: emptydir-demo
spec:containers:- name: tomcatimage: tomcatimagePullPolicy: IfNotPresentports:- containerPort: 8080volumeMounts:- name: app-logsmountPath: /usr/local/tomcat/logs- name: busyboximage: busyboximagePullPolicy: IfNotPresentcommand: ["sh", "-c", "tail -f /logs/catalina*.log"]volumeMounts:- name: app-logsmountPath: /logsvolumes:- name: app-logsemptyDir: {}

这里的 Pod 创建了两个容器tomcat 容器busybox 容器。通过定义一个临时数据卷实现了 tomcat 容器/usr/ocal/tomcat/logs 目录与 busybox 容器/logs 目录的数据共享。这样就可以在 busybox 容器中使用 tail 命令来查看 tomcat 容器中的日志信息了。

使用 kubectl apply -f 命令创建 Pod。

kubectl apply -f emptydir-demo.yaml

查看 Pod 信息。

在这里插入图片描述

进入 busybox 容器

kubectl exec -it emptydir-demo -c busybox sh

查看 /logs/catalina.2022-02-03.log 文件的内容,如下图所示。

tail /logs/catalina.2024-08-25.log

在这里插入图片描述


http://www.ppmy.cn/devtools/100536.html

相关文章

sql server 截断日志的操作

日志截断主要用于阻止日志填充。 日志截断从 SQL Server 数据库的逻辑事务日志中删除非活动的虚拟日志文件&#xff0c;释放逻辑日志中的空间以便物理事务日志重用这些空间。 如果事务日志从不截断&#xff0c;它最终将填满分配给物理日志文件的所有磁盘空间。 但是&#xff0c…

【Leetcode 2062】 统计字符串中的元音子字符串 —— 双层循环,时间空间执行完胜

子字符串 是字符串中的一个连续&#xff08;非空&#xff09;的字符序列。 元音子字符串 是 仅 由元音&#xff08;a、e、i、o 和 u&#xff09;组成的一个子字符串&#xff0c;且必须包含 全部五种 元音。 给你一个字符串 word &#xff0c;统计并返回 word 中 元音子字符串…

MySQL数据库(二)

结构化查询语句 1.SQL 结构化查询语句 Structured Query Language 2.SQL语言的分类 DDL 数据定义语言 用于定义数据库、表及其它对象的结果creat drop alter(修改表结构) DML 数据操作语言 用于增删改表中的数据 insert into update set delete from DQL 数据库查询…

基于x86 平台opencv的图像采集和seetaface6的图像质量评估功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.3 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的图像质量评估功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的图像质量评估模块…

上传图片之限制图片尺寸和大小

前言&#xff1a; 在前段时间开发的上传图片功能后&#xff0c;突然有天客户反馈无法上传图片&#xff0c;经过一系列的排查发现上传到后端的图片大小不能太大&#xff0c;需要前端在上传图片时加以限制。 问题分析&#xff1a; 要在上传时判断图片格式和大小是否过大或者格式…

【C#】【EXCEL】Bumblebee/Components/Analysis/GH_Ex_Ana_CondBetween.cs

这段代码定义了一个名为 GH_Ex_Ana_CondBetween 的 Grasshopper 组件&#xff0c;其主要功能是为 Excel 工作表中的特定范围添加条件格式。具体来说&#xff1a; 功能概述&#xff1a; 为 Excel 中的数据范围添加基于区间值的条件格式允许用户自定义高亮颜色提供选项来反转条件…

LeetCode Hot100:283、移动零

题目&#xff1a;移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 方案一&#xff1a;双指针 class Solution { public:void moveZ…

帮助我们从曲线图中获取数据的软件分享——GetData Graph Digitizer

在科技论文写作和数据分析过程中&#xff0c;我们常常需要将自己的数据与前人的研究成果进行对比。然而&#xff0c;有时我们只能从别人的论文中获得一张包含坐标轴的曲线图&#xff0c;而无法直接获取原始数据。在这种情况下&#xff0c;GetData Graph Digitizer 软件就显得尤…

每日一题~abc 367 D+E(F 在上一篇)(区间和相关的计数问题前缀map,建图+倍增)

D题意&#xff1a; 环形的休息区&#xff0c;编号为 1-N&#xff0c;顺时针方向&#xff0c;从休息区i 到i1 需要的代价是 ai&#xff0c; 从休息区 s 顺时针走到休息区 t ( s&#xff01;t )所需的最小步数是 M 的倍数。 找出可能的配对数 (s,t) 1.解决环形的问题&#xff1a;…

Telegram mini app 本地开发配置

前言&#xff1a; 为了能在telegram里本地调试mini app&#xff0c;参考了网上很多方案&#xff0c;踩了不少坑。最后整了一个适合自己的方案&#xff0c;记录一下。 这个方案一定不是最好的&#xff0c;不过是目前适合我上手开发的方案了。 本文章适合需要在 telegram 本地…

创建新环境时,Anaconda 报 Multiple Errors Encountered错误

清理一下缓存&#xff0c;就行了 conda clean --packages --tarballs

深入探索fs.WriteStream:Node.js文件写入流的全面解析

在Node.js中&#xff0c;fs模块不仅提供了读取文件的API&#xff0c;还包含了写入文件的工具&#xff0c;其中fs.WriteStream就是一个非常重要的类&#xff0c;用于以流的形式将数据写入文件。本文将全面讲解fs.WriteStream的基本概念、使用方法、事件处理以及高级应用&#xf…

NYX靶机笔记

NYX靶机笔记 概述 VulnHub里的简单靶机 靶机地址&#xff1a;https://download.vulnhub.com/nyx/nyxvm.zip 1、nmap扫描 1&#xff09;主机发现 # -sn 只做ping扫描&#xff0c;不做端口扫描 nmap -sn 192.168.84.1/24 # 发现靶机ip为 MAC Address: 00:50:56:E0:D5:D4 (V…

拿下英语翻译!这四款在线翻译功不可没!

作为一个刚踏入职场的小白&#xff0c;我最近在为工作中的英语翻译问题头疼不已。不过&#xff0c;经过一番尝试和比较&#xff0c;我找到了几款翻译工具&#xff0c;它们在帮我解决翻译难题上表现得相当不错。今天&#xff0c;就让我以一个职场新手的身份&#xff0c;来跟大家…

[Day 63] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈在醫療數據管理中的應用 區塊鏈技術作為一種去中心化、透明且不可篡改的分布式帳本系統,正在revolutionize多個行業,其中醫療保健領域尤為受益。在醫療數據管理中應用區塊鏈技術可以顯著提高數據的安全性、可訪問性和互操作性,同時保護患者隱私並促進醫療研究的發展。 …

23种设计模式详细知识点(软件设计师)

设计模式 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 1.创建型设计模式&#xff1a; ①抽象工厂&#xff08;Abstract Factory&#xff09;、②生成器&#xff08…

安卓手机使用 Google Play 谷歌应用商店安装APP一直转圈等待

如果去国外旅游&#xff0c;可能需要安装一些当地的 APP 比如打车软件。 出发之前&#xff0c;在国内先把 APP 安装好。 首先&#xff0c;你要科学上网&#xff0c;才能在 Google play 里面搜索 APP。 然后&#xff0c;点安装&#xff0c;然后&#xff0c;就看到一直转圈&am…

iPhone抹掉数据后能恢复吗?详解数据恢复的可能性与方法

在使用iPhone的过程中&#xff0c;有时候我们会因为各种原因选择“抹掉所有内容和设置”&#xff0c;以期望将手机恢复到出厂状态。然而&#xff0c;一旦执行了这个操作&#xff0c;很多用户就会开始担心&#xff1a;iPhone抹掉数据后&#xff0c;这些数据还能恢复吗&#xff1…

Vue3的三种样式控制及实现原理

你好&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏和关注。个人知乎 Vue3中一共有三种样式控制&#xff0c;分别是全局样式控制、局部作用域样式控制和深度样式控制&#xff0c;今天我们一起看下这三种样式控制的使用&#xff0c;以及实现的原理是什么。 一、全局样式控制…

OSPF-基础多区域实验

1.ENSP下载 阿里云盘分享 ⭐/*无需密钥 免费下载 安装不成功&#xff0c;可关注并私信博主*/ 2.OSPF的基础需求和规则 实验规则&#xff1a; 1.接口地址→XY.XY.XY.R /24 X:两者之间最小的 Y:两者之间最大的 R:谁的接口就是谁的编号 以R1和R2之间的连接为例&#xff0…