k8s概念-pv和pvc

回到目录

kubernetes存储卷的分类太丰富了,每种类型都要写相应的接口与参数才行,这就让维护与管理难度加大。

persistenvolume(PV) 是配置好的一段存储(可以是任意类型的存储卷)

  • 也就是说将网络存储共享出来,配置定义成PV。

PersistentVolumeClaim(PVC)是用户pod使用PV的申请请求。

  • 用户不需要关心具体的volume实现细节,只需要关心使用需求。

持久卷(PersistentVolume,PV) 是集群中的一块存储,可以由管理员事先制备, 或者使用存储类(Storage Class)来动态制备。 持久卷是集群资源,就像节点也是集群资源一样。PV 持久卷和普通的 Volume 一样, 也是使用卷插件来实现的,只是它们拥有独立于任何使用 PV 的 Pod 的生命周期。 此 API 对象中记述了存储的实现细节,无论其背后是 NFS、iSCSI 还是特定于云平台的存储系统。

持久卷声明(PersistentVolumeClaim,PVC) 表达的是用户对存储的请求。概念上与 Pod 类似。 Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存);同样 PVC 申领也可以请求特定的大小和访问模式 (例如,可以要求 PV 卷能够以 ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany 模式之一来挂载,参见访问模式)。

 

1 pv和pvc的关系

  • pv提供存储资源(生产者)

  • pvc使用存储资源(消费者)

  • 使用pvc绑定pv

 

 2 生命周期

构建、绑定、使用、回收

2.1 构建

静态构建、动态构建

2.1.1 静态构建

集群管理员创建若干 PV 卷。这些卷对象带有真实存储的细节信息, 并且对集群用户可用(可见)。PV 卷对象存在于 Kubernetes API 中,可供用户消费(使用)

2.1.2 动态构建

如果集群中已经有的 PV 无法满足 PVC 的需求,那么集群会根据 PVC 自动构建一个 PV,该操作是通过 StorageClass 实现的。

想要实现这个操作,前提是 PVC 必须设置 StorageClass,否则会无法动态构建该 PV,可以通过启用 DefaultStorageClass 来实现 PV 的构建

2.2 绑定

当用户创建一个 PVC 对象后,主节点会监测新的 PVC 对象,并且寻找与之匹配的 PV 卷,找到 PV 卷后将二者绑定在一起。

如果找不到对应的 PV,则需要看 PVC 是否设置 StorageClass 来决定是否动态创建 PV,若没有配置,PVC 就会一致处于未绑定状态,直到有与之匹配的 PV 后才会申领绑定关系

2.3 使用

Pod 将 PVC 当作存储卷来使用,集群会通过 PVC 找到绑定的 PV,并为 Pod 挂载该卷。

Pod 一旦使用 PVC 绑定 PV 后,为了保护数据,避免数据丢失问题,PV 对象会受到保护,在系统中无法被删除

2.4 回收

当用户不再使用其存储卷时,他们可以从 API 中将 PVC 对象删除, 从而允许该资源被回收再利用。PersistentVolume 对象的回收策略告诉集群, 当其被从申领中释放时如何处理该数据卷。 目前,数据卷可以被 Retained(保留)、Recycled(回收)或 Deleted(删除)

2.4.1 Retain

回收策略 Retain 使得用户可以手动回收资源。当 PersistentVolumeClaim 对象被删除时,PersistentVolume 卷仍然存在,对应的数据卷被视为"已释放(released)"。 由于卷上仍然存在这前一申领人的数据,该卷还不能用于其他申领。 管理员可以通过下面的步骤来手动回收该卷:

  1. 删除 PersistentVolume 对象。与之相关的、位于外部基础设施中的存储资产 (例如 AWS EBS、GCE PD、Azure Disk 或 Cinder 卷)在 PV 删除之后仍然存在。

  2. 根据情况,手动清除所关联的存储资产上的数据。

  3. 手动删除所关联的存储资产。

如果你希望重用该存储资产,可以基于存储资产的定义创建新的 PersistentVolume 卷对象

2.4.2 Delete

对于支持 Delete 回收策略的卷插件,删除动作会将 PersistentVolume 对象从 Kubernetes 中移除,同时也会从外部基础设施(如 AWS EBS、GCE PD、Azure Disk 或 Cinder 卷)中移除所关联的存储资产。 动态制备的卷会继承其 StorageClass 中设置的回收策略, 该策略默认为 Delete。管理员需要根据用户的期望来配置 StorageClass; 否则 PV 卷被创建之后必须要被编辑或者修补

2.4.3 Recycle

警告: 回收策略 Recycle 已被废弃。取而代之的建议方案是使用动态制备。

如果下层的卷插件支持,回收策略 Recycle 会在卷上执行一些基本的擦除 (rm -rf /thevolume/*)操作,之后允许该卷用于新的 PVC 申领

3 pv

yaml

apiVersion: v1
kind: PersistentVolume										# 资源类型 PersistenVlume
metadata: name: pv0001												# pv的名称
spec:capacity:													# 容量限制storage: 5Gi 											# 容量为5GvolumeMode: Filesystem 									# 存储类型为文件系统accessModes: 												# 访问模式# ReadWriteOnce、ReadWriteMany、ReadOnlyMany- ReadWriteOnce 										# 可被单节点独写persistentVolumeReclaimPolicy: Recycle  # 回收策略storageClassName: slow 									# 创建 PV 的存储类名,需要与 pvc 的相同mountOptions: 											# 加载配置- hard- nfsvers=4.1nfs: 														# 连接到 nfspath: /data/nfs/rw/test-pv 						        # 存储路径server: 192.168.113.121 							    # nfs 服务地址

访问模式

  • ReadWriteOnce

    只能被一个pvc绑定,pvc可读写,即服务独享该存储卷

  • ReadWriteMany

    可被多个pvc绑定,pvc可读写,即多个服务可共享

  • ReadOnlyOnce

    只能被一个pvc绑定,pvc仅读操作,即服务独享读

  • ReadOnlyMany

    可被多个pvc绑定,pvc仅读操作,即多个服务共享读内容

pv的状态

状态含义
Available空闲,未被绑定
Bound已经被 PVC 绑定
ReleasedPVC 被删除,资源已回收,但是 PV 未被重新使用
Failed自动回收失败

4 pvc

yaml文件

不指定选择器,则k8s通过资源要求等配置相同的进行自动选择绑定pv

apiVersion: v1
kind: PersistentVolumeClaim		# 资源类型
metadata:name: nfs-pvc					# pvc名称
spec:accessModes:- ReadWriteOnce 			# 权限需要与对应的 pv 相同volumeMode: Filesystem		# 存储类型resources:requests:storage: 5Gi 				# 资源可以小于 pv 的,但是不能大于,如果大于就会匹配不到 pvstorageClassName: slow 		# 名字需要与对应的 pv 相同,slow自带的strogeClass
#  selector: # 使用选择器选择对应的 pv matchLabels:标签选择,表达式选择matchExpressions
#    matchLabels:
#      release: "stable"
#    matchExpressions:
#      - {key: environment, operator: In, values: [dev]}  

pod如何绑定pvc

#在 pod 的挂载容器配置中,增加 pvc 挂载
containers:......volumeMounts:- mountPath: /tmp/pvc		# 挂载到容器里的路径name: nfs-pvc-test		# 挂载数据卷的名称
volumes:- name: nfs-pvc-test			# 数据卷名persistentVolumeClaim:	#	类型为pvcclaimName: nfs-pvc 		# pvc 的名称

5 StorageClass

k8s 中提供了一套自动创建 PV 的机制,就是基于 StorageClass 进行的,通过 StorageClass 可以实现仅仅配置 PVC,然后交由 StorageClass 根据 PVC 的需求动态创建 PV

制备器

Provisioner,每个 StorageClass 都有一个制备器(Provisioner),用来决定使用哪个卷插件制备 PV

准备Storage [nfs]

前提:需要提前安装nfs

官方插件是不支持NFS动态供给的,但是我们可以用第三方的插件来实现

  • RBAC配置

    因为storage自动创建pv需要经过kube-apiserver,所以需要授权

  • provisioner配置

  • storageclass配置

RBAC配置

名称:rbac.yaml

用途:授权账号

账号:nfs-client-provisioner

apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: nfs-client-provisioner-runner
rules:- apiGroups: [""]resources: ["nodes"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]- apiGroups: [""]resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "update"]- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["events"]verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: run-nfs-client-provisioner
subjects:- kind: ServiceAccountname: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
roleRef:kind: ClusterRolename: nfs-client-provisioner-runnerapiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
rules:- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
subjects:- kind: ServiceAccountname: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
roleRef:kind: Rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io
nfs-provisioner

deploy-nfs-client-provisioner.yml

apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-client-provisionerlabels:app: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
spec:replicas: 1strategy:type: Recreateselector:matchLabels:app: nfs-client-provisionertemplate:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisionerimage: registry.cn-beijing.aliyuncs.com/pylixm/nfs-subdir-external-provisioner:v4.0.0volumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: k8s-sigs.io/nfs-subdir-external-provisioner #storageclass通过该名称绑定- name: NFS_SERVERvalue: 10.199.99.201- name: NFS_PATHvalue: /home/data/nfsvolumes:- name: nfs-client-rootnfs:server: 10.199.99.201path: /home/data/nfs
storageclass配置

storageclass-nfs.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:annotations:storageclass.kubernetes.io/is-default-class: "true"name: nfs-client
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:archiveOnDelete: "false"
操作
#1. 在/opt/k8s/下创建目录storageclass,-d标识没有上级目录也创建
mkdir -d /opt/k8s/storageclass#2. 进入目录,创建storageclass-nfs-rbac.yaml,将上面4.2.1内容复制
#3. 创建
[root@k8s-master1 storageclass]# kubectl apply -f storageclass-nfs-rbac.yaml 
serviceaccount/nfs-client-provisioner created
clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner created
clusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner created
role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created#4. 创建制备器 deploy-nfs-client-provisioner.yml
[root@k8s-master1 storageclass]# kubectl apply -f deploy-nfs-client-provisioner.yml 
deployment.apps/nfs-client-provisioner created#5. 创建storageclass   storageclass-nfs.yaml
[root@k8s-master1 storageclass]# kubectl apply -f storageclass-nfs.yaml 
storageclass.storage.k8s.io/managed-nfs-storage created
验证
#查看存储类sc
[root@k8s-master1 storageclass]# kubectl get sc
NAME         PROVISIONER                                   RECLAIMPOLICY   VOLUMEBINDINGMODE   
nfs-client   k8s-sigs.io/nfs-subdir-external-provisioner   Delete          Immediate           #查看制备器provisioner
[root@k8s-master1 storageclass]# kubectl get deploy
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
nfs-client-provisioner   1/1     1            1           28m
#查看制备器po
[root@k8s-master1 storageclass]# kubectl get po
NAME                                      READY   STATUS    RESTARTS   AGE
nfs-client-provisioner-5b788667db-85hrp   1/1     Running   0          24m

创建一个statefulset,验证是否自动制备

---
apiVersion: v1
kind: Service
metadata:name: nginxlabels:app: nginx
spec:ports:- port: 80name: webclusterIP: Noneselector:app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: web
spec:selector:matchLabels:app: nginxserviceName: "nginx"replicas: 2template:metadata:labels:app: nginxspec:imagePullSecrets:- name: huoban-harborterminationGracePeriodSeconds: 10containers:- name: nginximage: nginx:latestports:- containerPort: 80name: webvolumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumeClaimTemplates:- metadata:name: wwwspec:accessModes: [ "ReadWriteOnce" ]storageClassName: "nfs-client" #storageclass 名称resources:requests:storage: 1Gi
[root@k8s-master storageclass]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
pvc-243c7f89-23ff-40b3-821f-f7014d14ec99   1Gi        RWO            Delete           Bound    default/www-web-0   nfs-client              4s
[root@k8s-master storageclass]# kubectl get pvc
NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
www-web-0   Bound    pvc-243c7f89-23ff-40b3-821f-f7014d14ec99   1Gi        RWO            nfs-client     8s

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

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

相关文章

Python黑魔法揭秘:装饰器、生成器、异步编程、GIL、描述符和元类

Python中的某些特性被看作是“黑魔法”,原因在于它们的强大功能和复杂性。接下来,让我们深入探索这些特性。 装饰器 装饰器是修改函数或类行为的强大工具,它提供了一种可读性强、代码重用的方式来增强或修改函数或类的行为。装饰器就像一个…

用Rust实现23种设计模式之 职责链模式

关注我,学习Rust不迷路!! 优点 解耦:职责链模式将请求发送者和接收者解耦,使得多个对象都有机会处理请求,而不是将请求的发送者和接收者紧密耦合在一起。灵活性:可以动态地改变或扩展处理请求…

Thunar配置自定义动作

Add “Copy To” and “Move To” custom actions in Thunar file manager | For the record 1.在此打开终端 图标-应用程序:utilities-terminal 命令:exo-open --working-directory %f --launch TerminalEmulator 文件类型:* 目录 2.右键增…

生成指定网段的IP字典自动化脚本

目录 1.前言 2.生成指定网段的IP字典自动化脚本 1.前言 在可回显的服务端跨站请求伪造(SSRF)漏洞中,我们通常会利用该漏洞进行内网资产探测。最近正好碰到了。写了一个小脚本。 2.生成指定网段的IP字典自动化脚本 脚本可指定协议、IP段、和端口生成字典。 get-Intranet-A…

谁更适合搭配甜点显卡?i7-13700KF、锐龙7 7800X3D对比:游戏相当 生产力Intel强了50%...

一、前言:如果搭配2000元甜点显卡 i7-13700KF和锐龙7 7800X3D谁更有性价比? 现在AMD最受欢迎的处理器无疑是拥有96MB三级缓存的锐龙7 7800X3D,这是一颗专为游戏而生的处理器。 Intel这边,i7-13700KF以略高于i5-13600K的售价&#…

小鱼深度产品测评之:阿里云容器服务器ASK,一款不需购买节点,即可直接部署容器应用。

容器服务器ASK测评 1、引言2、帮助文档3、集群3.1集群列表3.1.1 详情3.1.1.1概览 tab3.1.1.2基本信息 tab3.1.1.4集群资源 tab3.1.1.5 集群日志 tab3.1.1.6 集群任务 tab 3.1.2 应用管理3.1.2.1 详情3.1.2.2 详情3.1.2.3 伸缩3.1.2.4 监控 3.1.3 查看日志3.1.3.1 集群日志3.1.3…

Java feign接口调用后返回子类,序列化子类反序列化只得到父类

需要修改序列化方法 我存的时候放的子类,接收到却是只有父类的数据 feign默认使用jackson进行序列化,需要在父类上加上注解 JsonTypeInfo(use JsonTypeInfo.Id.CLASS) 在父类头上增加注解: import com.fasterxml.jackson.annotation.Jso…

Julia 日期和时间

Julia 通过 Dates 模块提供了以下三个函数来处理日期和时间: Date:表示日期,精确到日,只显示日期。DateTime:表示日期和时间,精确到毫秒。DateTime:表示日时间,精确到纳秒&#xff…

2023-08-05力扣今日三题

链接&#xff1a; 剑指 Offer 22. 链表中倒数第k个节点 题意&#xff1a; 如题 解&#xff1a; 快慢指针 实际代码&#xff1a; #include<iostream> using namespace std; struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {} }; L…

elementui弹窗页按钮重复提交问题解决

一、BUG场景 ruoyi平台&#xff0c;页面弹出窗有提交按钮&#xff0c;在提交时连续多次点击会发生重复提交。 二、错误方案 给按钮增加 :loading"submitLoading" 属性。 <el-dialog :title"title" :v-if"open" :visible.sync"open&…

学习Boost二:从附录3来看编码习惯

附录C 关键字浅谈 在C11标准中&#xff08;C11.2.12&#xff09;总共定义了73个关键字&#xff08;keyword&#xff09;、2个“准”关键字&#xff08;identifiers with special meaning&#xff09;和11个操作符替代字&#xff08;alternative representation&#xff09;[1]。…

【Python】数据分析+数据挖掘——掌握Python和Pandas中的单元格替换操作

1. 前言 数据处理和清洗是数据分析和机器学习中至关重要的步骤。在数据处理过程中&#xff0c;我们经常需要对数据集进行清洗和转换&#xff0c;其中单元格替换是一个常用的技术。Python作为一种功能强大且灵活的编程语言&#xff0c;为数据处理提供了丰富的工具和库。Pandas库…

邀请媒体现场报道,有哪些作用?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 邀请媒体现场报道活动具有多种重要作用和意义&#xff0c;可以为你的活动带来广泛的曝光和正面影响。以下是一些邀请媒体现场报道的作用和意义&#xff1a; 1. 增加活动曝光度&#xff…

通过nvm工具快捷切换node.js版本、以及nvm的安装

使用nvm可以实现多个Node.js版本之间切换 步骤目录&#xff1a; 先卸载掉本系统中原有的node版本 去github上下载nvm安装包 安装node 常用的一些nvm命令 1、先卸载掉本系统中原有的node版本 2、去github上下载nvm安装包 https://github.com/coreybutler/nvm-windows/re…

ffmpeg转码时出现missing picture in access unit with size 14019

使用ffmpeg录制网络流视频&#xff0c;因为网卡的缘故导致录制中断&#xff0c;视频在转换的时候就出现这个问题。 missing picture in access unit with size 14019怀疑是在最后的地方视频是损坏的&#xff0c;索性截取掉最后的2秒时间&#xff0c;原本视频时长是02:06:28&am…

LeetCode933. 最近的请求次数

题干 写一个 RecentCounter 类来计算特定时间范围内最近的请求。 请你实现 RecentCounter 类&#xff1a; RecentCounter() 初始化计数器&#xff0c;请求数为 0 。int ping(int t) 在时间 t 添加一个新请求&#xff0c;其中 t 表示以毫秒为单位的某个时间&#xff0c;并返回…

Python学习笔记:List、Tuple、for循环

1.list list_demo [7, 7, 8, 9, 9, 9] print(list_demo.index(7)) # index 方法返回第一个index list_demo.sort() # 排序list list_demo.reverse() # 倒序list list_demo1 list_demo.copy() # 复制list 2.matrix 其实就是list嵌套&…

Linux命令200例:sort用于对文本文件进行排序的15个例子(常用)

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

使用rspack 替换webpack加速vue3项目构建

rspack简介 rspack是字节跳动团队出的前端构建工具&#xff0c;使用rust编写。 在我看来&#xff0c;它是对webpack Api规范的rust实现与优化。 特点&#xff1a;速度快&#xff0c;易于从webpack迁移。 官网&#xff1a;Rspack rspack在0.2版本&#xff0c;兼容了vue-loa…