【K8S系列】深入解析K8S中PV 和PVC

2024-04-21 03:12

本文主要是介绍【K8S系列】深入解析K8S中PV 和PVC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在 Kubernetes 中,PV(持久卷)和 PVC(持久卷声明)之间的关系是一种动态匹配和绑定关系,用于实现 Pod 与存储资源的解耦。

一、概念介绍

1.1 PV(持久卷)

  • PV 是集群中的一块网络存储,它独立于 Pod 存在。PV 可以是各种存储系统,如云提供商的存储、NFS、iSCSI、本地存储等。
  • 管理员负责创建 PV,并配置其细节,如容量、访问模式(ReadWriteOnce、ReadOnlyMany、ReadWriteMany)、存储类别等。
  • PV 有自己的生命周期,它的状态包括可用(Available)、绑定(Bound)、释放(Released)、回收(Retained)等状态。

1.2 PVC(持久卷声明)

  • PVC 是对 PV 的请求,它定义了 Pod 对存储的需求。在创建 Pod 时,可以通过 PVC 来请求存储资源。
  • PVC 可以指定所需的存储容量、访问模式等参数,但通常不需要指定具体的 PV,而是通过标签选择器来动态匹配 PV。
  • PVC 的存在使得 Pod 与具体的存储实现解耦,提高了可移植性。

1.3 关系

  • PVC 与 PV 之间是一种声明与提供的关系。PVC 声明了对存储资源的需求,而 PV 则是提供这些资源的实际载体。
  • 当 PVC 被创建时,Kubernetes 会尝试将其与满足其要求的 PV 进行绑定。匹配的过程是根据 PVC 的标签选择器和 PV 的标签进行匹配,只有匹配成功的 PV 才能被绑定到 PVC。
  • 一旦绑定成功,Pod 可以通过 PVC 访问 PV 提供的存储资源。
  • 如果没有合适的 PV 可以绑定,PVC 将处于 Pending 状态,直到有合适的 PV 可用为止。

总之,PV 和 PVC 之间的关系是一种动态的匹配和绑定关系,它们使得 Pod 与存储资源的具体实现解耦,提高了灵活性和可移植性。

二、示例介绍

下面通过一个简单的示例来说明 PV 和 PVC 的关系。

假设我们有一个 Kubernetes 集群,并且我们想要创建一个 Pod,这个 Pod 需要使用一个持久卷来存储数据。我们将按照以下步骤进行操作:

2.1 创建 PV(持久卷)

首先,我们需要创建一个 PV,它可以是任何一种存储系统,比如 NFS。

apiVersion: v1
kind: PersistentVolume
metadata:name: example-pv
spec:capacity:storage: 1GivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retainnfs:path: /path/to/nfs/volumeserver: nfs-server-ip

2.2 创建 PVC(持久卷声明)

接下来,我们创建一个 PVC,用于声明对 PV 的需求。

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

2.3 Pod 使用 PVC

最后,我们创建一个 Pod,并将 PVC 与 Pod 关联起来,以便 Pod 可以访问 PV 提供的存储资源。

apiVersion: v1
kind: Pod
metadata:name: example-pod
spec:containers:- name: example-containerimage: nginxvolumeMounts:- name: datamountPath: /datavolumes:- name: datapersistentVolumeClaim:claimName: example-pvc

2.4 总结

在这个示例中,创建了一个 PV,它代表了一个 NFS 挂载点,然后创建了一个 PVC,声明了对 1GB 存储的需求。

最后,创建了一个 Pod,并将 PVC 与 Pod 关联起来,Pod 可以通过 PVC 访问 PV 提供的存储资源。

这样,PV 和 PVC 就建立了关系,Pod 可以使用 PVC 来访问持久卷提供的存储空间。

三、项目示例

假设我们有一个需求:我们想在 Kubernetes 中运行一个 WordPress 应用程序,并且希望 WordPress 的数据持久化存储在一个持久卷中。

3.1 创建 PV(持久卷)

首先,我们创建一个 PV,用于存储 WordPress 的数据。

apiVersion: v1
kind: PersistentVolume
metadata:name: wordpress-pv
spec:capacity:storage: 5GivolumeMode: FilesystemaccessModes:- ReadWriteOncehostPath:path: /mnt/data

在这个示例中,我们使用了 hostPath 来定义一个本地存储的 PV。

3.2 创建 PVC(持久卷声明)

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

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: wordpress-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 5Gi

3.3 部署 WordPress Pod

最后,我们创建一个 WordPress 的 Deployment,并将 PVC 与 Deployment 关联起来。

apiVersion: apps/v1
kind: Deployment
metadata:name: wordpress
spec:replicas: 1selector:matchLabels:app: wordpresstemplate:metadata:labels:app: wordpressspec:containers:- name: wordpressimage: wordpress:latestports:- containerPort: 80volumeMounts:- name: wordpress-persistent-storagemountPath: /var/www/htmlvolumes:- name: wordpress-persistent-storagepersistentVolumeClaim:claimName: wordpress-pvc

在这个示例中,创建了一个 Deployment 来运行 WordPress,将 PVC 与 Deployment 关联起来,并将 PVC 中的持久卷挂载到 WordPress 容器的 /var/www/html 目录下。

通过这个示例,我们可以看到 PV 和 PVC 的关系:PVC 声明了对持久卷的需求,而 PV 则提供了实际的存储资源。Pod 使用 PVC 来访问 PV 提供的存储资源,从而实现了数据持久化。

四、拓展

部署 WordPress 在 Kubernetes 上完整的步骤:

4.1 创建 MySQL 数据库

首先,我们需要创建一个 MySQL 数据库,WordPress 需要一个数据库来存储数据。

apiVersion: v1
kind: Secret
metadata:name: mysql-secret
type: Opaque
data:mysql-root-password: base64_encoded_passwordmysql-password: base64_encoded_password
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-pv-claim
spec:accessModes:- ReadWriteOnceresources:requests:storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:name: mysql
spec:replicas: 1selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:5.7env:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:name: mysql-secretkey: mysql-root-password- name: MYSQL_PASSWORDvalueFrom:secretKeyRef:name: mysql-secretkey: mysql-passwordports:- containerPort: 3306volumeMounts:- name: mysql-persistent-storagemountPath: /var/lib/mysqlvolumes:- name: mysql-persistent-storagepersistentVolumeClaim:claimName: mysql-pv-claim

4.2 创建 WordPress

接下来,我们需要创建 WordPress 应用程序,并连接到 MySQL 数据库。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: wordpress-pv-claim
spec:accessModes:- ReadWriteOnceresources:requests:storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:name: wordpress
spec:replicas: 1selector:matchLabels:app: wordpresstemplate:metadata:labels:app: wordpressspec:containers:- name: wordpressimage: wordpress:latestenv:- name: WORDPRESS_DB_HOSTvalue: "mysql:3306"- name: WORDPRESS_DB_NAMEvalue: "wordpress"- name: WORDPRESS_DB_USERvalue: "root"- name: WORDPRESS_DB_PASSWORDvalueFrom:secretKeyRef:name: mysql-secretkey: mysql-passwordports:- containerPort: 80volumeMounts:- name: wordpress-persistent-storagemountPath: /var/www/htmlvolumes:- name: wordpress-persistent-storagepersistentVolumeClaim:claimName: wordpress-pv-claim

4.3 创建 Service

最后,我们需要创建 Service 来公开 WordPress 应用程序。

apiVersion: v1
kind: Service
metadata:name: wordpress
spec:selector:app: wordpressports:- protocol: TCPport: 80targetPort: 80type: LoadBalancer

以上步骤创建了一个 WordPress 应用程序,并将其连接到一个 MySQL 数据库。

WordPress 的数据和 MySQL 的数据都被持久化存储。

最后,通过 Service,WordPress 应用程序可以通过外部 IP 地址访问。

这篇关于【K8S系列】深入解析K8S中PV 和PVC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/922024

相关文章

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

99%的人都选错了! 路由器WiFi双频合一还是分开好的专业解析与适用场景探讨

《99%的人都选错了!路由器WiFi双频合一还是分开好的专业解析与适用场景探讨》关于双频路由器的“双频合一”与“分开使用”两种模式,用户往往存在诸多疑问,本文将从多个维度深入探讨这两种模式的优缺点,... 在如今“没有WiFi就等于与世隔绝”的时代,越来越多家庭、办公室都开始配置双频无线路由器。但你有没有注