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.mzph.cn/bicheng/69221.shtml

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

相关文章

如何移植ftp服务器到arm板子?

很多厂家提供的sdk&#xff0c;一般都不自带ftp服务器功能&#xff0c; 需要要发人员自己移植ftp服务器程序。 本文手把手教大家如何移植ftp server到arm板子。 环境 sdk&#xff1a;复旦微 Buildroot 2018.02.31. 解压 $ mkdir ~/vsftpd $ cp vsftpd-3.0.2.tar.gz ~/vs…

Alfresco Content Services docker自动化部署操作

Alfresco Content Services docker部署文档 前提条件 在开始之前&#xff0c;需要确保已经安装了 Docker 和 Docker Compose。Docker 用于创建和管理容器&#xff0c;Docker Compose 则用于定义和运行多容器的 Docker 应用。 步骤 1. 创建目录结构 首先&#xff0c;创建一个…

计算机网络 (61)移动IP

前言 移动IP&#xff08;Mobile IP&#xff09;是由Internet工程任务小组&#xff08;Internet Engineering Task Force&#xff0c;IETF&#xff09;提出的一个协议&#xff0c;旨在解决移动设备在不同网络间切换时的通信问题&#xff0c;确保移动设备可以在离开原有网络或子网…

嵌入式MCU面试笔记2

目录 串口通信 概论 原理 配置 HAL库代码 1. 初始化函数 2. 数据发送和接收函数 3. 中断和DMA函数 4. 中断服务函数 串口通信 概论 我们知道&#xff0c;通信桥接了两个设备之间的交流。一个经典的例子就是使用串口通信交换上位机和单片机之间的数据。 比较常见的串…

Charles 4.6.7 浏览器网络调试指南:流量过滤与分析(六)

1. 概述 在网络调试和优化过程中&#xff0c;Charles 不仅可以实现简单的网络抓包操作&#xff0c;还支持更高级的抓包技巧和流量分析功能。这些功能能够帮助开发者深入挖掘网络请求的细节&#xff0c;为复杂问题提供有效的解决方案。本文将重点讲解 Charles 的过滤规则、自定…

xss靶场

xss-labs下载地址&#xff1a;GitHub - do0dl3/xss-labs: xss 跨站漏洞平台 xss常见触发标签&#xff1a;XSS跨站脚本攻击实例与防御策略-CSDN博客 level-1 首先查看网页的源代码发现get传参的name的值test插入了html里头&#xff0c;还回显了payload的长度。 <!DOCTYPE …

主机监控软件WGCLOUD使用指南 - 如何设置主题背景色

WGCLOUD运维监控系统&#xff0c;从v3.5.7版本开始支持设置不同的主题背景色&#xff0c;如下 更多主题查看说明 如何设置主题背景色 - WGCLOUD

C语言:数据的存储

本文重点&#xff1a; 1. 数据类型详细介绍 2. 整形在内存中的存储&#xff1a;原码、反码、补码 3. 大小端字节序介绍及判断 4. 浮点型在内存中的存储解析 数据类型结构的介绍&#xff1a; 类型的基本归类&#xff1a; 整型家族 浮点家族 构造类型&#xff1a; 指针类型&…

51单片机入门_01_单片机(MCU)概述(使用STC89C52芯片;使用到的硬件及课程安排)

文章目录 1. 什么是单片机1.1 微型计算机的组成1.2 微型计算机的应用形态1.3 单板微型计算机1.4 单片机(MCU)1.4.1 单片机内部结构1.4.2 单片机应用系统的组成 1.5 80C51单片机系列1.5.1 STC公司的51单片机1.5.1 STC公司单片机的命名规则 2. 单片机的特点及应用领域2.1 单片机的…

使用 OpenCV 和 Python 轻松实现人脸检测

目录 一、准备工作 二、加载人脸检测模型 三、读取图像并进行人脸检测 四、处理视频中的人脸检测 五、优化人脸检测效果 六、总结 在人工智能和计算机视觉领域,人脸检测是一项非常基础且重要的技术。通过人脸检测,我们可以在图像或视频中识别并定位人脸,进而进行后续的…

Qt 控件与布局管理

1. Qt 控件的父子继承关系 在 Qt 中&#xff0c;继承自 QWidget 的类&#xff0c;通常会在构造函数中接收一个 parent 参数。 这个参数用于指定当前空间的父控件&#xff0c;从而建立控件间的父子关系。 当一个控件被设置为另一控件的子控件时&#xff0c;它会自动成为该父控…

20250122-正则表达式

1. 正则标记 表示一位字符&#xff1a;\\ 表示指定的一位字符&#xff1a;x 表示任意的一位字符&#xff1a;. 表示任意一位数字&#xff1a;\d 表示任意一位非数字&#xff1a;\D 表示任意一个字母&#xff1a;[a-zA-Z]&#xff08;大写或小写&#xff09; 表示任意一个…

基于DNN深度神经网络的OFDM+QPSK信号检测与误码率matlab仿真

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要 在现代通信…

一文详解Filter类源码和应用

背景 在日常开发中&#xff0c;经常会有需要统一对请求做一些处理&#xff0c;常见的比如记录日志、权限安全控制、响应处理等。此时&#xff0c;ServletApi中的Filter类&#xff0c;就可以很方便的实现上述效果。 Filter类 是一个接口&#xff0c;属于 Java Servlet API 的一部…

switch组件的功能与用法

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了PageView这个Widget,本章回中将介绍Switch Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在这里介绍的Switch是指左右滑动的开关&#xff0c;常用来表示某项设置是打开还是关闭。Fl…

C++ 复习总结记录九

C 复习总结记录九 主要内容 1、list 介绍及使用 2、list 剖析及模拟实现 3、list 与 vector 对比 一 list 介绍及使用 List 相关文档 1、List 在任意位置进行插入和删除的序列式容器 O(1) &#xff0c;且该容器可前后双向迭代 2、List 底层是带头双向循环链表&#xff…

从音频到 PDF:AI 全流程打造完美英文绘本教案

今天把英文绘本的自学教案自动生成流程完成了&#xff0c;我分享一下整个实现思路&#xff0c;让你也轻松搞定英文绘本教案的产出&#xff0c;让孩子的学习之路更加顺畅。  从音频到 PDF&#xff1a;AI 全流程打造完美英文绘本教案 一、音频转文本&#xff1a;AI 助力第一步 …

(5)STM32 USB设备开发-USB键盘

讲解视频&#xff1a;2、USB键盘-下_哔哩哔哩_bilibili 例程&#xff1a;STM32USBdevice: 基于STM32的USB设备例子程序 - Gitee.com 本篇为使用使用STM32模拟USB键盘的例程&#xff0c;没有知识&#xff0c;全是实操&#xff0c;按照步骤就能获得一个STM32的USB键盘。本例子是…

初步认识操作系统(Operator System)

目录 一、概念二、设计OS的目的三、定位四、操作系统上下的分级五、如何理解 "管理"六、总结 一、概念 任何计算机系统都包含一个基本的程序集合&#xff0c;称为操作系统(OS)。操作系统包括&#xff1a; 内核&#xff08;进程管理&#xff0c;内存管理&#xff0c…

LINUX 平台最快子网路由转发,内核使能选项配置

阅读本文之间&#xff0c;可线性参考以下文献。 Linux 命令行配置为单臂旁路由。_linux单臂路由-CSDN博客 Linux 软路由命令行配置&#xff08;参考&#xff09;_linux软路由-CSDN博客 VGW在 Windows 平台上局域网就绪的旁路由器程序_windows旁路由-CSDN博客 本文介绍 LINUX…