K8S中的数据存储之基本存储

基本存储类型

EmptyDir

  • 描述:当 Pod 被调度到节点上时,Kubernetes 会为 Pod 创建一个空目录,所有在该 Pod 中的容器都可以访问这个目录。
  • 特点
    • 生命周期与 Pod 绑定,Pod 删除时,数据也会丢失。
    • 适用于临时存储需求,如缓存或临时计算数据。
    • 支持多种存储类型(如 tmpfs)可以根据需求选择。

HostPath

  • 描述:将主机节点上的文件或目录挂载到 Pod 中的容器内。
  • 特点
    • 允许 Pod 访问宿主机的文件系统。
    • 数据存储在节点上,如果 Pod 被调度到不同的节点上,数据不可用。
    • 适用于单节点集群或测试环境中,不推荐在生产环境中使用。
    • 存在潜在的安全风险,因为容器可以访问宿主机的文件系统。

NFS

  • 描述:网络存储解决方案将存储分布到多个节点或机器,Kubernetes 可以使用这些存储系统作为 PV 后端。
  • 特点
    • 提供集群级别的共享存储,支持多个 Pod 挂载相同的卷。
    • 适用于需要共享数据的应用,如分布式数据库。
    • 支持高可用性、数据复制、故障恢复等功能。
    • 需要额外的配置和管理,通常适用于大型分布式应用或企业级场景。

EmptyDir详解

EmptyDir 是一种轻量级的存储选项,用于 Pod 内部容器之间的数据共享或临时存储。下面是一些关于 EmptyDir 的补充信息:

  • 生命周期:EmptyDir 的生命周期与 Pod 绑定。当 Pod 被创建时,EmptyDir 被创建并挂载到 Pod 中所有需要它的容器上。当 Pod 被删除时,EmptyDir 及其内容也会被删除。

  • 使用场景

    • 临时存储:对于需要临时写入和读取数据,但不要求数据持久化的场景,如缓存或会话数据。

    • 容器间数据共享:当 Pod 中运行多个容器需要共享文件时,EmptyDir 可以作为一个共享存储空间。

    • 数据处理:在数据被处理并存储到更持久的存储解决方案之前,可以临时存储在 EmptyDir 中。

  • 性能:EmptyDir 存储的性能通常与宿主机的磁盘性能相当,因为它直接存储在宿主机上。

  • 限制:由于 EmptyDir 与 Pod 的生命周期绑定,因此它不适合存储需要跨 Pod 持久化的数据。此外,EmptyDir 不保证数据的备份或复制,所以在 Pod 重启或重建时数据可能会丢失。

  • 配置:EmptyDir 可以通过 Pod 定义中的 spec.volumes 字段来配置,无需指定宿主机上的路径。

  • 安全性:EmptyDir 默认只对 Pod 内部的容器可见,提供了一定程度的隔离。

在一个Pod中准备两个容器nginx和busybox,然后声明一个Volume分别挂在到两个容器的目录中,然后nginx容器负责向Volume中写日志,busybox中通过命令将日志内容读到控制台。

[root@k8s-master ~]# vim volume-emptydir.yaml
[root@k8s-master ~]# kubectl apply -f volume-emptydir.yaml 
Error from server (NotFound): error when creating "volume-emptydir.yaml": namespaces "test" not found
[root@k8s-master ~]# kubectl create ns test
namespace/test created
[root@k8s-master ~]# kubectl apply -f volume-emptydir.yaml 
pod/volume-emptydir created
[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME              READY   STATUS              RESTARTS   AGE   IP       NODE        NOMINATED NODE   READINESS GATES
volume-emptydir   0/2     ContainerCreating   0          35s   <none>   k8s-node1   <none>           <none>
[root@k8s-master ~]# kubectl get pod -n test -w
NAME              READY   STATUS              RESTARTS   AGE
volume-emptydir   0/2     ContainerCreating   0          40s
volume-emptydir   2/2     Running             0          56s
^C[root@k8s-master ~]# kubectl exec -it volume-emptydir -n test /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
Defaulted container "nginx" out of: nginx, busybox
root@volume-emptydir:/# echo 'This is EmptyDir test' > /usr/share/nginx/html/index.html 
root@volume-emptydir:/# exit
exit
[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME              READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
volume-emptydir   2/2     Running   0          80s   10.244.36.81   k8s-node1   <none>           <none>
[root@k8s-master ~]# curl 10.244.36.81
This is EmptyDir test
[root@k8s-master ~]# kubectl logs -f volume-emptydir -n test -c busybox 
10.244.235.192 - - [25/Jan/2025:09:39:19 +0000] "GET / HTTP/1.1" 200 22 "-" "curl/7.29.0" "-"
10.244.235.192 - - [25/Jan/2025:09:39:40 +0000] "GET / HTTP/1.1" 200 22 "-" "curl/7.29.0" "-"
10.244.235.192 - - [25/Jan/2025:09:39:41 +0000] "GET / HTTP/1.1" 200 22 "-" "curl/7.29.0" "-"

 通过curl命令进行访问,可以看到访问成功的日志信息;

 

HostPath详解

  • EmptyDir中数据不会被持久化,它会随着Pod的结束而销毁,如果想简单的将数据持久化到主机中,可以选择HostPath。

  • HostPath就是将Node主机中一个实际目录挂在到Pod中,以供容器使用,这样的设计就可以保证Pod销毁了,但是数据依据可以存在于Node主机上。

    • 数据持久性:与 EmptyDir 不同,HostPath 卷将 Node 主机上的一个目录挂载到 Pod 中,使得 Pod 内的容器可以访问和修改该目录上的文件。由于这些文件存储在 Node 主机上,因此即使 Pod 被删除,数据仍然可以在 Node 主机上保持。

    • 用途HostPath 适用于需要持久化数据的场景,例如数据库文件、配置文件等。然而,由于 HostPath 直接使用了 Node 主机的文件系统,可能会带来一些安全和管理上的挑战,例如权限管理、数据一致性等问题。

[root@k8s-master ~]#  vim volume-hostpath.yaml
[root@k8s-master ~]# kubectl apply -f volume-hostpath.yaml 
pod/volume-hostpath created
[root@k8s-master ~]#  kubectl get pod -n test -w
NAME              READY   STATUS    RESTARTS   AGE
volume-emptydir   2/2     Running   0          9m26s
volume-hostpath   2/2     Running   0          6s
^C[root@k8s-master ~]# kubectl describe pod volume-hostpath -n test
Name:         volume-hostpath
Namespace:    test
Priority:     0
Node:         k8s-node1/192.168.58.232
Start Time:   Sat, 25 Jan 2025 04:47:14 -0500
Labels:       <none>
Annotations:  cni.projectcalico.org/containerID: 12d55de1744ff89a73d0fb3c4f9cf45427847f3ca631f130147e2a41b9916c53cni.projectcalico.org/podIP: 10.244.36.82/32cni.projectcalico.org/podIPs: 10.244.36.82/32
Status:       Running
IP:           10.244.36.82
IPs:IP:  10.244.36.82
Containers:nginx:Container ID:   docker://c0c42dab2b85a9d336abcba543be34740ce44c19453d41435882cc4e356ea18eImage:          nginx:1.17.1Image ID:       docker-pullable://nginx@sha256:b4b9b3eee194703fc2fa8afa5b7510c77ae70cfba567af1376a573a967c03dbbPort:           80/TCPHost Port:      0/TCPState:          RunningStarted:      Sat, 25 Jan 2025 04:47:16 -0500Ready:          TrueRestart Count:  0Environment:    <none>Mounts:/var/log/nginx from logs-volume (rw)/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-bqnr4 (ro)busybox:Container ID:  docker://ee04657f326faa26619d0ffe9acb277885aa792737aed9d3e343c570d17ff0a8Image:         busybox:1.30Image ID:      docker-pullable://busybox@sha256:4b6ad3a68d34da29bf7c8ccb5d355ba8b4babcad1f99798204e7abb43e54ee3dPort:          <none>Host Port:     <none>Command:/bin/sh-ctail -f /logs/access.logState:          RunningStarted:      Sat, 25 Jan 2025 04:47:16 -0500Ready:          TrueRestart Count:  0Environment:    <none>Mounts:/logs from logs-volume (rw)/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-bqnr4 (ro)
Conditions:Type              StatusInitialized       True Ready             True ContainersReady   True PodScheduled      True 
Volumes:logs-volume:Type:          HostPath (bare host directory volume)Path:          /root/logsHostPathType:  DirectoryOrCreatekube-api-access-bqnr4:Type:                    Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds:  3607ConfigMapName:           kube-root-ca.crtConfigMapOptional:       <nil>DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type    Reason     Age   From               Message----    ------     ----  ----               -------Normal  Scheduled  25s   default-scheduler  Successfully assigned test/volume-hostpath to k8s-node1Normal  Pulled     23s   kubelet            Container image "nginx:1.17.1" already present on machineNormal  Created    23s   kubelet            Created container nginxNormal  Started    23s   kubelet            Started container nginxNormal  Pulled     23s   kubelet            Container image "busybox:1.30" already present on machineNormal  Created    23s   kubelet            Created container busyboxNormal  Started    23s   kubelet            Started container busybox
[root@k8s-master ~]#  kubectl get pod -n test -o wide
NAME              READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
volume-emptydir   2/2     Running   0          10m   10.244.36.81   k8s-node1   <none>           <none>
volume-hostpath   2/2     Running   0          98s   10.244.36.82   k8s-node1   <none>           <none>

 describe中看的pod调度到node1节点,在master节点执行curl进行访问,到node1节点下查看是否存在/root/logs目录,并查看日志信息:

[root@k8s-node1 ~]# ll /root/logs/
total 4
-rw-r--r--. 1 root root 95 Jan 25 04:49 access.log
-rw-r--r--. 1 root root  0 Jan 25 04:47 error.log[root@k8s-node1 ~]# tail -f /root/logs/access.log 
10.244.235.192 - - [25/Jan/2025:09:49:00 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
10.244.235.192 - - [25/Jan/2025:09:49:48 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

 

NFS

  • 虽然 HostPath 可以用于解决数据持久化的问题,但它并不适用于跨节点的数据共享和高可用性场景。一旦 Pod 从一个节点迁移到另一个节点,HostPath 卷中的数据就无法访问。这是因为 HostPath 卷依赖于特定节点上的文件系统,而不是一个独立的网络存储系统。

  • 为了解决这个问题,确保数据在节点迁移时仍然可用,通常推荐使用网络文件存储系统,如 NFS (Network File System) 或 CIFS (Common Internet File System)。这两种协议允许 Pod 访问远程存储系统上的数据,就好像它们是本地文件一样。

  • NFS 是一种网络文件系统协议,它允许客户端计算机访问服务器上的文件和目录,就像它们是本地文件一样。通过设置 NFS 服务器,您可以将 Pod 中的存储直接连接到 NFS 系统上。这样,即使 Pod 从一个节点迁移到另一个节点,只要网络连接正常,Pod 就可以继续访问数据。

需要在每个机器上都安装NFS

yum install nfs-utils -y
[root@k8s-master ~]# mkdir /nfstest
[root@k8s-master ~]# vim /etc/exports
[root@k8s-master ~]# systemctl restart rpcbind.service nfs-server.service[root@k8s-master ~]# vim volume-nfs.yaml 
[root@k8s-master ~]# kubectl apply -f volume-nfs.yaml 
pod/volume-nfs created
[root@k8s-master ~]# kubectl get pod -n test -w 
NAME         READY   STATUS              RESTARTS   AGE
volume-nfs   0/2     ContainerCreating   0          2s
volume-nfs   0/2     ContainerCreating   0          3s
volume-nfs   2/2     Running             0          3s
^C[root@k8s-master ~]kubectl get pod -n test -o wide
NAME         READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
volume-nfs   2/2     Running   0          16s   10.244.36.88   k8s-node1   <none>           <none>
[root@k8s-master ~]# cd /nfstest/
[root@k8s-master nfstest]# ll
total 4
-rw-r--r--. 1 root root 95 Jan 25 05:18 access.log
-rw-r--r--. 1 root root  0 Jan 25 05:18 error.log
[root@k8s-master nfstest]# tai -f access.log 
-bash: tai: command not found
[root@k8s-master nfstest]# tail -f access.log 
10.244.235.192 - - [25/Jan/2025:10:18:20 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
10.244.235.192 - - [25/Jan/2025:10:18:47 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

在node1和node2节点执行如下命令:

[root@k8s-node1 ~]# showmount -e 192.168.58.231
Export list for 192.168.58.231:
/nfstest 192.168.58.0/24

在master节点使用curl命令进行测试,查看master节点/nfstest目录下是否存在访问日志:
 

[root@k8s-master ~]# curl  10.244.36.88
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@k8s-master nfstest]# tail -f access.log 
10.244.235.192 - - [25/Jan/2025:10:18:20 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
10.244.235.192 - - [25/Jan/2025:10:18:47 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

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

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

相关文章

谈谈RTMP|RTSP播放器视频view垂直|水平反转和旋转设计

技术背景 我们在做RTMP|RTSP播放器的时候&#xff0c;有这样的技术诉求&#xff0c;有的摄像头出来的数据是有角度偏差的&#xff0c;比如“装倒了”&#xff0c;或者&#xff0c;图像存在上下或者左右反转&#xff0c;这时候&#xff0c;就需要播放器能做响应的处理&#xff…

自然语言处理——从原理、经典模型到应用

1. 概述 自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是一门借助计算机技术研究人类语言的科学&#xff0c;是人工智能领域的一个分支&#xff0c;旨在让计算机理解、生成和处理人类语言。其核心任务是将非结构化的自然语言转换为机器可以…

【MFC】C++所有控件随窗口大小全自动等比例缩放源码(控件内字体、列宽等未调整) 20250124

MFC界面全自动等比例缩放 1.在初始化里 枚举每个控件记录所有控件rect 2.在OnSize里&#xff0c;根据当前窗口和之前保存的窗口的宽高求比例x、y 3.枚举每个控件&#xff0c;根据比例x、y调整控件上下左右,并移动到新rect struct ControlInfo {CWnd* pControl;CRect original…

SkyWalking介绍

一款开源的系统性能监控工具(APM) 背景 在解决提报的IT性能问题时&#xff0c;由于缺乏系统性能监控运维的工具&#xff0c;导致问题排查非常困难&#xff0c;尤其是偶发的问题&#xff0c;无法进行问题复现还原&#xff0c;需要一套能实时监控线上系统性能的工具平台。 SkyWal…

Pyecharts之图表组合与布局优化

在数据可视化中&#xff0c;我们经常需要将多个图表组合在一起&#xff0c;以展示不同维度的数据或者进行对比分析。同时&#xff0c;合理的布局能够提升图表的可读性和用户体验。Pyecharts 提供了强大的组件和方法&#xff0c;让我们可以轻松实现图表的组合和布局优化。本篇将…

物业管理平台系统提升社区智能化服务效率与管理水平

内容概要 在现代社会中&#xff0c;物业管理平台系统的出现&#xff0c;为社区的智能化服务带来了革命性的变化。这种系统不仅仅是提升了工作效率&#xff0c;更是通过一系列智能化功能&#xff0c;根本性改变了物业管理的方式。比如&#xff0c;在广告位管理方面&#xff0c;…

Kafka 深入服务端 — 时间轮

Kafka中存在大量的延迟操作&#xff0c;比如延时生产、延时拉取和延时删除等。Kafka基于时间轮概念自定义实现了一个用于延时功能的定时器&#xff0c;来完成这些延迟操作。 1 时间轮 Kafka没有使用基于JDK自带的Timer或DelayQueue来实现延迟功能&#xff0c;因为它们的插入和…

Baklib如何推动企业知识管理的创新与转型探讨

内容概要 在当今快速发展的数字化时代&#xff0c;企业需要不断适应变化&#xff0c;以保持竞争优势。Baklib作为一款企业知识管理中台&#xff0c;扮演着推动数字化转型的重要角色。它通过提供一个集成的知识管理平台&#xff0c;帮助企业高效管理和共享内部及外部的知识资源…

日志收集Day005

1.filebeat的input类型之filestream实战案例: 在7.16版本中已经弃用log类型,之后需要使用filebeat,与log不同&#xff0c;filebeat的message无需设置就是顶级字段 1.1简单使用&#xff1a; filebeat.inputs: - type: filestreamenabled: truepaths:- /tmp/myfilestream01.lo…

【Rust自学】15.3. Deref trait Pt.2:隐式解引用转化与可变性

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 15.3.1. 函数和方法的隐式解引用转化(Deref Coercion) 隐式解引用转化(Deref Coercion)是为…

【技巧】优雅的使用 pnpm+Monorepo 单体仓库构建一个高效、灵活的多项目架构

单体仓库&#xff08;Monorepo&#xff09;搭建指南&#xff1a;从零开始 单体仓库&#xff08;Monorepo&#xff09;是一种将多个相关项目集中管理在一个仓库中的开发模式。它可以帮助开发者共享代码、统一配置&#xff0c;并简化依赖管理。本文将通过实际代码示例&#xff0…

【MySQL — 数据库增删改查操作】深入解析MySQL的create insert 操作

数据库CRUD操作 1 CRUD简介 CURD是对数据库中的记录进行基本的增删改查操作: 2. Create 新增 语法 INSERT [INTO] table_name[(column [&#xff0c;column] ...)] VALUES(value_list)[&#xff0c;(value_list)] ... # value 后面的列的个数和类型&#xff0c;要和表结构匹配…

VSCode下EIDE插件开发STM32

VSCode下STM32开发环境搭建 本STM32教程使用vscode的EIDE插件的开发环境&#xff0c;完全免费&#xff0c;有管理代码文件的界面&#xff0c;不需要其它IDE。 视频教程见本人的 VSCodeEIDE开发STM32 安装EIDE插件 Embedded IDE 嵌入式IDE 这个插件可以帮我们管理代码文件&am…

electron打包客户端在rk3588上支持h265硬解

目录 前言 chromium是如何支持h265硬解 electron/chromium第一次编译 electron/chromium第二次编译 前言 我们的客户端程序是用electron打包的前端程序&#xff0c;其在rk3588主机上的linux环境运行。之前使用客户端查看h264编码的视频直播是没有问题的&#xff0c;但视频源…

An OpenGL Toolbox

3.An OpenGL Toolbox 声明&#xff1a;该代码来自&#xff1a;Computer Graphics Through OpenGL From Theory to Experiments&#xff0c;仅用作学习参考 3.1 Vertex Arrays and Their Drawing Commands 顶点数组及其绘制命令&#xff1a;将几何数据存储在一个位置&#xff0c…

Three城市引擎地图插件Geo-3d

一、简介 基于Three开发&#xff0c;为Three 3D场景提供GIS能力和城市底座渲染能力。支持Web墨卡托、WGS84、GCJ02等坐标系&#xff0c;支持坐标转换&#xff0c;支持影像、地形、geojson建筑、道路&#xff0c;植被等渲染。支持自定义主题。 二、效果 三、代码 //插件初始化…

侧边导航(Semi Design)

根据前几次的导航栏设计&#xff0c;从最简单的三行导航栏到后面响应式的导航栏&#xff0c;其实可以在这个的基础上慢慢优化&#xff0c;就可以得到一个日常使用设计的导航栏。设计步骤也和之前的类似。 一、实现步骤 1、先下载安装好npm install douyinfe/semi-icons 2、引…

【中间件快速入门】什么是Redis

现在后端开发会用到各种中间件&#xff0c;一不留神项目可能在哪天就要用到一个我们之前可能听过但是从来没接触过的中间件&#xff0c;这个时候对于开发人员来说&#xff0c;如果你不知道这个中间件的设计逻辑和使用方法&#xff0c;那在后面的开发和维护工作中可能就会比较吃…

将 OneLake 数据索引到 Elasticsearch - 第二部分

作者&#xff1a;来自 Elastic Gustavo Llermaly 及 Jeffrey Rengifo 本文分为两部分&#xff0c;第二部分介绍如何使用自定义连接器将 OneLake 数据索引并搜索到 Elastic 中。 在本文中&#xff0c;我们将利用第 1 部分中学到的知识来创建 OneLake 自定义 Elasticsearch 连接器…

“AI教学实训系统:打造未来教育的超级引擎

嘿&#xff0c;各位教育界的伙伴们&#xff0c;今天我要跟你们聊聊一个绝对能让你们眼前一亮的教学神器——AI教学实训系统。作为资深产品经理&#xff0c;我可是亲眼见证了这款系统如何颠覆传统教学&#xff0c;成为未来教育的超级引擎。 一、什么是AI教学实训系统&#xff1f…