Kubernetes中存储中有四个重要的概念:

Volume、PersistentVolume PV、PersistentVolumeClaim PVC、StorageClass

一、存储系统核心概念
  1. Volume(卷)

    • 定义:Kubernetes 中最基础的存储单元,用于将外部存储挂载到 Pod 中的容器。

    • 特点

      • 生命周期与 Pod 绑定(Pod 删除则 Volume 销毁,但部分类型如 PV 可持久化)。

      • 支持多种存储类型:本地存储(emptyDirhostPath)、网络存储(NFS、CephFS)、云存储(AWS EBS、GCE PD)等。

    • 典型用法

      yaml

      volumes:                   # 定义存储类型
      - name: datahostPath:path: /mnt/data
      volumeMounts:             # 挂载到容器路径
      - name: datamountPath: /app/data
  2. PersistentVolume(PV,持久卷)

    • 定义:集群级别的存储资源(如一块云磁盘、一个 Ceph RBD 镜像),由管理员预先创建。

    • 核心属性

      • capacity:存储容量(如 10Gi)。

      • accessModes:访问模式(单节点读写 ReadWriteOnce、多节点只读 ReadOnlyMany、多节点读写 ReadWriteMany)。

      • persistentVolumeReclaimPolicy:回收策略(保留 Retain、删除 Delete)。

    • 示例

      yaml

      apiVersion: v1
      kind: PersistentVolume
      metadata:name: ceph-pv
      spec:capacity: { storage: 10Gi }accessModes: [ReadWriteOnce]cephfs:monitors: ["ceph-mon:6789"]path: /datastorageClassName: ceph-storage
  3. PersistentVolumeClaim(PVC,持久卷声明)

    • 定义:用户对存储资源的“需求清单”,声明所需的存储大小、访问模式等,由 Kubernetes 自动绑定到匹配的 PV。

    • 核心属性

      • resources.requests.storage:请求的存储大小(如 5Gi)。

      • storageClassName:指定动态供给的存储类型。

    • 示例

      yaml

      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:name: app-data-pvc
      spec:accessModes: [ReadWriteOnce]resources:requests:storage: 5GistorageClassName: ceph-storage
  4. StorageClass(存储类)

    • 定义:动态供给的模板,定义如何按需创建 PV(例如自动创建云盘或 Ceph RBD 镜像)。

    • 核心属性

      • provisioner:存储驱动(如 kubernetes.io/aws-ebs)。

      • parameters:存储后端参数(如 Ceph 集群地址)。

    • 示例

      yaml

      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:name: ceph-rbd
      provisioner: kubernetes.io/rbd
      parameters:monitors: ceph-mon:6789adminId: adminpool: kube

1、工作流程对比
      静态供给:
管理员创建PV → 用户创建PVC → 系统绑定PV/PVC → Pod使用PVC
      动态供给:
用户创建PVC → StorageClass自动创建PV → 系统绑定 → Pod使用PVC

二、核心流程对比
  1. 静态 PV 工作流程

    • 步骤

      1. 管理员创建 PV(如 Ceph RBD 镜像)。

      2. 用户创建 PVC,声明存储需求。

      3. Kubernetes 将 PVC 绑定到匹配的 PV。

      4. Pod 挂载 PVC。

    • 痛点:需人工维护大量 PV,存储扩容需手动操作。

  2. 动态 PV 工作流程

    • 步骤

      1. 管理员创建 StorageClass(定义存储类型)。

      2. 用户创建 PVC,指定 StorageClass。

      3. Kubernetes 自动创建 PV 并绑定 PVC。

      4. Pod 挂载 PVC。

    • 优势:自动化创建存储资源,适合云环境弹性需求。

如果还不清晰,这里用租房子的比喻来解释这四个概念和两种供给模式,再配上实际流程,保证通俗易懂。

三、核心概念和流程比喻(通俗版):

想象你要租房子(需要存储空间):

  1. Volume (卷): 就像你最终拿到手的房子钥匙和门牌号。它定义了具体的存储位置(地址)和如何挂载到你的应用(Pod)里使用(钥匙)。Volume 是 Pod 的一部分配置。

  2. PersistentVolume (PV, 持久卷): 就像城市里可出租的实体房子资源。这些房子是由物业公司(集群管理员)提前建好(配置好)并登记在册的。每套房子(PV)有明确的属性:

    • 大小 (capacity): 比如 80 平米(100Gi)。

    • 访问规则 (accessModes): 是只能一个人住(单节点读写 ReadWriteOnce),还是可以很多人参观但不能住(多节点只读 ReadOnlyMany),或者可以合租(多节点读写 ReadWriteMany)。

    • 地段/特性 (storageClassName): 属于哪个小区、是公寓还是别墅(存储类型,比如 fast-ssdceph-rbd)。

    • 退租处理 (persistentVolumeReclaimPolicy): 租客退租后,房子是保留原样等人再租(Retain),还是清空重新装修(旧模式 Recycle,已基本不用),或是直接拆掉(Delete)。

  3. PersistentVolumeClaim (PVC, 持久卷声明): 就像你提交给租房中介的一份租房需求清单。你告诉中介(Kubernetes 系统):

    • 我要多大 (resources.requests.storage): 至少 60 平米(5Gi)。

    • 我要怎么用 (accessModes): 我一个人住要能做饭洗澡(ReadWriteOnce)。

    • 我想租哪种类型 (storageClassName): 我想要交通方便的公寓(比如 fast-ssd)。

  4. StorageClass (SC, 存储类): 就像一个高效的房屋建造和管理中介公司。它定义了:

    • 我们能提供什么类型的房子 (provisioner): 比如“快速公寓建造公司”(kubernetes.io/aws-ebs, kubernetes.io/gce-pdrbd.csi.ceph.com)。

    • 房子的默认配置 (parameters): 比如默认精装修、带电梯(存储后端的具体参数,如 Ceph 集群地址、池名)。

    • 我们的服务规则: 比如先签合同再建房(WaitForFirstConsumer,等 Pod 调度好再创建 PV),或者有现房(立即创建)。

它们之间的关系:

  • PVC 绑定 PV: 你的租房需求清单 (PVC) 会被中介 (Kubernetes) 拿去匹配现成的房子 (PV)。如果找到大小、类型、访问规则都满足的房子,就把这套房子分配给你(绑定)。Pod 不能直接租房子 (PV),必须通过你的需求清单 (PVC) 来租。

  • SC 动态创建 PV: 如果中介 (Kubernetes) 发现没有现成的房子 (PV) 能满足你的需求清单 (PVC),并且你的清单里指定了要找某个房屋建造中介公司 (StorageClass),那么中介公司 (SC) 就会立刻根据你的需求清单 (PVC) 自动建造一套新房子 (PV),然后中介 (Kubernetes) 再把这套新房分配给你 (绑定 PVC 和 PV)。

  • Pod 使用 Volume: 当你 (Pod) 要入住时,中介 (Kubernetes) 会告诉你具体的门牌号和给你钥匙 (Volume)。你 (Pod) 在配置里写明“我要用清单A对应的房子” (引用 PVC 名字),系统就会自动把对应的门牌号和钥匙 (Volume) 配置给你,你就可以搬进去住(把存储挂载到容器里指定路径)了。


静态供给流程 (管理员提前造好房子):

  1. 管理员造房 (创建 PV): 集群管理员像物业公司,提前在存储后端(如 NFS 服务器、Ceph 集群)准备好“房子”(存储空间),并在 Kubernetes 里创建 PersistentVolume (PV) 对象来描述这些房子(大小、访问模式、地址等)。

    • 例子: 管理员在 Ceph 里创建了一个 100GB 的 RBD 镜像 image-db,然后创建 PV:

      yaml

      apiVersion: v1
      kind: PersistentVolume
      metadata:name: pv-ceph-db-100g # 房子名字:Ceph数据库房100G
      spec:capacity:storage: 100Gi # 大小:100平米accessModes:- ReadWriteOnce # 访问规则:单租客可读写cephfs: # 或者 rbd: 取决于类型monitors:- 10.0.0.1:6789 # Ceph 监控地址path: /data/db # 具体路径 / 池和镜像名user: adminsecretRef:name: ceph-secretpersistentVolumeReclaimPolicy: Retain # 退租处理:保留原样storageClassName: ceph-slow # 地段/类型:Ceph普通盘区
  2. 用户提交需求 (创建 PVC): 开发者(用户)编写应用部署文件 (如 deployment.yaml),在里面声明需要一个 PersistentVolumeClaim (PVC)。

    • 例子: 应用需要 80GB 数据库存储,单节点读写。

      yaml

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:name: pvc-mysql-data # 我的需求清单名字:MySQL数据需求
      spec:accessModes:- ReadWriteOnce # 我要单租客可读写resources:requests:storage: 80Gi # 我要至少80平米storageClassName: ceph-slow # 我想租Ceph普通盘区的房子 (可选,如果指定必须匹配PV的class)
  3. 系统匹配房源 (绑定 PV & PVC): Kubernetes 系统(中介)看到 PVC 需求后,在现成的 PV(房子)里找:

    • 大小满足:PVC 要 80Gi,PV 有 100Gi (80 <= 100,满足)。

    • 访问模式匹配:都是 ReadWriteOnce

    • 存储类匹配:如果 PVC 指定了 ceph-slow,PV 也必须是 ceph-slow;如果 PVC 没指定,则匹配没有存储类或任意存储类的 PV(但通常建议明确指定)。

    • 找到后,系统将 PV 和 PVC 绑定 (Bound)。PV 的状态从 Available 变成 Bound

  4. 用户入住 (Pod 挂载 Volume): 用户创建 Pod(比如 MySQL 数据库 Pod)。在 Pod 的配置里:

    • 声明要使用哪个 PVC (pvc-mysql-data)。

    • 指定把存储挂载到容器里的哪个路径 (/var/lib/mysql)。

    yaml

    apiVersion: v1
    kind: Pod
    metadata:name: mysql-pod
    spec:containers:- name: mysqlimage: mysql:8.0volumeMounts:- name: mysql-storage # 给这个挂载起个名字mountPath: /var/lib/mysql # 容器内的挂载点volumes:- name: mysql-storage # 上面挂载名字对应的存储定义persistentVolumeClaim:claimName: pvc-mysql-data # 使用之前申请的PVC
  5. Pod 运行: Kubernetes 调度 Pod 到某个 Node 上运行。该 Node 上的 kubelet 组件负责:

    • 根据 PVC 找到已绑定的 PV。

    • 根据 PV 的描述(如 Ceph RBD),联系对应的存储系统(Ceph 集群),获取访问权限(挂载)。

    • 将存储挂载到 Node 上的一个临时目录。

    • 将这个临时目录映射(挂载)到 Pod 中容器指定的路径 (/var/lib/mysql)。

    • 应用启动,读写 /var/lib/mysql 就是在读写持久化的 Ceph 存储。

动态供给流程 (中介按需快速建新房):

  1. 管理员找中介公司 (创建 StorageClass): 集群管理员提前创建一个或多个 StorageClass (SC) 对象。这相当于引入了几家不同风格的房屋建造中介公司,每家公司专长不同(AWS EBS, GCP PD, Ceph RBD, NFS Provisioner 等)。

    • 例子: 创建一个负责快速建造 Ceph RBD “公寓”的中介公司:

      yaml

      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:name: ceph-rbd-fast # 中介公司名:Ceph快速公寓建造
      provisioner: rbd.csi.ceph.com # 建造公司类型:Ceph RBD CSI 驱动 (现代标准)
      parameters: # 建造公司的默认配置clusterID: my-ceph-cluster # Ceph集群IDpool: kube-pool-fast # 用哪个池建房imageFeatures: layering,exclusive-lock # 房子特性csi.storage.k8s.io/provisioner-secret-name: ceph-csi-secretcsi.storage.k8s.io/provisioner-secret-namespace: kube-system
      reclaimPolicy: Delete # 默认退租处理:拆掉房子 (可选 Retain)
      volumeBindingMode: WaitForFirstConsumer # 服务规则:等租客确定住哪再建房 (避免建错位置)
  2. 用户提交需求 (创建 PVC 并指定 SC): 开发者(用户)编写 PVC,这次明确指定要找哪家中介公司 (StorageClass) 来满足需求。

    • 例子: 应用需要 200GB 高速数据库存储,单节点读写,找 ceph-rbd-fast 公司建房。

      yaml

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:name: pvc-mongodb-data # 需求清单:MongoDB数据
      spec:accessModes:- ReadWriteOnceresources:requests:storage: 200Gi # 要200平米storageClassName: ceph-rbd-fast # 必须指定:找Ceph快速公寓建造公司!
  3. 中介公司立刻建房 (动态创建 PV): Kubernetes 系统(平台)看到 PVC 指定了 ceph-rbd-fast 这个 StorageClass。

    • 系统会调用 ceph-rbd-fast 这个 SC 里定义的 provisioner (Ceph RBD CSI 驱动)。

    • CSI 驱动收到指令:“按 PVC 要求(200Gi, RWO)建一套新房!”

    • CSI 驱动联系 Ceph 集群后端

      • 在指定的 kube-pool-fast 池里创建一个新的 RBD 镜像 (image),大小 200GB。

      • 在 Kubernetes 里自动创建一个对应的 PersistentVolume (PV) 对象来描述这个新建的 RBD 镜像。

    • 新建的 PV 的 storageClassName 自动设置为 ceph-rbd-fast

    • 系统自动将这个新建的 PV 与发起请求的 PVC 绑定 (Bound)。PVC 的状态直接变成 Bound

  4. 用户入住 (Pod 挂载 Volume): 和静态流程完全一样!用户创建 Pod,声明使用 PVC pvc-mongodb-data,并指定容器内的挂载点。Kubernetes 调度 Pod 并完成挂载。

核心区别总结:

特性静态供给 (Static Provisioning)动态供给 (Dynamic Provisioning)
PV 创建者管理员手动创建StorageClass (通过 Provisioner) 自动创建
创建时机在 PVC 出现之前 预先创建好 PV在 PVC 出现之后,响应 PVC 请求即时创建 PV
运维负担。管理员需预估需求,提前创建、管理大量 PV。。管理员只需配置好 StorageClass,PV 按需创建。
灵活性。扩容麻烦(需手动操作 PV 和存储后端)。。PVC 修改大小可能触发自动扩容(需存储后端和 SC 支持)。
适用场景存储需求固定、明确;特殊存储配置;不支持动态供给的存储。云环境、容器化平台主流方式;存储需求弹性大;追求自动化。
关键组件PV, PVCStorageClass, PVC, (自动创建的 PV)
比喻管理员提前建好一批毛坯房/精装房放在市场上。引入中介公司,用户提交需求单,中介按需快速建好精装房交付。

为什么动态供给是趋势?

  1. 自动化: 省去了管理员手动管理 PV 的巨大工作量。

  2. 按需分配: 避免资源闲置浪费(静态供给往往需要预先分配较大的 PV)。

  3. 敏捷性: 开发者只需关心 PVC 需求,无需等待管理员操作,加速应用部署。

  4. 云原生: 完美契合 Kubernetes 声明式 API 和弹性伸缩的理念。

作为小白,记住关键点:

  • Pod 用 Volume 访问存储。

  • 持久化存储要用 PV 和 PVC。

  • PV 是“房子”,PVC 是“租房需求单”。

  • 静态供给:管理员提前造好 PV (房子) 等 PVC (需求单) 来租。

  • 动态供给:PVC (需求单) 指定 StorageClass (中介公司),中介公司立刻造好 PV (房子) 并租给你。

  • 生产环境强烈推荐用动态供给!

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

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

相关文章

小白学Python,标准库篇——随机库、正则表达式库

一、随机库1.随机生成数值在random库中可以随机生成数值的方法有uniform()、random()、randint()、randrange()等。&#xff08;1&#xff09;uniform()方法uniform(参数1, 参数2)方法用于生成参数1到参数2之间的随机小数&#xff0c;其中参数的类型都为数值类型。示例代码&…

Qt窗口:菜单栏

目录 一、窗口预览 二、菜单栏 快捷键 子菜单 分割线 图标 内存泄露 一、窗口预览 在前面几篇文章中&#xff0c;或者说&#xff0c;Qt初学阶段&#xff0c;接触到的都是QWidget&#xff0c;QWidget指控件&#xff0c;往往作为一个窗口的一部分出现。所谓的窗口&#x…

STM32裸机开发(中断,轮询,状态机)与freeRTOS

裸机&#xff1a;没有操作系统&#xff0c;程序是单流程的&#xff08;比如一个大循环里依次执行各个功能&#xff0c;或者用中断嵌套处理事件&#xff09;。优点是资源占用极少&#xff08;几乎不占 RAM/Flash&#xff09;、执行流程直观&#xff1b;但复杂项目里&#xff0c;…

电脑上如何查看WiFi密码

打开控制面板>点击网络和Internet在查看网络和共享中心找到网络状态和任务点击进去点击连接的WLAN在WLAN状态中点击无线属性在无线网络属性中点击安全&#xff0c;点击显示字符&#xff08;H&#xff09;就可以显示密码了

文心一言4.5企业级部署实战:多模态能力与Docker容器化测评

随着大语言模型在企业服务中的应用日益广泛&#xff0c;如何选择一款既能满足多模态创作需求&#xff0c;又具备良好企业级适配性的AI模型成为了关键问题。文心一言4.5作为百度最新开源的大模型&#xff0c;不仅在传统的文本处理上表现出色&#xff0c;更是在多模态理解和企业级…

VUE Promise基础语法

目录 异步和同步 异步的问题 new Promise语法 promise的状态 promise.then() Promise.resolve() Promise.reject() Promise.all() Promise.race() Promise.catch() Promise.finally() 异步和同步 同步模式下&#xff0c;代码按顺序执行&#xff0c;前一条执行完毕后…

用TensorFlow进行逻辑回归(六)

import tensorflow as tfimport numpy as npfrom tensorflow.keras.datasets import mnistimport time# MNIST数据集参数num_classes 10 # 数字0到9, 10类num_features 784 # 28*28# 训练参数learning_rate 0.01training_steps 1000batch_size 256display_step 50# 预处…

【HTTP版本演变】

在浏览器中输入URL并按回车之后会发生什么1. 输入URL并解析输入URL后&#xff0c;浏览器会解析出协议、主机、端口、路径等信息&#xff0c;并构造一个HTTP请求&#xff08;浏览器会根据请求头判断是否又HTTP缓存&#xff0c;并根据是否有缓存决定从服务器获取资源还是使用缓存…

Android 16系统源码_窗口动画(一)窗口过渡动画层级图分析

一 窗口过渡动画 1.1 案例效果图1.2 案例源码 1.2.1 添加权限 (AndroidManifest.xml) <!-- 系统悬浮窗权限&#xff08;Android 6.0需动态请求&#xff09; --> <uses-permission android:name"android.permission.SYSTEM_ALERT_WINDOW" />1.2.2 窗口显示…

腾讯云WAF域名分级防护实战笔记

基于业务风险等级、合规要求及腾讯云最佳实践&#xff0c;提供可直接落地的配置方案&#xff0c;供学习借鉴&#xff1a;一、域名分级与防护原则1. ​域名分级清单&#xff08;核心资产&#xff09;​​​主域名​​业务类型​​风险等级​​合规要求​​防护等级​example.com…

1. 请说出你知道的水平垂直居中的方法

总结 容器 flex 布局&#xff0c;jsutify-content: center; align-items: center;容器 flex 布局&#xff0c;子项 margin: auto;容器 relative 布局&#xff0c;子项 absolute 布局&#xff0c;left: 50%; top: 50%; transform: translate(-50%, -50%);子项 absolute 布局&…

VS Code `launch.json` 完整配置指南:参数详解 + 配置实例

文章目录&#x1f4e6; 一、基本结构&#x1f50d; 二、单个配置项详解示例配置&#xff1a;&#x1f9e9; 三、字段说明与可选值&#x1f4c1; 四、常用变量&#xff08;宏替换&#xff09;&#x1f6e0;️ 五、常见配置实例1️⃣ 调试当前打开的 .py 文件2️⃣ 调试 Jupyter …

使用浏览器inspect调试wx小程序

edge://inspect/#devices调试wx小程序 背景&#xff1a; 在开发混合项目的过程中&#xff0c;常常需要在app环境排查问题&#xff0c;接口可以使用fiddler等工具来抓包&#xff0c;但是js错误就不好抓包了&#xff0c;这里介绍一种调试工具-浏览器。 调试过程 首先电脑打开edg…

【论文阅读】-《Simple Black-box Adversarial Attacks》

简单黑盒对抗攻击 Chuan Guo Jacob R. Gardner Yurong You Andrew Gordon Wilson Kilian Q. Weinberger 摘要 我们提出了一种在黑盒&#xff08;black-box&#xff09;场景下构建对抗样本&#xff08;adversarial images&#xff09;的极其简单的方法。与白盒&#xff08;…

基于ASP.NET+SQL Server实现(Web)企业进销存管理系统

企业进销存管理系统的设计和实现一、摘要进销存管理是现代企业生产经营中的重要环节&#xff0c;是完成企业资源配置的重要管理工作&#xff0c;对企业生产经营效率的最大化发挥着重要作用。本文以我国中小企业的进销存管理为研究对象&#xff0c;描述了企业进销存管理系统从需…

(LeetCode 面试经典 150 题 ) 15. 三数之和 (排序+双指针)

题目&#xff1a;15. 三数之和 思路&#xff1a;排序双指针&#xff0c;时间复杂度0(n^2nlogn)。 先将数组nums升序排序&#xff0c;方便去重和使用双指针。第一层for循环来枚举第一位数&#xff0c;后面使用双指针来找到第二个、第三个数即可&#xff0c;细节看注释。 C版本…

easy-springdoc

介绍 简化springdoc的使用&#xff08;可以搭配knife4j-openapi3-jakarta-spring-boot-starter一起使用&#xff09; maven引用 <dependency><groupId>io.github.xiaoyudeguang</groupId><artifactId>easy-springdoc</artifactId><version>…

配置nodejs,若依

1.配置node.js环境 Node.js — Download Node.js 1.下载好一路下一步&#xff0c;可以安装到d盘 装完之后执行 npm -v 显示版本号即安装成功 2.安装好后新建两个文件夹&#xff0c;node_cache和node_global 3.配置环境变量 新建变量 在path里编辑变量 4.配置用户变量 5.…

Python学习之路(十二)-开发和优化处理大数据量接口

文章目录一、接口设计原则二、性能优化策略1. 数据库优化2. 缓存机制3. 并发模型三、内存管理技巧1. 内存优化实践2. 避免内存泄漏四、接口测试与监控1. 性能测试2. 日志与监控3. 错误处理与限流五、代码示例&#xff08;Flask 流式处理&#xff09;六、部署建议一、接口设计原…

【实时Linux实战系列】实时数据流的网络传输

在实时系统中&#xff0c;数据流的实时传输是许多应用场景的核心需求之一。无论是工业自动化中的传感器数据、金融交易中的高频数据&#xff0c;还是多媒体应用中的视频流&#xff0c;都需要在严格的时间约束内完成数据的传输。实时数据流的传输不仅要求高吞吐量&#xff0c;还…