【云原生】Kubernetes 中的 PV 和 PVC 介绍、原理、用法及实战案例分析

news2024/11/15 5:04:34

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生k8s,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:云原生K8S,零基础到进阶实战
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • Kubernetes 中的 PV 和 PVC 介绍、原理、用法及实战案例分析
    • 介绍
      • PV(Persistent Volume)
      • PVC(Persistent Volume Claim)
    • 原理
    • 用法
      • 创建 PV
      • 创建 PVC
      • 将 PVC 与 Pod 关联
    • 实战案例分析
      • 案例:部署 WordPress 应用程序
        • 步骤 1:创建 PV
        • 步骤 2:创建 PVC
        • 步骤 3:部署 WordPress 应用
        • 步骤 4:验证部署
        • 步骤 5:扩展和维护
          • 扩展存储
          • 备份和恢复
          • 监控和日志
        • 步骤 6:更新和升级
      • 总结

Kubernetes 中的 PV 和 PVC 介绍、原理、用法及实战案例分析

介绍

在 Kubernetes(k8s)中,管理存储资源是确保应用持久性和可靠性的关键部分。PersistentVolume(PV)和PersistentVolumeClaim(PVC)是 Kubernetes 中用于存储资源管理的两个核心概念。它们提供了一种机制,允许 Pod 访问独立于其生命周期的存储资源,从而实现了数据的持久化。

PV(Persistent Volume)

PV 是 Kubernetes 集群中的一块网络存储,它独立于 Pod 存在,可以作为各种存储系统的抽象,如 NFS、iSCSI、云提供商的存储(如 AWS EBS、GCP Persistent Disks、Azure Disk Storage)等。PV 由管理员预先创建并配置,包括容量、访问模式(ReadWriteOnce、ReadOnlyMany、ReadWriteMany)和回收策略等。PV 的生命周期包括可用(Available)、绑定(Bound)、释放(Released)和回收(Retained)等状态。

PVC(Persistent Volume Claim)

PVC 是用户对 PV 的存储请求,它定义了 Pod 对存储资源的需求。用户通过 PVC 声明所需的存储容量和访问模式,而不需要关心具体的 PV 细节。当 PVC 被创建时,Kubernetes 会尝试将其与满足其要求的 PV 进行绑定。如果集群中没有可用的 PV,且 PVC 定义了 StorageClass,则 Kubernetes 可以动态地创建一个新的 PV 来满足 PVC 的需求。

原理

PV 和 PVC 的工作原理主要基于动态匹配和绑定机制。这种机制使得 Pod 与存储资源的具体实现解耦,提高了灵活性和可移植性。

  1. 静态供应:管理员手动创建 PV,用户通过 PVC 声明对存储资源的需求。Kubernetes 会根据 PVC 的标签选择器和 PV 的标签进行匹配,将满足条件的 PV 绑定到 PVC。

  2. 动态供应:当用户通过 PVC 请求存储资源时,如果集群中没有现成的 PV 可用,且 PVC 定义了 StorageClass,Kubernetes 会根据 StorageClass 的配置动态创建一个新的 PV,并将其绑定到 PVC。

这种机制使得存储资源的管理更加灵活和高效,减少了手动干预的需要。

用法

创建 PV

管理员可以通过 YAML 文件创建 PV。以下是一个简单的 PV 创建示例,它定义了一个 1GB 大小的 NFS 存储卷:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: example-pv
spec:
  capacity:
    storage: 1Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /path/to/nfs/volume
    server: nfs-server-ip

创建 PVC

用户通过 PVC 声明对存储资源的需求。以下是一个 PVC 创建示例,它请求 1GB 大小的存储资源,并指定了 ReadWriteOnce 访问模式:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: example-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

将 PVC 与 Pod 关联

在 Pod 的定义中,可以将 PVC 与 Pod 关联起来,以便 Pod 可以访问 PVC 绑定的 PV 提供的存储资源。以下是一个 Pod 定义的示例,它将 PVC 挂载到 Pod 的 /data 目录:

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
    - name: example-container
      image: nginx
      volumeMounts:
        - name: data
          mountPath: /data
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: example-pvc

实战案例分析

案例:部署 WordPress 应用程序

假设我们想要在 Kubernetes 集群中部署一个 WordPress 应用程序,并希望 WordPress 的数据持久化存储在一个持久卷中。

步骤 1:创建 PV

首先,我们创建一个 PV,用于存储 WordPress 的数据。这里我们使用 hostPath 来定义一个本地存储的 PV:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: wordpress-pv
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /mnt/data
步骤 2:创建 PVC

然后,我们创建一个 PVC,声明对 PV 的需求:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wordpress-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:requests:
      storage: 5Gi
步骤 3:部署 WordPress 应用

接下来,我们部署 WordPress 应用,并将其 PVC 挂载到 Pod 的适当位置,以便存储数据库和媒体文件。这里我们使用 Helm 或者直接编写 Deployment 和 Service 的 YAML 文件来部署 WordPress 和 MySQL。

假设我们使用 Helm,则首先需要添加一个 WordPress 的 Helm 仓库(如果尚未添加),然后安装 WordPress 图表,并指定 PVC 作为存储选项。

helm repo add bitnami https://charts.bitnami.com/bitnami
helm install my-wordpress bitnami/wordpress \
  --set persistence.enabled=true \
  --set persistence.existingClaim=wordpress-pvc

在这个 Helm 命令中,--set persistence.enabled=true 启用了持久化存储,--set persistence.existingClaim=wordpress-pvc 指定了现有的 PVC(即 wordpress-pvc)用于存储 WordPress 的数据。

步骤 4:验证部署

部署完成后,你可以通过 Kubernetes Dashboard 或者使用 kubectl 命令来检查 Pod、Service 和 PVC 的状态,确保一切正常运行。

kubectl get pods
kubectl get pvc
kubectl get svc

通过访问 WordPress 服务的外部 IP 地址或域名(如果你配置了 Ingress 或 LoadBalancer),你应该能够访问到你的 WordPress 网站,并看到它正常运行,同时数据存储在指定的 PV 中。

步骤 5:扩展和维护
扩展存储

随着 WordPress 应用程序的使用和数据量的增长,你可能需要扩展存储容量。对于静态供应的 PV,这通常意味着你需要手动创建一个新的、更大容量的 PV,并将应用程序迁移到新的 PV 上。然而,这通常是一个复杂且易出错的过程。

对于动态供应的 PV,情况要好得多。你可以通过修改 PVC 的请求大小来触发存储的动态扩展(如果底层存储系统支持在线扩展)。不过,需要注意的是,并非所有存储系统都支持在线扩展,而且即使支持,也需要确保 Kubernetes 集群和存储系统都正确配置以支持这一功能。

备份和恢复

为了保障数据的安全性,定期备份 WordPress 的数据是非常重要的。你可以使用 Kubernetes 的备份工具(如 Velero)来定期备份 PVC 关联的数据卷。Velero 可以与各种存储系统一起工作,提供灵活的数据备份和恢复选项。

在需要恢复数据时,你可以使用 Velero 或其他备份工具将备份的数据恢复到指定的 PVC 中。这通常涉及到创建一个新的 PVC(如果原始 PVC 已删除或损坏),然后将备份数据恢复到该 PVC 关联的数据卷中。

监控和日志

为了保持 WordPress 应用程序的稳定性和性能,监控和日志记录也是必不可少的。你可以使用 Kubernetes 的监控工具(如 Prometheus 和 Grafana)来监控 Pod、Service 和 PVC 的状态,以及资源使用情况(如 CPU、内存和存储)。

同时,确保 WordPress 应用程序和 MySQL 数据库都配置了适当的日志记录级别,以便在出现问题时能够快速定位和解决问题。

步骤 6:更新和升级

随着 WordPress 和其依赖项(如 MySQL)的更新和升级,你可能需要定期更新你的应用程序以利用新功能和安全修复。

如果你使用 Helm 部署了 WordPress,那么更新和升级通常会比较简单。你可以使用 Helm 的 upgrade 命令来更新到新的 Helm 图表版本,或者修改现有的 Helm 图表配置以应用更改。

然而,在更新和升级之前,请务必备份你的数据和配置,以便在出现问题时能够恢复到更新之前的状态。

总结

通过本实战案例分析,我们不仅展示了如何在 Kubernetes 中使用 PV 和 PVC 来部署一个持久化存储的 WordPress 应用程序,还讨论了扩展存储、备份和恢复、监控和日志记录以及更新和升级等关键方面。这些步骤和最佳实践将帮助你更好地管理 Kubernetes 中的存储资源,并确保你的应用程序能够稳定运行并满足业务需求。

记住,Kubernetes 的强大之处在于其灵活性和可扩展性。通过充分利用 PV 和 PVC 以及其他 Kubernetes 功能,你可以构建出高度可靠、可扩展和可维护的应用程序架构。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CRM客户管理系统是什么?如何利用CRM盘活老客户?

人与人之间的差距,不仅在于业务能力的高低,更在于如何高效地管理客户、建立深厚的客户关系。在这个“内卷化”严重的时代,借助工具来管理客户成为必不可少的流程。如果你保持怀疑态度,那我们先来聊聊。 客户管理是什么&#xff1…

HormonyOs之 路由简单跳转

Navigation路由相关的操作都是基于页面栈NavPathStack提供的方法进行,每个Navigation都需要创建并传入一个NavPathStack对象,用于管理页面。主要涉及页面跳转、页面返回、页面替换、页面删除、参数获取、路由拦截等功能。 Entry Component struct Index …

探索 Electron:快捷键与剪切板操作

Electron是一个开源的桌面应用程序开发框架,它允许开发者使用Web技术(如 HTML、CSS 和 JavaScript)构建跨平台的桌面应用程序,它的出现极大地简化了桌面应用程序的开发流程,让更多的开发者能够利用已有的 Web 开发技能…

Mysql9安装

目录 一、下载mysql 二、安装 三、配置mysql环境变量 四、mysql初始化和启动 1.以管理员身份运行cmd 2.cd到mysql的安装目录 3.初始化mysql的数据库 4.为Windows系统安装MySQL服务 5.查看一下名为mysql的服务: 6.启动MySQL服务 五、附录 1.系统变量还在&…

grafana对接zabbix数据展示

目录 1、初始化、安装grafana 2、浏览器访问 3、安装zabbix 4、zabbix数据对接grafana 5、如何导入模板? ① 设置键值 ② 在zabbix web端完成自定义监控项 ③ garafana里添加nginx上面的的三个监控项 6、如何自定义监控项? 以下实验沿用上一篇z…

arm环境下构建Flink的Docker镜像

准备工作 资源准备 按需下载 flink,我的是1.17.2版本。官方说1.13版本之后的安装包兼容了arm架构,所以直接下载就行。 如需要cdc组件,提前下载好。 服务器准备 可在某云上购买arm服务器,2c/4g即可,按量付费。 带宽…

2024datawhale电力需求预测挑战赛

电力需求预测挑战赛 比赛链接:https://challenge.xfyun.cn/topic/info?typeelectricity-demand&optionssgy&chdw24_uGS8Gs 学习链接:https://datawhaler.feishu.cn/wiki/CuhBw9vBaiG1nJklIPkcRhqVnmk 一句话介绍赛题任务可以这样理解赛题&am…

【Vue实战教程】之Vuex状态管理详解

Vuex状态管理 1 Vuex简介 1.1 什么是Vuex Vuex是一个专为Vue.js应用程序开发的状态管理工具。它采用了集中式存储管理应用的所有的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 简单来说,Vuex是一个适用于在Vue项目开发时使用的状态管理…

Nginx反向代理概述

正向代理与反向代理概述 正向代理: 定义:正向代理位于客户端和目标服务器之间,客户端的请求首先发送到代理服务器,然后由代理服务器转发到目标服务器,最后将目标服务器的响应返回给客户端。 作用:正向代理…

逻辑回归推导

逻辑回归既可以看作是回归算法,也可以看做是分类算法。通常作为分类算法使用,只可以解决二分类问题。 在上述平面中,每个颜色代表一个类别,即有4个类别 将红色的做为一个类别,其他三个类别都统称为其他类别&#xff0…

javascript 的上下文与作用域

目录 1. 初步了解 上下文(context)2. 全局上下文(global context)3. 上下文栈 (context stack)4. 作用域链( scope chain)5. 作用域(scope)6. 作用域链增强7. 变量声明7.1 var 声明变量7.2 let 声明变量7.3 const 常量声明 8. 标识符查找总结 带着疑问去…

D3.高精度

1.分类情况 AB、A-B、A*a、A/b A和B指的是超大超长整数&#xff0c;长度<1e6; a的值<10000&#xff1b; 2.大整数的存储 int 变量肯定是存不了这么大的数的&#xff0c;做法是将大整数先存到string字符串&#xff0c;再使用字符串的访问方式&#xff0c;将每一位数存到…

C++树形结构(3 树的中心、重心)

目录 一.树的中心&#xff1a; 1.树的概念&#xff1a; 2.树的性质&#xff1a; 性质1&#xff1a; 性质2&#xff1a; 3.树的中心求解&#xff1a; 4.例题&#xff1a; 二.树的重心&#xff1a; 1.基础概念&#xff1a; 2.求解方法&#xff1a; 3.例题&#xff1a;…

运筹学笔记

计算的时间问题&#xff01;计算机解决了计算量的问题&#xff01; 计算机的发展对运筹学研究起到了极大的促进作用。 运筹学的一个特征之一是它常常会考虑寻求问题模型的最佳解决方案&#xff08;称为最优解&#xff09;。 没有人能成为运筹学所有方面的专家。 分析学越来越流…

反弹shell的方式——之NC反弹shell

反弹shell是指在攻击机监听某个端口&#xff0c;然后通过目标连接攻击机监听的端口&#xff0c;在攻击机反弹得到目标机的shell。通常在目标网络有防火墙或者其他因素限制&#xff0c;导致无法持续控制目标&#xff0c;或者执行命令受阻等情况时需要进行反弹shell 常见的反弹s…

Null和 Undefined 两者区别?

1、 Undefined 和 null 的 区 别 首 先 Undefined 和 Null 都 是 基 本 数 据 类 型 &#xff0c; 这 两 个 基 本 数 据 类 型 分 别 都 只 有 一 个 值 &#xff0c; 就 是 undefined 和 null。 2、undefined 代 表 的 含 义 是 未 定 义 &#xff0c; null 代 表 的 含 义 …

Python Flask入门到精通:详细教程和实战案例

前言 Flask是一个轻量级的Web框架&#xff0c;用于快速开发Web应用程序。它的设计理念是简洁、灵活和易于扩展&#xff0c;非常适合于从简单的单页应用到复杂的大型项目。通过Flask&#xff0c;可以创建各种Web应用程序&#xff0c;比如博客、电子商务网站、RESTful API等。 …

META 备受期待的 Llama 3 405B 即将发布

本心、输入输出、结果 文章目录 META 备受期待的 Llama 3 405B 即将发布前言Llama 3 405B或许会彻底改变专用模型的数据质量Llama 3 405B将形成新的模型生态系统:从基础模型到专家组合Llama 3 405B有最高效 API 的竞争Llama 3 405B 基准测试META 备受期待的 Llama 3 405B 即将…

韦东山嵌入式linux系列-具体单板的按键驱动程序(查询方式)

1 GPIO 操作回顾 &#xff08;1&#xff09;使能模块&#xff1b; &#xff08;2&#xff09;设置引脚的模式&#xff08;工作于GPIO模式&#xff09;&#xff1b; &#xff08;3&#xff09;设置GPIO本身&#xff08;输入/输出&#xff09;&#xff1b; &#xff08;4&…

Linux_make/Makefile的理解

1.make是一个命令&#xff0c;makefile是一个文件, 依赖关系和依赖方法. a.快速使用一下 i.创建一个Makefile文件(首字母也可以小写) b.依赖关系和依赖方法 i.依赖关系: 我为什么要帮你? mybin:mytest.c ii.依赖方法: 怎么帮? gcc -o mybin mytest.c make之前要注意先创建…