POD 存储、PV、PVC
目录
容器如何持久化存储?
PV和PVC
为什么不能直接在 Pod 或容器中存储数据?
什么是 PV和 PVC?
可以使用本地磁盘空间创建PV吗?
如何让客户端通过ftp上传到远端服务器的POD里面?
另一个POD想访问ftp的POD里面的文件怎么办?
容器如何持久化存储?
在 Docker 或 Kubernetes 中,容器的数据存储行为是 基于层(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。这通常通过 hostPath
或 local
类型的存储来实现。
但是,使用本地磁盘作为持久存储时,需要考虑一些因素,例如 数据的可靠性 和 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
使用 PVClocal-pvc
作为数据卷。
使用 本地磁盘(如 hostPath
或 local
类型)创建的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 都能读取。
步骤:
-
创建 Persistent Volume: 你可以创建一个 PV,并指定存储的类型,比如使用 NFS、Ceph、或者其他共享存储系统。该 PV 会存储所有文件,并由多个 Pod 共享。
-
创建 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 上传的文件。
相关文章:

POD 存储、PV、PVC
目录 容器如何持久化存储? PV和PVC 为什么不能直接在 Pod 或容器中存储数据? 什么是 PV和 PVC? 可以使用本地磁盘空间创建PV吗? 如何让客户端通过ftp上传到远端服务器的POD里面? 另一个POD想访问ftp的POD里面的…...

C中strlen和sizeof的区别
1、代码如下: #include<stdio.h>int main() {char a[10] { h,e,l,l,0};printf("%d\n",strlen(a));printf("%d\n", sizeof(a));return 0; } 2、运行结果如下:...

WSL2内部的Ubuntu怎么设置网络内桥接模式,弄了好久老是不成功,怎么办?
环境: Win10专业版 WSL2 Ubuntu22.04 问题描述: WSL2内部的Ubuntu怎么设置网络内桥接模式 解决方案: 方法一 1.控制面板开启,Hyper-V 管理器 2.重启电脑 3…创建外部虚拟交换机 打开 Hyper-V 管理器,在右侧操作面板中点击“虚拟交换机管理器”。 选择“创建虚…...

Linux环境下 搭建ELk项目 -单机版练习
前言 ELK 项目是一个由三个开源工具组成的日志处理和分析解决方案,ELK 是 Elasticsearch、Logstash 和 Kibana 的首字母缩写。这个项目的目标是帮助用户采集、存储、搜索和可视化大量的日志和事件数据,尤其是在分布式系统中。下面是每个组件的概述&…...

ubuntu20.04安装mysql5.7
安装之前要确保之前没安装过或者安装后卸载干净了,不然后面的配置文件可能会报错。 1. 下载安装包 打开链接 downloads.mysql.com/archives/co… 选择相应版本进行下载,这里mysql版本选择 5.7.35,系统选择Ubuntu Linux,选择64位…...

MacPorts 安装 Tengine
创建 Portfile 以下是我参考 nginx 调整后的 Portfile,如需安装指定版本,除了修改版本号之外还需要修改 checksums 里的 sha256 sha256 值需下载 Tengine 源码文件(tar.gz)进行计算 模块的调整在最后的 configure.args-append …...

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

【celery】任务有时候不执行
celery任务有时执行,有时不执行,这种情况是任务被冒领;有时执行说明这个方法可以使用,有时不执行通常是被使用同一个消息队列的进程冒领了; 解决 Redis:指定一个分块就行了...

【恶意软件检测论文】通过提取 API 语义来实现的一个新颖的安卓恶意软件检测方法
目录 摘要1. 引言2. 相关工作2.1. 基于重新训练的恶意软件检测2.2. 基于应用关系图的恶意软件检测2.3. 基于异常样本识别的恶意软件检测2.4. 基于API聚类的恶意软件检测 3. AMDASE概述4. 基于语义距离的API聚类4.1. API特征提取4.2. API句子生成4.3. API句子编码4.4.聚类中心生…...

什么,不用 Tomcat 也能运行 Java web?
在 Java web 开发领域,传统的 Tomcat 服务器一直占据着重要地位。但如今,Blade 框架的出现为我们提供了一种全新的开发体验,它无需依赖 Tomcat 便可运行 Java web 应用。 一、Blade 框架简介 是一款轻量级且高性能的 Java web 框架。其设计理…...

华为HarmonyOS实现跨多个子系统融合的场景化服务 -- 1 构建快速验证手机号Button
场景介绍 快速验证手机号Button功能用于帮助开发者向用户发起手机号申请,应用在满足《常见类型移动互联网应用程序必要个人信息范围规定》(对第三方网站的内容,华为公司不承担任何责任)中使用手机号的必要业务场景,经…...

王佩丰24节Excel学习笔记——第十一讲:Vlookup函数
【以 Excel2010 系列学习,用 Office LTSC 专业增强版 2021 实践】 【本章小技巧】 掌握vlookup使用方法,选区的第一列一定是查询参数条件一。使用通配符查询。vlookup 限 255 位长度。掌握日常使用场景。使用vlookup模糊匹配查询个税 一、使用Vlookup函…...

【QT实战の心情笔记】
文章目录 界面布局主要界面分为三部分:1. 笔记列表区域2. 笔记内容编辑区域3. 操作按钮区域 Qt Designer 界面设计步骤完整界面布局图各控件设置和属性Qt Designer 文件 (.ui) 数据库表结构SQL 表结构: 逻辑代码1. 项目结构2. Note 类 (Note.h 和 Note.c…...

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

排查常见的 MySQL性能问题
1. 查询速度慢:MySQL 数据库中最常见的性能问题之一是查询执行速度慢。缓慢的查询会增加等待时间和阻碍应用程序响应能力,从而显著影响用户体验。这些缓慢的查询可能由各种因素引起,例如缺少适当的索引、设计不佳的数据库架构、查询逻辑本身效…...

滑雪场管理系统
【毕业设计】基于SpringBoot Vue的滑雪场管理系统 摘要 随着信息化时代的快速发展,滑雪场作为冬季旅游的热门目的地,其管理效率和服务质量直接影响着游客的体验。为此,设计一个高效、安全、易用的滑雪场管理系统成为当务之急。本文详细阐述…...

西游记战力排名、笔记等
文章目录 战力排名对西游记的理解各个版本游戏题材西游记关卡和妖怪 西游记家喻户晓,没有谁不知道吧,无论是电视剧、影视,还是小说,乃至游戏,很多地方都有西游记的身影。 虽然知道,但总不如对三国啊、水浒啊…...

vue3 + js + vite创建的项目中配置svg图
安装 npm install vite-plugin-svg-icons npm install fast-globvite.config.js文件中配置如下内容 import { defineConfig } from vite import vue from vitejs/plugin-vue import { createSvgIconsPlugin } from vite-plugin-svg-icons import path from path export defau…...

c++ 找第一个只出现一次的字符
【题目描述】 给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有,输出no。 【输入】 一个字符串,长度小于100000。 【输出】 输出第一个仅出现一次的字符,若没有则输出no。 【输入样例】 abcabd【输出样…...

在 Unity 6 中使用APV为您的世界创建全局照明的新方法(一)
Unity 6 中推出的新照明功能让您能够更快速、更高效的完成对烘焙场景的照明工作,在本文中我们将与大家详细分享在 Unity 6 中应用自适应探针卷创建快速全局光照的更多细节与具体应用方法。由于内容比较丰富,我们将把内容分为三篇文章,以便大家…...

Win11安装安卓子系统WSA
文章目录 简介一、启用Hyper-V二、安装WSA三、安装APKAPK商店参考文献 简介 WSA:Windows Subsystem For Android 一、启用Hyper-V 控制面板 → 程序和功能 → 启用或关闭 Windows 功能 → 勾选 Hyper-V 二、安装WSA 进入 Microsoft Store,下拉框改为 …...

利用两种方式分别实现单例模式(懒汉式、饿汉式)
package testsingle;//实现单例的两种方式 public class TestMySingle {public static void main(String[] args) {ClassA ca1 ClassA.getClassA();ClassA ca2 ClassA.getClassA();System.out.println(ca1ca2);ClassB cb1 ClassB.getClassB();ClassB cb2 ClassB.getClassB(…...

js分页功能
先声明些全局变量方便我们在下面的代码中使用 //一页有多少条数据 let pagenum 10; //页码下标 let page_index 0; //总页数 let total_page; // 声明一个用于接数据的变量 let data; //获取数据 let res;通过获取数据渲染页面 // 渲染函数 function applys(da…...

Ubuntu20.04 编译运行 ORBSLAM2_with_pointcloud_map(以RGBD Orbbec Astra+为例)保姆级教程
Ubuntu20.04 编译运行 ORBSLAM2_with_pointcloud_map(以RGBD Orbbec Astra为例) 获取源码 git clone https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map.git解压文件 得到如下内容 编译安装修改后的g2o cd g2o_with_orbslam2 mkdir build cd build cmake .. make…...

MyBatis(四)
第一章:MyBatis延迟加载策略 1. 延迟加载的概念 立即加载和延迟加载的区别,使用一对多的环境举例子。 立即加载:当前查询用户的时候,默认也把该用户所拥有的帐户信息查询出来了。 延迟加载:当前查询用户的时候&…...

【从零开始的LeetCode-算法】3285. 找到稳定山的下标
有 n 座山排成一列,每座山都有一个高度。给你一个整数数组 height ,其中 height[i] 表示第 i 座山的高度,再给你一个整数 threshold 。 对于下标不为 0 的一座山,如果它左侧相邻的山的高度 严格大于 threshold ,那么我…...

Docker常用命令总结~
1、关于镜像 获取镜像 docker pull [image name] [option:tag]AI助手//获取postgres镜像(没有设置镜像版本号则默认获取最新的,使用latest标记) docker pull postgres or docker pull postgres:11.14 列出本地镜像 docker imagesAI助手 指定镜像启动一个容…...

浅谈怎样系统的准备前端面试
前言 创业梦碎,回归现实,7 月底毅然裸辞,苦战两个月,拿到了美团和字节跳动的 offer,这算是从业以来第一次真正意义的面试,遇到蛮多问题,比如一开始具体的面试过程我都不懂,基本一直是…...

如何配置防火墙提高服务器安全性
配置防火墙是提高服务器安全性的重要措施之一。防火墙可以控制网络流量,限制未经授权的访问,防止恶意攻击。以下是配置防火墙以提高服务器安全性的详细指南。 一、为什么需要配置防火墙 防火墙的主要作用是: 限制未经授权的访问:…...

java集合-Map HashMap 源码解析
hashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,无序,不可重复。HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。HashMap 实现了Ser…...