POD 存储、PV、PVC

目录

容器如何持久化存储?

PV和PVC

为什么不能直接在 Pod 或容器中存储数据?

什么是 PV和 PVC?

可以使用本地磁盘空间创建PV吗?

如何让客户端通过ftp上传到远端服务器的POD里面?

另一个POD想访问ftp的POD里面的文件怎么办?


容器如何持久化存储?

DockerKubernetes 中,容器的数据存储行为是 基于层(layer)的,并且容器内的数据在容器生命周期内是持久的,直到容器被删除为止。

1. 容器和镜像的关系

容器是基于镜像(Image)创建的。镜像本身是只读的,而容器在启动时会创建一个可写层,容器对文件系统的所有更改都会写入这个可写层。这就意味着:

  • 镜像:是静态的、不可变的,只包含基础文件和应用程序的环境配置。
  • 容器的可写层:在容器运行时创建,这个层用于保存容器的所有更改,包括安装的应用、修改的文件、生成的数据等。

因此,容器内的文件和更改 不会 被直接丢失,除非容器被 删除。如果容器被停止或重启,但 容器没有被删除,它的可写层中的数据将仍然保留。

2. 容器重启

如果容器被 重启,它会重新启动容器本身,但不会丢失之前的更改,因为容器的可写层是持久存在的(即使容器停止或重启,也不会丢失数据,除非容器本身被删除)。

  • 容器停止并重启:容器的文件系统保持不变,所有在容器内做的更改(如修改配置文件、写入日志等)会在容器重启后仍然存在。
  • 容器被删除:如果容器被删除,无论它是否重启,容器内的更改都会丢失。

3. 举个例子

假设你启动了一个容器,在容器内创建了一个文件 /tmp/test.txt,然后停止并重启容器:

  • 重启容器:容器内的 /tmp/test.txt 文件将会保留。
  • 删除容器并重新启动:容器内的 /tmp/test.txt 文件会丢失,因为容器被完全删除,重建了一个新的容器实例。

4. 容器存储与持久化

容器的可写层是 临时的,它绑定到容器的生命周期。如果你希望数据在容器重启或删除后仍然存在,通常需要使用 持久化存储。在 Kubernetes 中,通常使用 Persistent Volumes (PV)Persistent Volume Claims (PVC) 来解决这个问题。

5. 总结:

  • 容器内的数据在容器重启时不会丢失,只要容器本身没有被删除,容器的可写层中的所有更改会保留。
  • 如果容器被删除,容器内的所有数据(包括在可写层中存储的文件)都会丢失。
  • 持久化存储(如 PV 和 PVC)可以确保数据即使在容器删除或重启后也能保持不丢失。

持久化存储解决方案

对于需要长期存储数据的应用,推荐将数据存储在持久化存储上,而不是直接保存在容器的文件系统中。通过挂载 Persistent Volume (PV)Persistent Volume Claim (PVC),数据将独立于容器的生命周期存在,这样即使容器删除或重启,数据也能得到持久保存。

//没有k8s,直接把容器目录挂载到主机目录即可持久化存储。

PV和PVC

为什么不能直接在 Pod 或容器中存储数据?

直接在 Pod 或容器内存储数据确实是可能的,但这样做有几个问题,尤其是在容器化环境和 Kubernetes 集群中:

  • 容器的短暂性:Kubernetes 中的容器(以及 Pod)通常是短暂的,可能会被删除、重启或重新调度。如果容器被删除,容器内的数据会丢失。因此,容器内部存储的文件是临时的,并且在 Pod 的生命周期内无法保持持久性。

  • Pod 调度和重启:Pod 可能会因为各种原因被删除或重新调度到其他节点。Kubernetes 通过其调度机制决定将 Pod 放在哪个节点运行,这意味着如果没有外部持久存储,每个节点的本地存储都会是独立的,无法共享,也可能在 Pod 重启时丢失数据。

  • 存储共享的需求:如果你需要让多个 Pod 访问相同的数据(例如,多个 Pod 需要读取或写入相同的文件),则必须依赖于共享的存储系统。

什么是 PV和 PVC?
  • Persistent Volume (PV):是 Kubernetes 集群中一个 具体的存储资源,通常由集群管理员预配置。PV 是对物理存储资源的抽象,它可以是多种类型的存储后端(如 NFS、iSCSI、Ceph、云存储等)。它拥有明确的生命周期,并且独立于 Pod 和容器的生命周期。

  • Persistent Volume Claim (PVC):是用户对存储的请求。它类似于对 PV 的“租用”请求。PVC 定义了存储的需求(如大小、访问模式等),Kubernetes 调度器会自动匹配一个合适的 PV 来满足 PVC 的要求。PVC 是用户和存储之间的接口,它让用户无需直接关心存储的具体实现方式,而是专注于声明自己需要什么样的存储。

可以使用本地磁盘空间创建PV吗?

可以使用本地磁盘空间创建 Persistent Volume (PV)。在 Kubernetes 中,你可以使用本地磁盘(例如,物理硬盘、SSD 或本地挂载的存储)来创建一个 PV。这通常通过 hostPathlocal 类型的存储来实现。

但是,使用本地磁盘作为持久存储时,需要考虑一些因素,例如 数据的可靠性Pod 的迁移性因为如果 Pod 运行在某个节点上,而这个节点出现故障或被删除,存储在该节点上的数据将无法访问。为了确保数据的持久性和可靠性,通常会使用 分布式存储系统网络存储(如 NFS、Ceph、iSCSI 等)。但是,若你只是为了测试、开发或某些特定用途,使用本地磁盘作为 PV 是完全可以的。

1. 通过 hostPath 创建本地磁盘的 PV

hostPath 类型的 PV 允许你直接将本地节点的目录或磁盘挂载到容器中。这适用于在单个节点上使用本地磁盘,但不推荐在生产环境中使用,因为它依赖于特定的节点,且不支持跨节点共享。

示例:使用 hostPath 创建 PV

apiVersion: v1
kind: PersistentVolume
metadata:name: local-pv
spec:capacity:storage: 10Gi  # 存储大小volumeMode: FilesystemaccessModes:- ReadWriteOnce  # 单节点读写persistentVolumeReclaimPolicy: Retain  # 数据不会自动删除storageClassName: manual  # 存储类(手动配置)hostPath:path: /mnt/disks/mydisk  # 本地磁盘的挂载路径type: DirectoryOrCreate  # 如果目录不存在则创建

解释:

  • hostPath 指定了本地磁盘路径(例如 /mnt/disks/mydisk)。
  • accessModes 设置为 ReadWriteOnce,表示该 PV 只能由一个节点的一个 Pod 进行读写访问。
  • persistentVolumeReclaimPolicy 设置为 Retain,表示当 PV 被删除时,数据不会被删除。
  • storageClassName 设置为 manual,表示使用手动配置的存储类。

2. 通过 local 类型创建本地磁盘的 PV(推荐方法)

在 Kubernetes 1.14 及以上版本,官方引入了 local 类型的 PV,它更好地支持本地存储设备,并且可以在集群节点上通过 local 存储提供持久存储。这种方式相较于 hostPath 更适合生产环境中的本地存储。

示例:使用 local 类型创建 PV

apiVersion: v1
kind: PersistentVolume
metadata:name: local-pv
spec:capacity:storage: 10Gi  # 存储大小volumeMode: FilesystemaccessModes:- ReadWriteOnce  # 单节点读写persistentVolumeReclaimPolicy: Retain  # 数据不会自动删除storageClassName: manual  # 存储类(手动配置)local:path: /mnt/disks/mydisk  # 本地磁盘的挂载路径fsType: ext4  # 文件系统类型

解释:

  • local 类型的 PV 和 hostPath 类似,指定本地路径(如 /mnt/disks/mydisk)。
  • fsType 用于指定文件系统类型(例如 ext4、xfs 等)。
  • volumeMode 设置为 Filesystem,意味着文件存储。
  • persistentVolumeReclaimPolicy 设置为 Retain,以保留数据。

3. 创建 PVC(Persistent Volume Claim)来请求本地存储

一旦 PV 创建完毕,你可以创建一个 PVC(Persistent Volume Claim)来请求这个本地存储。PVC 是应用程序对存储资源的请求,Kubernetes 会根据 PVC 的要求选择合适的 PV。

示例:创建 PVC 来使用本地 PV

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: local-pvc
spec:accessModes:- ReadWriteOnce  # 单节点读写resources:requests:storage: 10Gi  # 请求的存储大小storageClassName: manual  # 与 PV 的 storageClassName 配置一致

解释:

  • accessModes 与 PV 配置一致,表示 PVC 请求的存储只能由一个节点的一个 Pod 使用。
  • resources.requests.storage 定义了 PVC 请求的存储大小。
  • storageClassName 需要与 PV 配置中的 storageClassName 保持一致。

4. 将 PVC 挂载到 Pod 中

创建 PVC 后,你可以将其挂载到 Pod 中,使用本地存储。

示例:在 Pod 中挂载 PVC

apiVersion: v1
kind: Pod
metadata:name: local-pod
spec:containers:- name: my-containerimage: nginxvolumeMounts:- mountPath: /data  # 容器中的挂载路径name: local-storagevolumes:- name: local-storagepersistentVolumeClaim:claimName: local-pvc  # 引用 PVC

解释:

  • volumeMounts 将 PVC 挂载到容器的 /data 路径。
  • volumes 使用 PVC local-pvc 作为数据卷。

使用 本地磁盘(如 hostPathlocal 类型)创建的PV节点特定的,这意味着它只能由存储它的节点上的 Pod 访问。简而言之,其他节点上的 Pod 无法访问该 PV,除非它们也在同一节点上运行。

如何让客户端通过ftp上传到远端服务器的POD里面?

目标是让客户端通过FTP上传文件到一个Kubernetes Pod内,而不是直接上传到服务器上。这是可以做到的,但需要通过一些间接的方式来配置和管理。Kubernetes本身并不提供FTP服务。

以下是实现这个需求的几种方法:

1. 使用FTP服务器作为Pod的容器

你可以在Kubernetes集群中部署一个包含FTP服务的Pod。客户端通过FTP上传文件到该Pod后,文件可以直接存储在Pod的文件系统中。这样,你就实现了客户端通过FTP上传文件到Pod内的需求。

步骤:

  • 创建一个Docker镜像,包含FTP服务(例如vsftpd或者ProFTPD)。
  • 在Kubernetes集群中创建一个Pod来运行FTP服务。
  • 配置该Pod的持久化存储(Persistent Volume,PV)和持久化卷声明(Persistent Volume Claim,PVC)来存储上传的文件。
  • 配置该Pod的端口映射,使FTP服务的端口暴露出来,客户端可以通过FTP客户端连接到这个Pod。

示例:

  • 创建一个简单的FTP容器镜像(基于vsftpd):Dockerfile

    FROM alpine:latest
    RUN apk --no-cache add vsftpd
    COPY vsftpd.conf /etc/vsftpd.conf
    EXPOSE 21
    CMD ["vsftpd", "/etc/vsftpd.conf"]
    
  • Kubernetes部署FTP Pod:

    apiVersion: apps/v1
    kind: Deployment
    metadata:name: ftp-server
    spec:replicas: 1selector:matchLabels:app: ftp-servertemplate:metadata:labels:app: ftp-serverspec:containers:- name: vsftpdimage: your-ftp-image:latestports:- containerPort: 21volumeMounts:- mountPath: /srv/ftpname: ftp-datavolumes:- name: ftp-datapersistentVolumeClaim:claimName: ftp-pvc
    
  • 创建PVC来存储数据:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:name: ftp-pvc
    spec:accessModes:- ReadWriteOnceresources:requests:storage: 1Gi
    
  • 创建Service来暴露FTP端口:

    apiVersion: v1
    kind: Service
    metadata:name: ftp-service
    spec:selector:app: ftp-serverports:- protocol: TCPport: 21targetPort: 21type: LoadBalancer

    另一个POD想访问ftp的POD里面的文件怎么办?

        最常见且推荐的方法是使用 Kubernetes 中的 Persistent Volume (PV)Persistent Volume Claim (PVC)。通过将一个 PVC 挂载到 FTP Pod 上的目录并共享该 PVC,另一个 Pod 可以访问同一个存储资源。这样,无论哪个 Pod 上传文件,其他 Pod 都能读取。

步骤:

  1. 创建 Persistent Volume: 你可以创建一个 PV,并指定存储的类型,比如使用 NFS、Ceph、或者其他共享存储系统。该 PV 会存储所有文件,并由多个 Pod 共享。

  2. 创建 Persistent Volume Claim (PVC): 每个 Pod 都需要通过 PVC 来访问这个 PV。FTP Pod 和另一个远程 Pod 都需要挂载这个 PVC。

示例配置:

Persistent Volume(PV) 配置:

apiVersion: v1
kind: PersistentVolume
metadata:name: shared-pv
spec:capacity:storage: 10GiaccessModes:- ReadWriteMany  # 多个Pod可以读写persistentVolumeReclaimPolicy: RetainstorageClassName: standardnfs:path: /mnt/data  # NFS共享路径server: <nfs-server-ip>  # NFS服务器地址

Persistent Volume Claim(PVC) 配置:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: shared-pvc
spec:accessModes:- ReadWriteManyresources:requests:storage: 10Gi

FTP Pod 配置: 将 PVC 挂载到 FTP Pod 中:

apiVersion: apps/v1
kind: Deployment
metadata:name: ftp-server
spec:replicas: 1selector:matchLabels:app: ftp-servertemplate:metadata:labels:app: ftp-serverspec:containers:- name: vsftpdimage: your-ftp-image:latestports:- containerPort: 21volumeMounts:- mountPath: /srv/ftp  # FTP服务存储目录name: ftp-datavolumes:- name: ftp-datapersistentVolumeClaim:claimName: shared-pvc  # 挂载同一个PVC

远端 Pod 配置: 另一个 Pod 可以挂载同一个 PVC,读取上传的文件

apiVersion: apps/v1
kind: Deployment
metadata:name: data-processor
spec:replicas: 1selector:matchLabels:app: data-processortemplate:metadata:labels:app: data-processorspec:containers:- name: processorimage: your-data-processor-image:latestvolumeMounts:- mountPath: /data/uploads  # 数据存储目录name: shared-datavolumes:- name: shared-datapersistentVolumeClaim:claimName: shared-pvc  # 同样挂载同一个PVC

这样,FTP Pod 会将文件存储到 /srv/ftp,而 远端 Pod 可以访问 /data/uploads 目录,读取 FTP 上传的文件。

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

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

相关文章

实操给桌面机器人加上超拟人音色

前面我们讲了怎么用CSK6大模型开发板做一个桌面机器人充当AI语音助理&#xff0c;近期上线超拟人方案&#xff0c;不仅大模型语音最快可以1秒内回复&#xff0c;还可以让我们的桌面机器人使用超拟人音色、具备声纹识别等能力&#xff0c;本文以csk6大模型开发板为例实操怎么把超…

docker(wsl)命令 帮助文档

WSL wsl使用教程 wsl -l -v 列出所有已安装的 Linux 发行版 wsl -t Ubuntu-22.04 --shutdown 关闭所有正在运行的WSL发行版。如果你只想关闭特定的发行版 wsl -d Ubuntu-22.04 登录到Ubuntu环境 wsl --list --running 查看正在wsl中运行的linux发行版 wsl --unregister (系统名…

CNN、RNN、LSTM和Transformer之间的区别和联系

文章目录 CNN、RNN、LSTM和Transformer之间的区别和联系前言CNN&#xff08;卷积神经网络&#xff09;RNN&#xff08;循环神经网络&#xff09;LSTM&#xff08;长短期记忆网络&#xff09;Transformer四者之间的联系与区别Yolo算法简介Yolo和CNN的关系YOLO各版本 CNN、RNN、L…

无人机航测VS传统测绘

无人机航测系统的优点 机动灵活&#xff0c;作业周期短&#xff1a; 无人机航测系统能够迅速响应测绘需求&#xff0c;不受地形和交通限制&#xff0c;可以灵活调整航线&#xff0c;作业周期短。 无人机体积小&#xff0c;噪音小&#xff0c;可以垂直起降、悬停、侧飞、倒飞…

小红书飞书素材库 | AI改写 | 无水印下载 | 多维表格 | 采集同步 | 影刀RPA

小红书飞书素材库 | AI改写 | 无水印下载 | 多维表格 | 采集同步 | 影刀RPA 模板准备 进入【小红书】素材采集库_荷逸模板&#xff0c;点击使用模板 创建文档应用 在开发者后台 - 飞书开放平台创建 企业自建应用 (需要账号有相应的权限, 如果没有权限向管理员申请) 获取 Ap…

[计算机网络]ARP协议的故事:小明找小红的奇妙旅程

1.ARP小故事 在一个繁忙的网络世界中&#xff0c;每个设备都有自己的身份标识——MAC地址&#xff0c;就像每个人的身份证号码一样。在这个故事里&#xff0c;我们的主角小明&#xff08;主机&#xff09;需要找到小红&#xff08;目标主机&#xff09;的MAC地址&#xff0c;才…

IP协议详解

目录 一. IP协议概述 1. 概念 2. 特点 (1) 无连接性 (2) 不可靠传输 (3) 数据包分片和重组 二. IP协议报文格式 1. 版本 (4位) 2. 首部长度 (4位) 3. 服务类型 (8位) 4. 总长度 (16位) 5. 标识, 标志位, 片偏移 6. 生存时间 (8位) 7. 协议 (8位) 8. 首部检验和 (1…

使用Gradio编写大模型ollama客户端 -界面版

使用Gradio编写大模型ollama客户端 -界面版 flyfish 文末包含完整源码 图例 sqlite3 是 Python 内置的一个库&#xff0c;用于与 SQLite 数据库进行交互。SQLite 是一个轻量级的数据库&#xff0c;它不需要单独的服务器进程或系统的配置&#xff0c;非常适合于嵌入式应用和…

[IT项目管理]九.项目质量管理

九&#xff0e;项目质量管理 9.1项目质量管理的重要性 对于很多IT项目的差劲&#xff0c;大多数人只可以忍受。项目质量管理是IT项目管理的重要组成部分&#xff0c;对于提高项目成功率、降低项目成本、提升客户满意度至关重要。尽管很多人对IT项目的质量问题感到无奈&#x…

SSM 框架结合 Vue 实现电脑测评系统:助力用户明智选择

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

图像生成工具WebUI

介绍 Stable Diffusion WebUI&#xff08;AUTOMATIC1111&#xff0c;简称A1111&#xff09;是一个为高级用户设计的图形用户界面&#xff08;GUI&#xff09;&#xff0c;它提供了丰富的功能和灵活性&#xff0c;以满足复杂和高级的图像生成需求。如今各种人工智能满天飞&…

智源大模型通用算子库FlagGems四大能力升级 持续赋能AI系统开源生态

FlagGems是由智源研究院于2024年6月推出的面向多种AI芯片的开源大模型通用算子库。FlagGems使用Triton语言开发&#xff0c;在Triton生态开源开放的基础上&#xff0c;为多种AI芯片提供开源、统一、高效的算子层生态接入方案。FlagGems沿着统一的中间语言、统一的算子接口和统一…

FFmpeg库之ffplay

文章目录 FFmpeg环境搭建ffplay使用通用选项视频选项音频选项快捷键使用滤镜直播拉流 FFmpeg环境搭建 FFmpeg官网 FFmpeg环境搭建 ./configure \--prefix"$HOME/ffmpeg" \--extra-cflags"-I$HOME/ffmpeg/include" \--extra-ldflags"-L$HOME/ffmpeg…

HTTP协议和接口测试详解

介绍接口测试前我们先来介绍一下HTTP协议&#xff0c;为什么先要介绍HTTP协议呢因为因为我们做接口测试其实就是用测试工具&#xff08;postman,fiddler,jmeter等等&#xff09;或代码来模拟用户使用软件的场景&#xff0c;在我们模拟的时候不像平时功能测试时我们有已经开发完…

CVE-2024-32709 WordPress —— Recall 插件存在 SQL 注入漏洞

漏洞描述 WordPress 是一款免费开源的内容管理系统,适用于各类网站,包括个人博客、电子商务系统、企业网站。其插件 WP-Recall 的 account 存在 SQL 注入漏洞,攻击者可以通过该漏洞获取数据库敏感信息。 WP-Recall 版本 <= 16.26.5 漏洞复现 搭建环境、安装插件、完成…

深度学习之目标检测篇——残差网络与FPN结合

特征金字塔多尺度融合特征金字塔的网络原理 这里是基于resnet网络与Fpn做的结合&#xff0c;主要把resnet中的特征层利用FPN的思想一起结合&#xff0c;实现resnet_fpn。增强目标检测backone的有效性。代码实现如下&#xff1a; import torch from torch import Tensor from c…

Qt之修改窗口标题、图标以及自定义标题栏(九)

Qt开发 系列文章 - titles-icons-titlebars&#xff08;九&#xff09; 目录 前言 一、修改标题 二、添加图标 三、更换标题栏 1.效果演示 2.创建标题栏类 3.定义相关函数 4.使用标题栏类 总结 前言 在我们利用Qt设计软件时&#xff0c;经常需要修改窗口标题、更改软…

睡岗和玩手机数据集,4653张原始图,支持YOLO,VOC XML,COCO JSON格式的标注

睡岗和玩手机数据集&#xff0c;4653张原始图&#xff0c;支持YOLO&#xff0c;VOC XML&#xff0c;COCO JSON格式的标注 数据集分割 训练组70&#xff05; 3257图片 有效集20&#xff05; 931图片 测试集10&#xff05; 465图片 预处理 没有采用任何预处…

GIN

gin是什么 Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。 它具有类似 Martini 的 API&#xff0c;但性能比 Martini 快 40 倍。如果你需要极好的性能&#xff0c;使用 Gin 吧。 特点&#xff1a;gin是golang的net/http库封装的web框架&#xff0c;api友好&#xff0c;注…

Git安装及基础学习

Git学习 Git安装 概述&#xff1a; Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速的处理 从很小到非常大的项目版本管理&#xff0c;是目前使用范围最广的版本 管理工具。 下载安装&#xff1a; 下载地址&#xff1a;https://git-scm.com/ 下载后傻瓜式一键安…