一文读懂K8S的PV和PVC以及实践攻略
一文读懂K8S的PV和PVC以及实践攻略
Kubernetes(K8S)作为当前云原生和微服务架构的首选平台,凭借其强大的容器编排和管理能力,迅速成为一线大厂分布式平台的标配技术。在Kubernetes中,持久化存储是一个核心问题,特别是对于需要持久化数据的应用来说。为了实现数据的持久化存储,Kubernetes引入了持久卷(PersistentVolume, PV)和持久卷声明(PersistentVolumeClaim, PVC)这两个重要概念。本文将从概念、原理到实践攻略,详细解析K8S中的PV和PVC。
一、概念解析
1. 持久卷(PersistentVolume, PV)
PV是Kubernetes集群中的一块网络存储,它独立于Pod存在,可以被多个Pod共享或独占。PV可以被视为集群级别的资源,用于存储Pod产生的数据。PV可以是各种存储系统,如云提供商的存储、NFS、iSCSI、本地存储等。PV由管理员创建,并配置其细节,如容量、访问模式(ReadWriteOnce、ReadOnlyMany、ReadWriteMany)、存储类别等。
- 容量:指定PV的存储容量。
- 访问模式:指定PV的访问模式,ReadWriteOnce表示一次只能一个Pod写入,ReadOnlyMany表示多个Pod可以同时读取但不能写入,ReadWriteMany表示多个Pod可以同时读写。
- 存储类别:指定PV的存储类别,用于动态创建PV时选择存储后端。
PV有自己的生命周期,包括可用(Available)、绑定(Bound)、释放(Released)、回收(Retained)等状态。当PV被PVC绑定后,其状态变为Bound,直到PVC被删除或释放后,PV的状态才会变为Available或Retained(根据回收策略)。
2. 持久卷声明(PersistentVolumeClaim, PVC)
PVC是用户对持久存储的请求声明,它定义了Pod对存储的需求。PVC可以指定所需的存储容量、访问模式等参数,但通常不需要指定具体的PV,而是通过标签选择器来动态匹配PV。PVC的存在使得Pod与具体的存储实现解耦,提高了可移植性。
- 存储容量:指定PVC所需的存储容量。
- 访问模式:指定PVC的访问模式,与PV的访问模式相匹配。
- 存储类别:指定PVC所需的存储类别,用于动态创建PV时选择存储后端。
- 标签选择器:用于动态匹配PV的标签。
PVC与PV之间是一种声明与提供的关系。PVC声明了对存储资源的需求,而PV则是提供这些资源的实际载体。当PVC被创建时,Kubernetes会尝试将其与满足其要求的PV进行绑定。匹配的过程是根据PVC的标签选择器和PV的标签进行匹配,只有匹配成功的PV才能被绑定到PVC。一旦绑定成功,Pod可以通过PVC访问PV提供的存储资源。如果没有合适的PV可以绑定,PVC将处于Pending状态,直到有合适的PV可用为止。
二、原理解析
PV和PVC的设计实现了Pod与存储资源的解耦,使得Pod可以独立于存储资源的变化而运行。这种设计提高了系统的灵活性和可移植性。
- 动态匹配与绑定:PVC声明了对持久卷的需求,而PV则提供了实际的存储资源。Kubernetes会自动将PVC与合适的PV进行匹配和绑定。这种动态匹配机制使得用户无需关心具体的PV细节,只需声明对存储资源的需求即可。
- 按需分配:通过PVC,可以实现存储资源的按需分配。用户可以根据应用的需求动态申请存储资源,而无需提前准备或分配存储资源。这种按需分配机制提高了资源利用率和系统的可扩展性。
- 生命周期管理:PV和PVC的生命周期管理由Kubernetes负责,包括资源的创建、绑定、使用和回收等阶段。这种生命周期管理机制确保了存储资源的有效使用和回收。
三、实践攻略
1. 实验准备
在进行PV和PVC的实践之前,需要做好以下准备工作:
- 搭建Kubernetes集群。
- 安装NFS Server作为后端存储。
- 配置NFS Server的共享目录和权限。
2. 部署NFS Server
以Ubuntu 22.04为例,安装和配置NFS Server的步骤如下:
sudo apt install -y nfs-kernel-server nfs-common
sudo mkdir -p /ssd/data
sudo chown nobody:nogroup /ssd/data
sudo chmod 777 /ssd/data
sudo nano /etc/exports
在/etc/exports
文件中添加以下内容:
/ssd/data *(rw,sync)
然后重启NFS服务:
sudo systemctl enable nfs-server
sudo systemctl restart nfs-server
检查NFS配置:
sudo exportfs -rv
3. 创建PV
使用YAML文件创建PV的示例如下:
apiVersion: v1
kind: PersistentVolume
metadata:name: example-pv
spec:capacity:storage: 1GivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retainnfs:path: /ssd/dataserver: nfs-server-ip
将上述YAML文件保存为example-pv.yaml
,并使用以下命令创建PV:
kubectl apply -f example-pv.yaml
4. 创建PVC
使用YAML文件创建PVC的示例如下:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: example-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 1Gi
将上述YAML文件保存为example-pvc.yaml
,并使用以下命令创建PVC:
kubectl apply -f example-pvc.yaml
创建PVC后,Kubernetes会自动将其与满足要求的PV进行绑定。可以使用以下命令查看PV和PVC的状态:
kubectl get pv
kubectl get pvc
5. 创建Pod并挂载PVC
使用YAML文件创建Pod并挂载PVC的示例如下:
apiVersion: v1
kind: Pod
metadata:name: example-pod
spec:containers:- name: example-containerimage: nginxvolumeMounts:- name: datamountPath: /datavolumes:- name: datapersistentVolumeClaim:claimName: example-pvc
将上述YAML文件保存为example-pod.yaml
,并使用以下命令创建Pod:
kubectl apply -f example-pod.yaml
创建Pod后,可以使用以下命令查看Pod的状态和日志:
kubectl get pods
kubectl logs example-pod
此时,Pod已经成功挂载了PVC,并可以通过PVC访问PV提供的存储资源。可以在/data
目录下读写数据,这些数据将持久化存储在NFS Server的/ssd/data
目录中。
四、总结与展望
PV和PVC是Kubernetes中实现数据持久化存储的核心组件。它们通过动态匹配和绑定的方式,实现了Pod与存储资源的解耦和按需分配,从而提高了资源利用率和系统的稳定性、可靠性。未来,随着Kubernetes生态的不断发展和完善,PV和PVC的功能和性能将会得到进一步的提升和优化。例如,可能会引入更多的存储后端和访问模式;可能会优化动态匹配和绑定的算法;可能会提供更多的监控和管理工具等。总之,PV和PVC作为Kubernetes中的重要特性,将为云原生和微服务架构下的数据存储提供更加强大和灵活的支持。
相关文章:

一文读懂K8S的PV和PVC以及实践攻略
一文读懂K8S的PV和PVC以及实践攻略 Kubernetes(K8S)作为当前云原生和微服务架构的首选平台,凭借其强大的容器编排和管理能力,迅速成为一线大厂分布式平台的标配技术。在Kubernetes中,持久化存储是一个核心问题&#x…...

在react-native中如何获取View的漏出比例和漏出时间
写在前面 最近在项目中遇到了一个这样的需求:给一个模块做埋点,要求埋点的触发时机是当模块露出50%且停留300毫秒才进行上报 开搞 首先要有一个View <View></View>然后在View里定义一个ref <View ref { viewRef }></View>然…...

谷歌新安装包文件形式 .aab 在UE4中的打包原理
摘要 本文学习了aab的基本概念以及UE4中产生aab的构建原理。 从官网了解基本概念 官网:Android Developers 1、什么是aab? .aab包形如: 2021年7月,在Google Play应用程序中,已经有数千个应用程序率先跟进了AAB格式。…...

昂首平台:多货币专家顾问助力投资者优化外汇投资
昂首平台推出的多货币专家顾问(EA)为投资者提供了多样化的货币对交易选择。考虑到外汇市场的复杂性,大多数EA系统专注于价差较低的主要货币对,如EUR/USD或GBP/USD。交易那些价差较大的非主流货币对,如EUR/JPY和AUD/CAD,可能会增加…...

Go标准库runtime.MemStats
在 Go 语言中,runtime.MemStats 是一个结构体,它提供了关于 Go 程序内存使用情况的统计信息。这个结构体是 runtime 包中的 MemStats 类型,它包含了多个字段,用于报告内存分配器的统计数据,如内存分配、释放、垃圾回收…...

MAC 电脑Office power point编辑的时候,显示“某些字体无法随演示文稿一起保存,仍然要保存演示文稿吗?”
目录 问题描述: 问题解决: 问题描述: 在使用mac电脑的power point打开别人的.ppt文件之后,在保存的时候,弹出““某些字体无法随演示文稿一起保存,仍然要保存演示文稿吗?”,每次只…...

R语言机器学习算法实战系列(四)随机森林算法+SHAP值 (Random Forest)
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍教程下载数据加载R包导入数据数据预处理数据描述特征选择数据切割调节参数构建模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC CurvePRC Curve特征的重要性模型解释保…...

用柔性神经k-Opt学习搜索路径问题的可行和不可行区域(未完,先看前驱文章L2S)
文章目录 Abstract1 IntroductionAbstract 介绍了一种名为 Neural k-Opt(NeuOpt)的新型学习搜索(L2S)求解器,用于解决路径问题。它学习执行基于定制的动作分解方法和定制的循环双流(Recurrent Dual-Stream)解码器的灵活 k-opt 交换。 作为一项开创性的工作,我们绕过了…...

【升华】人工智能python重要库scikit-learn学习
一、人工智能python重要库scikit-learn 在人工智能10大算法中,有8个算法都导入了 sklearn库 from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn import metrics # 导入所需的库 from sklea…...

Stable Diffusion Web UI 大白话术语解释 (二)
归纳整理,Stable Diffusion Web UI 使用过程中,相关术语 ControlNet ControlNet 说简单点,就是你可以给 AI 一些“规则”,比如让它根据某些线条、结构或者骨架去画图。 这样能让 AI 画出更符合你要求的图片,特别适合画…...

vue-vben-admin 首页加载慢优化 升级vite2到vite3
我的vben-admin是2.8版本的,首次首页加载太慢了,升级下vite,原来1分钟,现在20s左右 1.修改package.json 添加 "terser": "^5.14.2",修改 "vitejs/plugin-legacy": "^2.0.0","vitejs/plugin-vue": "^3.0.1",&qu…...

集合框架07:LinkedList使用
1.视频链接:13.14 LinkedList使用_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1zD4y1Q7Fw?spm_id_from333.788.videopod.episodes&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5&p142.LinkedList集合的增删改查操作 package com.yundait.Demo01;im…...

一区鱼鹰优化算法+深度学习+注意力机制!OOA-TCN-LSTM-Attention多变量时间序列预测
一区鱼鹰优化算法深度学习注意力机制!OOA-TCN-LSTM-Attention多变量时间序列预测 目录 一区鱼鹰优化算法深度学习注意力机制!OOA-TCN-LSTM-Attention多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.基于OOA-TCN-LSTM-Attenti…...

Cesium 黑夜效果
Cesium 黑夜效果 原理: 根据相机到片元的距离雾化场景的后处理效果 效果:...

leetcode动态规划(二)-斐波那契数列
题目 509.斐波那契数列 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) F(n - 2)࿰…...

【MySQL】增删改查-进阶(一)
目录 🌴数据库约束 🚩约束类型 🚩NOT NULL 🚩UNIQUE 🚩DEFAULT 🚩PRIMARY KEY 🚩FOREIGN KEY 🚩CHECK 🎄表的设计 🚩一对一 🚩一对多 …...

MacOS RocketMQ安装
MacOS RocketMQ安装 文章目录 MacOS RocketMQ安装一、下载二、安装修改JVM参数启动关闭测试关闭测试测试收发消息运行自带的生产者测试类运行自带的消费者测试类参考博客:https://blog.csdn.net/zhiyikeji/article/details/140911649 一、下载 打开官网,…...

OpenCV高级图形用户界面(6)获取指定窗口中图像的矩形区域函数getWindowImageRect()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 提供窗口中图像的矩形区域。 该函数 getWindowImageRect 返回图像渲染区域的客户端屏幕坐标、宽度和高度。 函数原型 Rect cv::getWindowImage…...

SpringColoud GateWay 核心组件
优质博文:IT-BLOG-CN 【1】Route路由: Gateway的基本构建模块,它由ID、目标URL、断言集合和过滤器集合组成。如果聚合断言结果为真,则匹配到该路由。 Route路由-动态路由实现原理: 配置变化Apollo 服务地址实例变化…...

5.计算机网络_抓包工具wireshark
安装 Linux中安装wireshark: sudo apt-get install wireshark Linux中执行wireshark: sudo wireshark 使用 注意:只有与外网交互的数据才可以被wireshark抓到,本机回环的数据不会被抓到 实验内容: 使用nc命令…...

基于Java的车辆管理系统的设计与实现-计算机毕业设计源码41727
摘要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对车辆管理系统等问题,对车辆管理…...

在软件开发中低耦合和高内聚是什么,如何实现,请看文章
软件开发中,“低耦合”和“高内聚”是设计原则,用于提高系统的可维护性、可扩展性和可重用性。下面我会详细解释这两个概念及其带来的好处和规避的坏处。 低耦合(Low Coupling) 定义: 低耦合指的是模块之间的依赖关系…...

关于MyBatis-Plus 提供Wrappers.lambdaQuery()的方法
实例: private LambdaQueryWrapper<XXX> buildQueryWrapper(XXXBo bo) { Map<String, Object> params bo.getParams(); LambdaQueryWrapper<XXX> lqw Wrappers.lambdaQuery(); lqw.eq(bo.getOrgId() ! null, XXX::getOrgId, bo.getOrgId()); lq…...

C++——vector的了解与使用
目录 引言 vector容器的基本概念 1.功能 2.动态大小 3.动态扩展 vector的接口 1.vector的迭代器 2.vector的初始化与销毁 3.vector的容量操作 3.1 有效长度和容量大小 (1)使用示例 (2)扩容机制 3.2 有效长度和容量操作 (1)reserve (2)resize 4.vector的访问操作…...

Ubuntu设置静态IP地址
Ubuntu如果是最小安装,没有图形界面,需要配置静态IP,该怎么操作呢? Netplan 是最新版 Ubuntu 的默认网络管理工具。Netplan 的配置文件使用 YAML 编写,扩展名为 .yaml。 注意:配置文件中的空格是语法的一部…...

力扣349.两个数组的交集
题目链接:349. 两个数组的交集 - 力扣(LeetCode) 给定两个数组 nums1 和 nums2 ,返回 它们的 交集。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1: 输入:nums1 [1,2,…...

FreeRTOS - 软件定时器
在学习FreeRTOS过程中,结合韦东山-FreeRTOS手册和视频、野火-FreeRTOS内核实现与应用开发、及网上查找的其他资源,整理了该篇文章。如有内容理解不正确之处,欢迎大家指出,共同进步。 1. 软件定时器 软件定时器也可以完成两类事情…...

Python的Atlassian第三方库的详细介绍
atlassian-python-api 是一个用于与 Atlassian 生态系统进行交互的 Python 库,支持与多种 Atlassian 工具(如 Jira、Confluence、Bitbucket 等)进行 API 调用。它简化了 REST API 的调用,提供了高层次的抽象,方便开发者…...

Java中的基本循环结构详解
在Java编程中,循环是控制流的重要组成部分,用于重复执行一段代码。Java提供了三种基本的循环结构:for循环、while循环和do-while循环。本文将详细介绍这三种循环的语法和使用场景,并通过示例代码展示其应用。 一,for …...

关于Git Bash中如何定义alias
一、在一次临时Bash会话中使用alias 在Bash中直接输入alias xxdddd,xx为对应要执行的命令的缩写,dddd为要执行的命令,如alias ddcd /d,输入完成后,在Bash中输入dd,即可切换至D盘。 此种设置方式ÿ…...