关于k8s的pvc存储卷

news2024/11/25 5:00:34

目录

1.PVC 和 PV 

1.1 PV

1.2 PVC

1.3 StorageClass

1.4 PV和PVC的生命周期

2.实战演练

2.1 创建静态pv

2.2 创建动态pv

3.总结


1.PVC 和 PV 

1.1 PV

PV 全称叫做 Persistent Volume,持久化存储卷。它是用来描述或者说用来定义一个存储卷的,这个通常都是由运维工程师来定义。

1.2 PVC

PVC 的全称是 Persistent Volume Claim,是持久化存储的请求。它是用来描述希望使用什么样的或者说是满足什么条件的 PV 存储。

PVC 的使用逻辑:在 Pod 中定义一个存储卷(该存储卷类型为 PVC),定义的时候直接指定大小,PVC 必须与对应的 PV 建立关系,PVC 会根据配置的定义去 PV 申请,而 PV 是由存储空间创建出来的。PV 和 PVC 是 Kubernetes 抽象出来的一种存储资源。

1.3 StorageClass

上面介绍的PV和PVC模式是需要运维人员先创建好PV,然后开发人员定义好PVC进行一对一的Bond,但是如果PVC请求成千上万,那么就需要创建成千上万的PV,对于运维人员来说维护成本很高,Kubernetes提供一种自动创建PV的机制,叫StorageClass,它的作用就是创建PV的模板。

创建 StorageClass 需要定义 PV 的属性,比如存储类型、大小等;另外创建这种 PV 需要用到的存储插件,比如 Ceph 等。 有了这两部分信息,Kubernetes 就能够根据用户提交的 PVC,找到对应的 StorageClass,然后 Kubernetes 就会调用 StorageClass 声明的存储插件,自动创建需要的 PV 并进行绑定。

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

1.4 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
●Recycling,回收 PV,可以保留 PV 以便下次使用,也可以直接从云存储中删除

根据这 5 个阶段,PV 的状态有以下 4 种:
●Available(可用):表示可用状态,还未被任何 PVC 绑定
●Bound(已绑定):表示 PV 已经绑定到 PVC
●Released(已释放):表示 PVC 被删掉,但是资源尚未被集群回收
●Failed(失败):表示如果 PV 或 PVC 遇到无法解决的问题,例如配额不足、配置错误或者绑定过程中的异常情况,可能会进入 Failed 状态

一个PV从创建到销毁的具体流程如下:
1、一个PV创建完后状态会变成Available,等待被PVC绑定。
2、一旦被PVC邦定,PV的状态会变成Bound,就可以被定义了相应PVC的Pod使用。
3、Pod使用完后会释放PV,PV的状态变成Released。
4、变成Released的PV会根据定义的回收策略做相应的回收工作。有三种回收策略,Retain、Delete和Recycle。Retain就是保留现场,K8S集群什么也不做,等待用户手动去处理PV里的数据,处理完后,再手动删除PV。Delete策略,K8S会自动删除该PV及里面的数据。Recycle方式,K8S会将PV里的数据删除,然后把PV的状态变成Available,又可以被新的PVC绑定使用。

2.实战演练

2.1 创建静态pv

根据下图创建pv、pvc及配置nfs

配置nfs

192.168.9.116服务器配置nfs,
mkdir -p /data/volumes/v{1..5}
vim /etc/exports
/data/volumes/v1 192.168.9.0/24(rw,sync,no_root_squash)
/data/volumes/v2 192.168.9.0/24(rw,sync,no_root_squash)
/data/volumes/v3 192.168.9.0/24(rw,sync,no_root_squash)
/data/volumes/v4 192.168.9.0/24(rw,sync,no_root_squash)
/data/volumes/v5 192.168.9.0/24(rw,sync,no_root_squash)

exportfs -arv



创建pv

vim demo1-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:      #由于 PV 是集群级别的资源,即 PV 可以跨 namespace 使用,所以 PV 的 metadata 中不用配置 namespace
  name: pv001
spec:
  capacity:                               定义存储能力,一般用于设置存储空间
    storage: 1Gi                          指定大小
  accessModes:                            定义访问模式
  - ReadWriteOnce
  - ReadWriteMany
  #persistentVolumeReclaimPolicy: Recycle 回收策略
  #storageClassName: slow                 自定义存储类名称,此配置用于绑定具有相同类别的PVC和PV
  nfs:                                    定义存储类型
    path: /data/volumes/v1                定义挂载卷路径
    server: 192.168.9.116                 定义服务器名称
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv002
spec:
  capacity:
    storage: 2Gi
  accessModes:
  - ReadWriteOnce
  #persistentVolumeReclaimPolicy: Recycle
  #storageClassName: slow
  nfs:
    path: /data/volumes/v2
    server: 192.168.9.116
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv003
spec:
  capacity:
    storage: 2Gi
  accessModes:
  - ReadWriteOnce
  - ReadWriteMany
  #persistentVolumeReclaimPolicy: Recycle
  #storageClassName: slow
  nfs:
    path: /data/volumes/v3
    server: 192.168.9.116
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv004
spec:
  capacity:
    storage: 4Gi
  accessModes:
  - ReadWriteOnce
  - ReadWriteMany
  #persistentVolumeReclaimPolicy: Recycle
  #storageClassName: slow
  nfs:
    path: /data/volumes/v4
    server: 192.168.9.116
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv005
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  - ReadWriteMany
  #persistentVolumeReclaimPolicy: Recycle
  #storageClassName: slow
  nfs:
    path: /data/volumes/v5
    server: 192.168.9.116
---

kubectl apply -f demo1-pv.yaml

创建pvc

vim demo2-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc001
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 2Gi
  #storageClassName: slow
kubectl apply -f demo2-pvc.yaml

kubectl apply -f demo2-pvc.yaml   #再以同样的文件创建pvc
kubectl get pv,pvc
#可以发现即使条件再匹配,也不会与原先处于released状态的pv匹配

vim demo1-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:      #由于 PV 是集群级别的资源,即 PV 可以跨 namespace 使用,所以 PV 的 metadata 中不用配置 namespace
  name: pv001
spec:
  capacity:                               定义存储能力,一般用于设置存储空间
    storage: 1Gi                          指定大小
  accessModes:                            定义访问模式
  - ReadWriteOnce
  - ReadWriteMany
  #persistentVolumeReclaimPolicy: Recycle 回收策略
  #storageClassName: slow                 自定义存储类名称,此配置用于绑定具有相同类别的PVC和PV
  nfs:                                    定义存储类型
    path: /data/volumes/v1                定义挂载卷路径
    server: 192.168.9.116                 定义服务器名称
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv002
spec:
  capacity:
    storage: 2Gi
  accessModes:
  - ReadWriteOnce
  #persistentVolumeReclaimPolicy: Recycle
  #storageClassName: slow
  nfs:
    path: /data/volumes/v2
    server: 192.168.9.116
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv003
spec:
  capacity:
    storage: 2Gi
  accessModes:
  - ReadWriteOnce
  - ReadWriteMany 
  persistentVolumeReclaimPolicy: Recycle     #当设置指定访问策略为 Recycle
  #storageClassName: slow
  nfs:
    path: /data/volumes/v3
    server: 192.168.9.116
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv004
spec:
  capacity:
    storage: 4Gi
  accessModes:
  - ReadWriteOnce
  - ReadWriteMany
  #persistentVolumeReclaimPolicy: Recycle
  #storageClassName: slow
  nfs:
    path: /data/volumes/v4
    server: 192.168.9.116
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv005
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  - ReadWriteMany
  #persistentVolumeReclaimPolicy: Recycle
  #storageClassName: slow
  nfs:
    path: /data/volumes/v5
    server: 192.168.9.116
---

kubectl apply -f demo1-pv.yaml
kubectl apply -f demo2-pvc.yaml
kubectl get pv,pvc

结合pod,将pv、pvc一起运行

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
spec:
  capacity:
    storage: 1Gi
  accessModes:
  - ReadWriteOnce
  - ReadWriteMany
  #persistentVolumeReclaimPolicy: Recycle
  #storageClassName: slow
  nfs:
    path: /data/volumes/v1
    server: 192.168.9.116
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv002
spec:
  capacity:
    storage: 2Gi
  accessModes:
  - ReadWriteOnce
  #persistentVolumeReclaimPolicy: Recycle
  #storageClassName: slow
  nfs:
    path: /data/volumes/v2
    server: 192.168.9.116
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv003
spec:
  capacity:
    storage: 2Gi
  accessModes:
  - ReadWriteOnce
  - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  #storageClassName: slow
  nfs:
    path: /data/volumes/v3
    server: 192.168.9.116
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv004
spec:
  capacity:
    storage: 4Gi
  accessModes:
  - ReadWriteOnce
  - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  #storageClassName: slow
  nfs:
    path: /data/volumes/v4
    server: 192.168.9.116
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv005
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  - ReadWriteMany
  #persistentVolumeReclaimPolicy: Recycle
  #storageClassName: tan
  nfs:
    path: /data/volumes/v5
    server: 192.168.9.116
---


kubectl apply -f demo1-pv.yaml

vim demo2-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc001
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 2Gi
  #storageClassName: tan

kubectl apply -f demo2-pvc.yaml

vim demo3-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: demo3
  name: demo3-pod
spec:
  volumes:                     
  - name: tan-vol
    persistentVolumeClaim:
      claimName: mypvc001         #创建的pvc名称
  containers:
  - image: soscscs/myapp:v1
    name: demo
    ports:
    - containerPort: 80
    resources: {}
    volumeMounts:
    - name: tan-vol
      mountPath: /mnt/
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

kubectl apply -f demo3-pod.yaml


kubectl delete pod demo3-pod

2.2 创建动态pv

上传nfs-client-provisioner.tar 、nfs-client.zip压缩包到master节点

上传nfs-client-provisioner.tar到两个node节点



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

master节点
kubectl apply -f nfs-client-rbac.yaml
kubectl get serviceaccounts

vim /etc/kubernetes/manifests/kube-apiserver.yaml
    - --feature-gates=RemoveSelfLink=false       #添加这一行
由于 1.20 版本禁用了 selfLink,所以 k8s 1.20+ 版本通过 nfs provisioner 动态生成 PV 会报错,需要添加
cd /etc/kubernetes/manifests
mv kube-apiserver.yaml /tmp/                #进行重启操作
mv /tmp/kube-apiserver.yaml ./

nfs服务器
vim /etc/exports
/opt/nfs 192.168.9.0/24(rw,sync,no_root_squash)
exportfs -avr
两个node节点检查

#创建 NFS Provisioner

master节点
cd /root/day9/pv
vim nfs-client-provisioner.yaml

kubectl apply -f nfs-client-provisioner.yaml

创建 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-tan        #要与 nfs-client-provisioner.yaml中设置的一致
parameters:
  archiveOnDelete: "true"   #做数据备份

kubectl apply -f nfs-client-storageclass.yaml

创建 PVC 和 Pod 测试

vim demo2-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc003
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 2Gi
  storageClassName: nfs-client-storageclass



测试不备份:

vim nfs-client-storageclass.yaml

kubectl delete -f nfs-client-storageclass.yaml && kubectl apply -f nfs-client-storageclass.yaml
kubectl get pv,pvc

vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: demo3
  name: dem3-pod
spec:
  volumes:
  - name: scj-vol
    persistentVolumeClaim:
      claimName: mypvc003
  containers:
  - image: soscscs/myapp:v1
    name: myapp
    ports:
    - containerPort: 80
    resources: {}
    volumeMounts:
    - name: scj-vol
      mountPath: /mnt
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

kubectl apply -f pod.yaml
kubectl exec -it dem3-pod -- sh
cd /mnt
echo '123456' > tan.txt

kubectl delete pod dem3-pod
kubectl delete pvc mypvc003  #删除查看是否备份


3.总结

存储资源有什么?

pv、pvc

创建PV的方式:
静态PV创建:手动根据PV资源对象的配置文件创建PV资源
动态PV创建:根据PVC的配置通过引用StorageClass(简称SC)资源触发存储卷插件动态的创建PV资源

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

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

相关文章

Android SystemServer启动流程

文章目录 Android SystemServer启动流程概述流程图源码分析创建SystemServer进程启动SystemServer进程SystemServer#main()SystemServer#run()SystemServer#createSystemContext()SystemServer#startBootstrapServices()SystemServer#startCoreServices()SystemServer#startOth…

FFmpeg Filter过滤器实战

引文 - FFmpeg Filter的介绍 Filter,一般被译为"过滤器"或者"滤镜",本篇文章统一以"过滤器"著称。 那么过滤器的作用是什么呢?FFmpeg中的过滤器系统是在解码之后、编码之前对媒体流进行处理的关键组件。 下…

Java面试八股之什么是MQTT协议

什么是MQTT协议 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种轻量级的“发布/订阅”(Publish/Subscribe)模式的消息传输协议,特别适合于远程和低带宽网络环境,如物联网&…

【向量数据库】向量数据库的构建和检索

1、使用 sentence-transformers 将文本编码为向量 安装 sentence-transformers: pip install -U sentence-transformers在 huggingface 下载 all-MiniLM-L6-v2 模型权重(1_Pooling 是文件夹,里面包含一个 config.json 文件)&…

Qt内存泄漏与程序异常崩溃

内存泄漏 什么是内存泄漏? 内存泄漏(Memory Leak)指的是程序在动态分配内存后未能正确释放已分配的内存,导致这些内存块无法被再次使用或回收。内存泄漏的发生主要是在使用堆内存(通过new或malloc分配的内存&#xf…

ZBrush入门使用介绍——8、模型网格显示隐藏和遮罩操作

大家好,我是阿赵。   有时候我们需要把需要雕刻的范围限制在某个局部,之前也介绍过一些方法,比如使用遮罩。这里再详细说一下具体的操作。这次我拿这个圆柱为例子,先生成多边形网格,再CtrlD几次增加一点细分级别。 …

【css】使用!important提升选择器的优先级

背景 昨天我的个人博客备案通过了嘛,然后我就想着完善页面底部的备案信息,参考Argon主题博客美化的 网站底部信息 但是我想要把icp备案和公安联网备案的信息分开,即 subject-value-value 的结构, 因为 value 的选择器里面写的是…

ThinkPHP教程

thinkPHP笔记 01. phpEnv配置安装 主讲老师 - 李炎恢 1. 学习基础 ThinkPHP8.x: 前端基础:HTML5/CSS(必须)、JavaScript(可选、但推荐有);后端基础:PHP基础,版本不限,但不能太老,至少PHP5.4以上语法,TP8是兼容PHP8.x的;数据库基础:MySQL数据库,掌握了常规的SQL…

uni-app总结

1. <u-form-item label"报废人" ><u--input v-model"model.remark" border"bottom" placeholder"请输入"></u--input> </u-form-item> border"bottom" 报废日期 为了

【海贼王航海日志:前端技术探索】一篇文章带你走进JavaScript(一)

目录 1 -> 初识JavaScript 1.1 -> JavaScript是什么 1.2 -> 发展历史 1.3 -> JavaScript和HTML和CSS之间的关系 1.4 -> JavaScript运行过程 1.5 -> JavaScript的组成 2 -> 前置知识 2.1 -> JavaScript的书写形式 2.2 -> 注释 2.3 -> 输…

Stable Diffusion-inpaint(mask补全)是怎么做的?

AIGC专栏4——Stable Diffusion原理解析-inpaint修复图片为例_diffusion inpaint-CSDN博客 如果我们必须训练一个inpaint模型才能对当前的模型进行inpaint&#xff0c;那就太麻烦了&#xff0c;有没有什么方法可以不需要训练就能inpaint呢&#xff1f; Stable Diffusion就是一…

Unity新输入系统 之 InputAction(输入配置文件最基本的单位)

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​ 首先你应该了解新输入系统的构成结构&#xff1a;Unity新输入系统结构概览-CSDN博客 Input System - Unity 手册 1.In…

创客匠人媛姐:做得一切都是为了拿到结果!

大家好&#xff0c;我是媛姐。近期我做了《百场IP发售销讲实战宣讲-发售教练点评》的直播活动。邀请了艺得世界人才创造社白钰玮老师为大家现场演练一场销讲&#xff0c;展示发售销讲私教班的培训成果。结果证明&#xff0c;白老师完成得非常出色。 以下&#xff0c;我将分享一…

WPF APP生命周期和全局异常捕获

应用启动事件与启动参数 属性查找 选择想要控件的事件&#xff0c;可以在控件上鼠标右击选择属性&#xff0c;在右上角点击闪电符号即可看到这个控件的所有事件&#xff1a; APP.Run()启动方法&#xff1a; 打开项目中这个文件&#xff1a; ".....\XH.EventLesson\obj…

Chapter 9 Operational Amplifiers

Chapter 9 Operational Amplifiers operational amplifier (op-amp) 运算放大器无疑是模拟电路中最基础最重要的block之一. 这一章我们首先review telescopic and folded-cascode 拓扑, 然后学习two-stage and gain-boosting 结构, 和共模反馈问题, 最后引入slew rate, 分析su…

基于Python、Django开发Web计算器

1、创建项目 创建Django项目参照https://blog.csdn.net/qq_42148307/article/details/140798249&#xff0c;其中项目名为compute&#xff0c;并在该项目下创建一个名为app的应用&#xff0c;并且进行基本的配置。 2、导入Bootstrap前端框架 Bootstrap的使用参照https://blo…

【项目分享】使用python的ttkbootstrap模块构建一个炫酷的计时器

目录 前言 项目背景 项目展示(图片) 项目实现 1. 安装与设置 2. 创建主窗口 3. 初始化计时器功能 4. 实现计时功能 5. 实现隐藏边框与置顶功能 6. 运行应用 完整代码 结论 🌟 嗨,我是命运之光! 🌍 2024,每日百字,记录时光,感谢有你一路同行。 🚀 携…

TCP详解(二)滑动窗口/流量控制

本文解释了TCP为何能保证数据传输的可靠性&#xff0c;以及如何保证整个网络的顺畅。 1 网络分层模型 这是一切的本质。网络被设计成分层的&#xff0c;所以网络的操作就可以称作一个“栈”&#xff0c;这就是网络协议栈的名称的由来。在具体的操作上&#xff0c;数据包最终形…

tcpdump入门——抓取三次握手数据包

1. 使用docker启动一个tcp应用 参考&#xff1a;https://blog.csdn.net/LONG_Yi_1994/article/details/141175526 2. 获取容器id docker ps |grep gochat 3. 获取容器的 PID 首先&#xff0c;你需要获得容器的进程 ID&#xff08;PID&#xff09;。可以使用 docker inspect…

kafka下载|安装

1、下载kafka https://kafka.apache.org/downloads 2、安装kafka 解压下载的kafka安装包即可 tar -xvf kafka_2.13-3.7.0.tgz -C /usr/local/3、查看kafka目录 bin目录&#xff1a;存放了脚本 config目录&#xff1a;主要存放了配置文件