kubernetes中PV和PVC

目录

一、PV、PVC简介

二、PV、PVC关系

三、创建静态PV

1.配置nfs存储

2.定义PV

 3.定义PVC

4.测试访问

四、 搭建 StorageClass + nfs-client-provisioner ,实现 NFS 的动态 PV 创建

1. 配置nfs服务

2.创建 Service Account

3.使用 Deployment 来创建 NFS Provisioner

3.1由于 1.20 版本启用了 selfLink,所以 k8s 1.20+ 版本通过 nfs provisioner 动态生成pv会报错,解决方法如下

3.2创建 NFS Provisioner 

4.创建 StorageClass

5.创建 PVC 和 Pod 测试


一、PV、PVC简介

PV 全称叫做 Persistent Volume,持久化存储卷。K8S在指定存储设备空间中逻辑划分创建的可持久化的存储资源对象。

PVC 的全称是 Persistent Volume Claim,是持久化存储的请求。是对PV资源对象的请求和绑定,也是Pod能挂载使用的一种存储卷类型。

PV是集群中的资源。 PVC是对这些资源的请求,也是对资源的索引检查。 

二、PV、PVC关系

 PV和PVC之间的相互作用遵循生命周期:

Provisioning(配置)---> Binding(绑定)---> Using(使用)---> Releasing(释放) ---> Recycling(回收)

  • Provisioning,即 PV 的创建,可以直接创建 PV(静态方式),也可以使用 StorageClass 动态创建
  • Binding,将 PV 分配给 PVC
  • Using,Pod 通过 PVC 使用该 Volume,并可以通过准入控制StorageProtection(1.9及以前版本为PVCProtection) 阻止删除正在使用的 PVC
  • Releasing,Pod 释放 Volume 并删除 PVC
  • Reclaiming,回收 PV,可以保留 PV 以便下次使用,也可以直接从云存储中删除

 根据5个阶段,PV的状态有以下4种:

  • Available(可用):表示可用状态,还未被任何 PVC 绑定
  • Bound(已绑定):表示 PV 已经绑定到 PVC
  • Released(已释放):表示 PVC 被删掉,但是资源尚未被集群回收
  • Failed(失败):表示该 PV 的自动回收失败

PV从创建到销毁的具体流程: 

  1. 一个PV创建完后状态会变成Available,等待被PVC绑定。
  2. 一旦被PVC邦定,PV的状态会变成Bound,就可以被定义了相应PVC的Pod使用。
  3. Pod使用完后会释放PV,PV的状态变成Released。
  4. 变成Released的PV会根据定义的回收策略做相应的回收工作。有三种回收策略,Retain、Delete和Recycle。

PV回收策略:

  • Retain(保留):当用户删除与之绑定的PVC时候,这个PV被标记为released(PVC与PV解绑但还没有执行回收策略)且之前的数据依然保存在该PV上,但是该PV不可用,需要手动来处理这些数据并删除该PV。
  • Delete(删除):删除与PV相连的后端存储资源。对于动态配置的PV来说,默认回收策略为Delete。表示当用户删除对应的PVC时,动态配置的volume将被自动删除。(只有 AWS EBS, GCE PD, Azure Disk 和 Cinder 支持)
  • Recycle(回收):如果用户删除PVC,则删除卷上的数据,卷不会删除。(只有 NFS 和 HostPath 支持)

三、创建静态PV

创建使用 静态PV

  1. 准备好存储设备和共享目录
  2. 手动创建PV资源,配置 存储卷类型 访问模式(RWO RWX ROX RWOP) 存储空间大小  回收策略(Retain Recycle Delete)等
  3. 创建PVC资源,配置请求PV资源的访问模式(必要条件,必须是PV能支持的访问模式) 存储空间大小(默认就近选择大于等于指定大小的PV)来绑定PV
  4. 创建Pod和Pod控制器资源挂载PVC存储卷,配置存储卷类型为 persistentVolumeClaim ,并在容器配置中定义存储卷挂载点目录  

1.配置nfs存储

mkdir /data/v{1..5}vim /etc/exports
/data/v1 192.168.88.0/24(rw,no_root_squash,sync)
/data/v2 192.168.88.0/24(rw,no_root_squash,sync)
/data/v3 192.168.88.0/24(rw,no_root_squash,sync)
/data/v4 192.168.88.0/24(rw,no_root_squash,sync)
/data/v5 192.168.88.0/24(rw,no_root_squash,sync)exportfs -arvshowmount -e

2.定义PV

vim pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:        #由于 PV 是集群级别的资源,即 PV 可以跨 namespace 使用,所以 PV 的 metadata 中不用配置 namespacename: pv01labels:name: pv01
spec:nfs:                        #定义存储类型path: /data/v1            #定义挂载卷路径server: 192.168.88.60     #定义服务器名称或地址accessModes:                #定义访问模型- ReadWriteOnce- ReadWriteManycapacity:                   #定义存储能力,一般用于设置存储空间storage: 1Gi              #指定大小storageClassName: slow      #自定义存储类名称,此配置用于绑定具有相同类别的PVC和PVpersistentVolumeReclaimPolicy: Retain  #回收策略(Retain/Delete/Recycle)
--- 
apiVersion: v1
kind: PersistentVolume
metadata:name: pv02labels:name: pv02
spec:nfs:path: /data/v2server: 192.168.88.60accessModes:- ReadWriteOncecapacity:storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv03labels:name: pv03
spec:nfs:path: /data/v3server: 192.168.88.60accessModes:- ReadWriteOnce- ReadWriteManycapacity:storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv04labels:name: pv04
spec:nfs:path: /data/v4server: 192.168.88.60accessModes:- ReadWriteOnce- ReadWriteManycapacity:storage: 4Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv05labels:name: pv05
spec:nfs:path: /data/v5server: 192.168.88.60accessModes:- ReadWriteOnce- ReadWriteManycapacity:storage: 5Gikubectl apply -f pv.yaml

 3.定义PVC

定义了pvc的访问模式为多路读写,该访问模式必须在前面pv定义的访问模式之中。定义PVC申请的大小为2Gi,此时PVC会自动去匹配多路读写且大小为2Gi的PV,匹配成功获取PVC的状态即为Bound

vim pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim   #定义类型为pvc
metadata:name: mypvc-anamespace: default
spec:accessModes:                #定义pvc的访问模式- ReadWriteManyresources:requests:storage: 2Gi            #定义请求pv的大小
---
apiVersion: v1
kind: Pod
metadata:name: pod-vol-pvcnamespace: default
spec:containers:- name: myappimage: nginx:1.14volumeMounts:- name: htmlmountPath: /usr/share/nginx/htmlvolumes:- name: htmlpersistentVolumeClaim:    #定义挂载的pvc详细信息claimName: mypvc-a      #挂载pvc的名称kubectl apply -f pvc.yaml

4.测试访问

在存储服务器上创建index.html,并写入数据,通过访问Pod进行查看,可以获取到相应的页面。
cd /data/v3/
echo "welcome to use pv3" > index.htmlkubectl get pods -o widecurl  10.244.1.37
welcome to use pv3

四、 搭建 StorageClass + nfs-client-provisioner ,实现 NFS 的动态 PV 创建

Kubernetes 本身支持的动态 PV 创建不包括 NFS,所以需要使用外部存储卷插件分配PV。详见:https://kubernetes.io/zh/docs/concepts/storage/storage-classes/

卷插件称为 Provisioner(存储分配器),NFS 使用的是 nfs-client,这个外部卷插件会使用已经配置好的 NFS 服务器自动创建 PV。
Provisioner:用于指定 Volume 插件的类型,包括内置插件(如 kubernetes.io/aws-ebs)和外部插件(如 external-storage 提供的 ceph.com/cephfs)。

创建使用动态PV

  1. 准备好存储设备和共享目录
  2. 如果是外置存储卷插件,需要先创建serviceaccount账户(Pod使用的账户)和做RBAC授权(创建角色授予相关资源对象的操作权限,再将账户和角色进行绑定),使serviceaccount账户具有对PV PVC StorageClass等资源的操作权限
  3. 创建外置存储卷插件provisioner的Pod,配置中使用serviceaccount账户作为Pod的用户,并设置相关环境变量参数
  4. 创建StorageClass(SC)资源,配置中引用存储卷插件的插件(PROVISIONER_NAME)
  5. 创建PVC资源,配置中设置 StorageClass资源名称 访问模式 存储空间大小。创建PVC资源会自动创建相关的PV资源。
  6. 创建Pod资源挂载PVC存储卷,配置存储卷类型为 persistentVolumeClaim ,并在容器配置中定义存储卷挂载点目录
     

1. 配置nfs服务

mkdir /opt/k8s
chmod 777 /data/volumesvim /etc/exports
/data/volumes 192.168.88.0/24(rw,no_root_squash,sync)exportfs -arv

2.创建 Service Account

Service Account:用来管理 NFS Provisioner 在 k8s 集群中运行的权限,设置 nfs-client 对 PV,PVC,StorageClass 等的规则

vim nfs-client-rbac.yaml
#创建 Service Account 账户,用来管理 NFS Provisioner 在 k8s 集群中运行的权限
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisioner
---
#创建集群角色
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: nfs-client-provisioner-clusterrole
rules:
- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]resources: ["persistentvolumesclaims"]verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get", "list", "watch"]
- apiGroups: [""]resources: ["events"]verbs: ["list", "watch", "create", "update", "patch"]
- apiGroups: [""]resources: ["endpoints"]verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
---
#集群角色绑定
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: nfs-client-provisioner-clusterrolebinding
subjects:
- kind: ServiceAccountname: nfs-client-provisionernamespace: default
roleRef:kind: ClusterRolename: nfs-client-provisioner-clusterroleapiGroup: rbac.authorization.k8s.ioverbs: ["list", "watch", "create", "update", "patch"]
- apiGroups: [""]resources: ["endpoints"]kubectl apply -f nfs-client-rbac.yaml

3.使用 Deployment 来创建 NFS Provisioner

NFS Provisioner(即 nfs-client),有两个功能:一个是在 NFS 共享目录下创建挂载点(volume),另一个则是将 PV 与 NFS 的挂载点建立关联。

3.1由于 1.20 版本启用了 selfLink,所以 k8s 1.20+ 版本通过 nfs provisioner 动态生成pv会报错,解决方法如下

vim /etc/kubernetes/manifests/kube-apiserver.yaml
spec:containers:- command:- kube-apiserver- --feature-gates=RemoveSelfLink=false   #添加这行- --advertise-address=192.168.88.70kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
kubectl delete pods kube-apiserver -n kube-system 
kubectl get pods -n kube-system | grep apiserver

3.2创建 NFS Provisioner 

vim nfs-client-provisioner.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-client-provisioner
spec:replicas: 1selector:matchLabels:app: nfs-client-provisionerstrategy:type: Recreatetemplate:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisionerimage: quay.io/external_storage/nfs-client-provisioner:latestimagePullPolicy: IfNotPresentvolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: nfs-storage       #配置provisioner的Name,确保该名称与StorageClass资源中的provisioner名称保持一致- name: NFS_SERVERvalue: 192.168.88.60     #配置绑定的nfs服务器- name: NFS_PATHvalue: /data/volumes     #配置绑定的nfs服务器目录volumes:                     #申明nfs数据卷- name: nfs-client-rootnfs:server: 192.168.88.60path: /data/volumeskubectl apply -f nfs-client-provisioner.yaml     
kubectl get pod                              

4.创建 StorageClass

StorageClass:负责建立 PVC 并调用 NFS provisioner 进行预定的工作,并让 PV 与 PVC 建立关联

vim nfs-client-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-client-storageclass
provisioner: nfs-storage      #这里的名称要和provisioner配置文件中的环境变量PROVISIONER_NAME保持一致
parameters:archiveOnDelete: "false"     #false表示在删除PVC时不会对数据目录进行打包存档,即删除数据;为ture时就会自动对数据目录进行打包存档,存档文件以archived开头kubectl apply -f nfs-client-storageclass.yaml
kubectl get storageclass

5.创建 PVC 和 Pod 测试

vim test-pvc-pod.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: test-nfs-pvc#annotations: volume.beta.kubernetes.io/storage-class: "nfs-client-storageclass"     #另一种SC配置方式,(annotations也可表示为注释字段)
spec:accessModes:- ReadWriteManystorageClassName: nfs-client-storageclass    #关联StorageClass对象resources:requests:storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:name: test-storageclass-pod
spec:containers:- name: busyboximage: busybox:latestimagePullPolicy: IfNotPresentcommand:- "/bin/sh"- "-c"args:- "sleep 3600"volumeMounts:- name: nfs-pvcmountPath: /mntrestartPolicy: Nevervolumes:- name: nfs-pvcpersistentVolumeClaim:claimName: test-nfs-pvc      #与PVC名称保持一致#PVC 通过 StorageClass 自动申请到空间
kubectl get pvc
#查看 NFS 服务器上是否生成对应的目录,自动创建的 PV 会以 ${namespace}-${pvcName}-${pvName} 的目录格式放到 NFS 服务器上
ls /data/volumes#进入 Pod 在挂载目录 /mnt 下写一个文件,然后查看 NFS 服务器上是否存在该文件
kubectl exec -it test-storageclass-pod sh
/ # cd /mnt/
/mnt # echo 'this is test file' > test.txt#发现 NFS 服务器上存在,说明验证成功
cat /data/volumes/default-test-nfs-pvc-pvc-bff2245e-990d-4119-a846-06f898f95efb

 

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

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

相关文章

Figma中文社区来啦,云端协作设计你准备好了吗?

Figma是改变产品设计协作方式的重要工具,但由于没有中文社区,对国内设计师的约束较大。而拥有全中文UI 界面、功能齐全的即时设计资源广场,恰好弥补了Figma的这一短板,它也将取代Figma成为设计师新宠。 1、UI组件集 Figma中文社区替代即时设计资源广场,拥有海量丰富的UI设计组…

【BEV Review】论文 Delving into the Devils of Bird’s-eye-view 2022-9 笔记

背景 一般来说,自动驾驶车辆的视觉传感器(比如摄像头)安装在车身上方或者车内后视镜上。无论哪个位置,摄像头所得到的都是真实世界在透视视图(Perspective View)下的投影(世界坐标系到图像坐标系…

ssm柚子云电子商城java图书购物电子商务管理jsp源代码

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 ssm柚子云电子商城 系统有2权限:前台、后…

SpringBoot笔记:SpringBoot 集成 Dataway 多数据源配置(二)

文章目录 前言核心代码和配置yml 配置注入多数据源常用Spi实现swagger 配置自定义 Udf指定数据源进行查询 前言 之前简单介绍了一下 Dataway 使用,本文继续介绍一下它的多数据源配置和使用。 核心代码和配置 yml 配置 # springboot多环境配置 #端口,…

JavaScript应用:五子棋游戏实战开发

🏆作者简介,黑夜开发者,全栈领域新星创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责…

面试热题(螺旋矩阵)

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素 一看到这个大家有没有想到 就是一个螺旋形状,那这道题我们应该怎么解决? 我们先来仔细的看,它这种螺旋形状的遍历是先【右-下-左-上】…

Docker中Tomcat部署步骤

第一次访问没有东西。

为什么我不推荐任何人用C语言作为编程启蒙第一课?

前言 写了20多年的代码,之前做过阿里的高级架构师,在技术这条路上跌跌撞撞了很多,我今天分享一些我个人的自学方法给各位。为什么我会说:不推荐任何人用C语言作为编程启蒙第一课? 这里有很多同学要站出来说了&#x…

VsCode美化 - VsCode自定义 - VsCode自定义背景图

VsCode美化 - VsCode自定义 - VsCode自定义背景图:添加二次元老婆图到VsCode 前言 作为一个二刺螈,VsCode用久了,总觉得少了些什么。是啊,高效的代码生产工具中怎么能没有老婆呢? 那就安装一个VsCode插件把老婆添加…

章节7:Burp Intruder模块

章节7:Burp Intruder模块 参考资料 https://portswigger.net/burp/documentation/desktop/tools/intruder 01 Intruder模块作用与原理 原理 http://xxx.xx.com/bbs/index.php?namewuyanzu&mottogo 对请求参数进行修改,分析响应内容&#xff0…

Linux 内核第一版 (v0.01) 开源代码解读

探索Linux v0.01的内部结构,Linux内核经常被认为是一个庞大的开源软件。在撰写本文时,最新版本是v6.5-rc5,包含36M行代码。不用说,Linux是几十年来许多贡献者辛勤工作的成果。 Linux 内核首个开源版本 (v0.01) 的体积非常小&…

四、Dubbo扩展点加载机制

四、Dubbo扩展点加载机制 4.1 加载机制概述 Dubbo良好的扩展性与框架中针对不同场景使用合适设计模式、加载机制密不可分 Dubbo几乎所有功能组件都是基于扩展机制(SPI)实现的 Dubbo SPI 没有直接使用 Java SPI,在它思想上进行改进&#xff…

竞赛项目 深度学习的视频多目标跟踪实现

文章目录 1 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的视频多目标跟踪实现 …

全网最牛,Appium自动化测试框架-关键字驱动+数据驱动实战(二)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 util 包 util 包…

数据可视化工具LightningChart .NET正式发布v10.5.1——拥有全新的3D新功能

LightningChart.NET完全由GPU加速,并且性能经过优化,可用于实时显示海量数据-超过10亿个数据点。 LightningChart包括广泛的2D,高级3D,Polar,Smith,3D饼/甜甜圈,地理地图和GIS图表以及适用于科学…

网络安全专业术语英文缩写对照表

因在阅读文献过程中经常遇到各种专业缩写,所以把各种缩写总结了一下。 因能力有限,错误在所难免,欢迎进行纠错与补充:https://github.com/piaolin/CSAbbr 渗透相关 缩写全称解释备注XSSCross Site Script Attack跨站脚本攻击为…

java毕业设计-智慧食堂管理系统-内容快览

首页 智慧食堂管理系统是一种可以提高食堂运营效率的管理系统。它将前端代码使用Vue实现,后端使用Spring Boot实现。这个系统的目的是简化食堂管理,提高食堂服务质量。在现代快节奏的生活中,人们对餐饮服务提出了更高的要求,食堂管…

Docker安装elasticsearch分布式搜索

文章目录 ☀️安装elasticsearch☀️1.部署单点es🌸1.1.创建网络🌸1.2.下载镜像🌸1.3.运行 ☀️2.部署kibana🌸2.1.部署🌸2.2.DevTools ☀️3.安装IK分词器🌸3.1.在线安装ik插件(较慢&#xff0…

Rx.NET in Action 中文介绍 前言及序言

Rx 处理器目录 (Catalog of Rx operators) 目标可选方式Rx 处理器(Operator)创建 Observable Creating Observables直接创建 By explicit logicCreate Defer根据范围创建 By specificationRangeRepeatGenerateTimerInterval Return使用预设 Predefined primitivesThrow …

答疑:Arduino IDE配置其他开发板下载速度慢

基于案例:Linux环境Arduino IDE中配置ATOM S3 通常,网络问题较多,可以使用一些技巧。 https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json 没有配置,不支持M5Stack(ESP32&…