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: Filesystem
  accessModes:
    - 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: Filesystem
  accessModes:
    - 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-container
    image: nginx
    volumeMounts:
    - mountPath: /data  # 容器中的挂载路径
      name: local-storage
  volumes:
  - name: local-storage
    persistentVolumeClaim:
      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: 1
      selector:
        matchLabels:
          app: ftp-server
      template:
        metadata:
          labels:
            app: ftp-server
        spec:
          containers:
          - name: vsftpd
            image: your-ftp-image:latest
            ports:
              - containerPort: 21
            volumeMounts:
              - mountPath: /srv/ftp
                name: ftp-data
          volumes:
          - name: ftp-data
            persistentVolumeClaim:
              claimName: ftp-pvc
    
  • 创建PVC来存储数据:

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

    apiVersion: v1
    kind: Service
    metadata:
      name: ftp-service
    spec:
      selector:
        app: ftp-server
      ports:
        - protocol: TCP
          port: 21
          targetPort: 21
      type: 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: 10Gi
  accessModes:
    - ReadWriteMany  # 多个Pod可以读写
  persistentVolumeReclaimPolicy: Retain
  storageClassName: standard
  nfs:
    path: /mnt/data  # NFS共享路径
    server: <nfs-server-ip>  # NFS服务器地址

Persistent Volume Claim(PVC) 配置:

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

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ftp-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ftp-server
  template:
    metadata:
      labels:
        app: ftp-server
    spec:
      containers:
      - name: vsftpd
        image: your-ftp-image:latest
        ports:
          - containerPort: 21
        volumeMounts:
          - mountPath: /srv/ftp  # FTP服务存储目录
            name: ftp-data
      volumes:
      - name: ftp-data
        persistentVolumeClaim:
          claimName: shared-pvc  # 挂载同一个PVC

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: data-processor
spec:
  replicas: 1
  selector:
    matchLabels:
      app: data-processor
  template:
    metadata:
      labels:
        app: data-processor
    spec:
      containers:
      - name: processor
        image: your-data-processor-image:latest
        volumeMounts:
          - mountPath: /data/uploads  # 数据存储目录
            name: shared-data
      volumes:
      - name: shared-data
        persistentVolumeClaim:
          claimName: shared-pvc  # 同样挂载同一个PVC

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA 零拷贝技术和主流中间件零拷贝技术应用

目录 介绍Java代码里面有哪些零拷贝技术java 中文件读写方式主要分为什么是FileChannelmmap实现sendfile实现 文件IO实战需求代码编写实战IOTest.java 文件上传阿里云&#xff0c;测试运行代码看耗时为啥带buffer的IO比普通IO性能高&#xff1f;BufferedInputStream为啥性能高点…

系统移植——Linux 内核顶层 Makefile 详解

一、概述 Linux Kernel网上下载的版本很多NXP等有自己对应的版本。需要从网上直接下载就可以。 二、Linux内核初次编译 编译内核之前需要先在 ubuntu 上安装 lzop 库 sudo apt-get install lzop 在 Ubuntu 中 新 建 名 为 “ alientek_linux ” 的 文 件夹 &#xff0c; …

Reactor

文章目录 正确的理解发送double free问题解决 1.把我们的reactor进行拆分2.链接管理3.Reactor的理论 listensock只需要设置_recv_cb&#xff0c;而其他sock&#xff0c;读&#xff0c;写&#xff0c;异常 所以今天写nullptr其实就不太对&#xff0c;添加为空就没办法去响应事件…

【深度学习】 零基础介绍卷积神经网络(CNN)

CNN学习 零基础介绍写个CNN最简单的代码一. 概述二. 搭建CNN1. 输入层2. 卷积层3. 激活层4. 池化层5. 全连接层6. 网络搭建小结7. 损失函数8. 梯度下降9. 反向传播10. 模型评估与正则化11. 尝试搭建自己的第一个CNN 三. 经典CNN结构四. 猫狗识别项目实践1. Paddle实现版本&…

Leetcode打卡:找到稳定山的下标

执行结果&#xff1a;通过 题目&#xff1a; 3258 找到稳定山的下标 有 n 座山排成一列&#xff0c;每座山都有一个高度。给你一个整数数组 height &#xff0c;其中 height[i] 表示第 i 座山的高度&#xff0c;再给你一个整数 threshold 。 对于下标不为 0 的一座山&#xf…

leetcode刷题日记03——javascript

题目3&#xff1a; 回文数https://leetcode.cn/problems/palindrome-number/ 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向…

服务器数据恢复—RAIDZ离线硬盘数超过热备盘数导致阵列崩溃的数据恢复案例

服务器存储数据恢复环境&#xff1a; ZFS Storage 7320存储阵列中有32块硬盘。32块硬盘分为4组&#xff0c;每组8块硬盘&#xff0c;共组建了3组RAIDZ&#xff0c;每组raid都配置了热备盘。 服务器存储故障&#xff1a; 服务器存储运行过程中突然崩溃&#xff0c;排除人为误操…

Tact智能合约安全实践:TON生态系统中的常见错误

TON&#xff08;The Open Network&#xff09;以其创新特性和强大的智能合约性能&#xff0c;不断拓宽区块链技术的边界。基于早期的区块链平台&#xff08;如以太坊等&#xff09;的经验与教训&#xff0c;TON为开发者提供了一个更加高效且灵活的开发环境。其中推动这一进步的…

C进阶—指针(1)

若是阁下满意的话&#xff0c;可否一键三连呢&#xff01; 第一篇进阶指针就是先了解各种新的概念&#xff08;用法我们后面几篇再详细说&#xff01;先只介绍概念&#xff09;&#xff0c;有疑惑很正常&#xff0c;只是暂时的&#xff0c;我们一起来看看吧&#xff01; 字符指…

【Python使用】嘿马头条项目从到完整开发教程第9篇:缓存,1 缓存穿透【附代码文档】

本教程的知识点为:简介 1. 内容 2. 目标 产品效果 ToutiaoWeb虚拟机使用说明 数据库 理解ORM 作用 思考&#xff1a; 使用ORM的方式选择 数据库 SQLAlchemy操作 1 新增 2 查询 all() 数据库 分布式ID 1 方案选择 2 头条 使用雪花算法 &#xff08;代码 toutiao-backend/common/…

谷歌浏览器的扩展程序自动更新设置

谷歌浏览器是全球最受欢迎的网络浏览器之一&#xff0c;其扩展程序更是为用户提供了丰富的功能。然而&#xff0c;随着时间的推移&#xff0c;扩展程序需要更新以修复漏洞、提升性能或增加新功能。本文将详细介绍如何在Chrome中设置扩展程序的自动更新。&#xff08;本文由http…

LabVIEW与PLC点位控制及OPC通讯

在工业自动化中&#xff0c;PLC通过标准协议&#xff08;如Modbus、Ethernet/IP等&#xff09;与OPC Server进行数据交换&#xff0c;LabVIEW作为上位机通过OPC客户端读取PLC的数据并进行监控、控制与处理。通过这种方式&#xff0c;LabVIEW能够实现与PLC的实时通信&#xff0c…

在Windows Server路由和远程访问服务中启用L2TP/IPsec VPN

背景 路由和远程访问服务&#xff08;Routing and Remote Access Services&#xff0c;RRAS&#xff09;是Windows Server上的一个角色&#xff0c;包含很多功能&#xff0c;可以用来搭建VPN。然而&#xff0c;在什么也不做的初始配置中&#xff0c;它只允许PPTP协议连接。然而…

Android简洁缩放Matrix实现图像马赛克,Kotlin

Android简洁缩放Matrix实现图像马赛克&#xff0c;Kotlin 原理&#xff0c;通过Matrix把一个原图缩小到原先的1/n&#xff0c;然后再把缩小后的小图放大n倍&#xff0c;自然就是马赛克效果&#xff08;相当于是放大后像素“糊”成一片了&#xff09;。 import android.content.…

《Posterior Collapse and Latent Variable Non-identifiability》

看起来像一篇很有用的paper&#xff0c;而且还是23年的 没看完 后边看不懂了 Abstract 现有的解释通常将后验崩塌归因于由于变分近似而使用神经网络或优化问题。 而本文认为后验崩塌是潜在变量不可识别性的问题(a problem of latent variable non-identifiability) 本文证明了…

网络视频监控平台/安防监控/视频综合管理Liveweb视频汇聚平台解决方案

一、当前现状分析 当前视频资源面临以下问题&#xff1a; 1&#xff09;不同单位在视频平台建设中以所属领域为单位&#xff0c;设备品牌众多&#xff0c;存在的标准不一&#xff0c;各系统之间也没有统一标准&#xff1b; 2&#xff09;各单位视频平台建设分散、统筹性差&am…

【前端爬虫】关于如何获取自己的请求头信息(user-agent和cookie)

注意&#xff1a;由于user-agent和cookie中保存了部分账户信息&#xff0c;所以一定不要随意泄露给他人&#xff01;&#xff01;&#xff01; 1.首先打开某个页面&#xff0c;点击键盘的F12键进入控制台&#xff0c;或者鼠标右键页面选择打开控制台 2.然后点击控制台上方的网…

共创共建!葡萄城 SpreadJS 完成 HarmonyOS NEXT 操作系统兼容认证

最新技术资源&#xff08;建议收藏&#xff09; https://www.grapecity.com.cn/resources/ 近日&#xff0c;华为“企业工作必备应用鸿蒙化论坛”在北京圆满落幕&#xff0c;论坛汇聚了众多行业精英和合作伙伴&#xff0c;聚焦讨论企业数字化转型与原生鸿蒙生态融合等话题。葡萄…

单项链表的学习

1:链表概念 链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 1&#xff1a;结点 与顺序表不同的是&#xff0c;链表⾥的每节"⻋厢"都是独⽴申请下来的空间&#xff0c;我们称之为“结点 / 结…

基于大语言模型的多代理下一代制造系统能灵活动态管理制造资源的高效调度方法

摘要 论文地址&#xff1a;https://arxiv.org/pdf/2405.16887 随着生产率的提高&#xff0c;客户对多品种、小批量生产的需求也在不断增加&#xff0c;这反过来又对制造系统提出了更高的要求。由于这种需求&#xff0c;当生产任务频繁变化时&#xff0c;传统的制造系统往往无法…