当前位置: 首页 > news >正文

研发工程师玩转Kubernetes——local型PV和PVC绑定过程中的状态变化

PV全称是PersistentVolume,即持久卷,是由管理员事先准备好的资源。它可以是本地磁盘,也可以是网络磁盘。
PVC全称是PersistentVolumeClaim,即持久卷申领。它表示卷的使用者,对PV的申请。即我们可以认为,PV是整体,PVC是申请其中的部分。

local型PV

local类型的持久卷分配的是本地磁盘空间。K8S要求该类型的卷在配置时指定其节点亲和性(nodeAffinity),即我们优先(只能)在哪些节点上分配空间。

# default_storage_class_pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: default-storage-class-pv
spec:capacity:storage: 100KivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retainlocal:path: /tmpnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- ubuntud

accessModes是卷的访问模式。有如下选项:

  1. ReadWriteOnce:读写权限,只能被一个Node挂载。
  2. ReadOnlyMany:只读权限,可以被多个Node挂载。
  3. ReadWriteMany:读写权限,可以被多个Node挂载。

由于上例是本地磁盘,所以只能是ReadWriteOnce,因为它只能被一个Node挂载。
persistentVolumeReclaimPolicy选择Retain,表示资源回收需要手工进行。
local和nodeAffinity表示我们将在ubuntud的/tmp目录下分配卷空间。

静态绑定的PVC

# default_storage_class_pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: default-storage-class-pvc
spec:resources:requests:storage: 10KivolumeName: default-storage-class-pvaccessModes:- ReadWriteOnce

volumeName指定了PV的名称。这样PVC就和PV进行了绑定。

绑定过程中状态的变化

我们创建上述资源PV。

kubectl create -f default_storage_class_pv.yaml 

然后观察其状态:

kubectl describe persistentvolume default-storage-class-pv
Name:              default-storage-class-pv
Labels:            <none>
Annotations:       <none>
Finalizers:        [kubernetes.io/pv-protection]
StorageClass:      
Status:            Available
Claim:             
Reclaim Policy:    Retain
Access Modes:      RWO
VolumeMode:        Filesystem
Capacity:          100Ki
Node Affinity:     Required Terms:  Term 0:        kubernetes.io/hostname in [ubuntud]
Message:           
Source:Type:  LocalVolume (a persistent volume backed by local storage on a node)Path:  /tmp
Events:    <none>

可以看到PV处于Available状态。
然后我们创建绑定其的PVC:

kubectl create -f default_storage_class_pvc.yaml 

过段时间后我们查看PVC状态。

kubectl describe persistentvolumeclaims default-storage-class-pvc
Name:          default-storage-class-pvc
Namespace:     default
StorageClass:  
Status:        Bound
Volume:        default-storage-class-pv
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yes
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      100Ki
Access Modes:  RWO
VolumeMode:    Filesystem
Used By:       <none>
Events:        <none>

可以看到PVC的状态是Bound(已绑定)。
最后我们看下PV的状态,它的状态也变成了Bound(已绑定)。至此,该PV和PVC已经绑定了。

kubectl describe persistentvolume default-storage-class-pv
Name:              default-storage-class-pv
Labels:            <none>
Annotations:       pv.kubernetes.io/bound-by-controller: yes
Finalizers:        [kubernetes.io/pv-protection]
StorageClass:      
Status:            Bound
Claim:             default/default-storage-class-pvc
Reclaim Policy:    Retain
Access Modes:      RWO
VolumeMode:        Filesystem
Capacity:          100Ki
Node Affinity:     Required Terms:  Term 0:        kubernetes.io/hostname in [ubuntud]
Message:           
Source:Type:  LocalVolume (a persistent volume backed by local storage on a node)Path:  /tmp
Events:    <none>

已经绑定的PV不可以再绑定PVC。我们创建一个新的PVC,进行测试

# default_storage_class_pvc_invalid.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: default-storage-class-pvc-invalid
spec:resources:requests:storage: 10KivolumeName: default-storage-class-pvaccessModes:- ReadWriteOnce
 kubectl create -f default_storage_class_pvc_invalid.yaml

persistentvolumeclaim/default-storage-class-pvc-invalid created

显示创建成功,但是实际状态是Pending。原因是default-storage-class-pv已经绑定到其他PVC。

kubectl describe persistentvolumeclaims default-storage-class-pvc-invalid 
Name:          default-storage-class-pvc-invalid
Namespace:     default
StorageClass:  
Status:        Pending
Volume:        default-storage-class-pv
Labels:        <none>
Annotations:   <none>
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      0
Access Modes:  
VolumeMode:    Filesystem
Used By:       <none>
Events:Type     Reason         Age               From                         Message----     ------         ----              ----                         -------Warning  FailedBinding  8s (x2 over 22s)  persistentvolume-controller  volume "default-storage-class-pv" already bound to a different claim.

删除过程中的状态变化

我们先删掉上面创建的PVC

kubectl delete persistentvolumeclaims default-storage-class-pvc-invalid
kubectl delete persistentvolumeclaims default-storage-class-pvc

然后观察PV的变化

kubectl describe persistentvolume default-storage-class-pv 
Name:              default-storage-class-pv
Labels:            <none>
Annotations:       pv.kubernetes.io/bound-by-controller: yes
Finalizers:        [kubernetes.io/pv-protection]
StorageClass:      
Status:            Released
Claim:             default/default-storage-class-pvc
Reclaim Policy:    Retain
Access Modes:      RWO
VolumeMode:        Filesystem
Capacity:          100Ki
Node Affinity:     Required Terms:  Term 0:        kubernetes.io/hostname in [ubuntud]
Message:           
Source:Type:  LocalVolume (a persistent volume backed by local storage on a node)Path:  /tmp
Events:    <none>

此时PV因为绑定的PVC被删除,而其persistentVolumeReclaimPolicy选择了Retain,资源没有被回收,而变成了Released状态。卷的状态如下:

  • Available(可用)-- 卷是一个空闲资源,尚未绑定到任何申领;
  • Bound(已绑定)-- 该卷已经绑定到某申领;
  • Released(已释放)-- 所绑定的申领已被删除,但是资源尚未被集群回收;
  • Failed(失败)-- 卷的自动回收操作失败。

这个时候我们再创建上述PVC,还是会处于pending状态。因为PV没有处于Available状态。

kubectl create -f default_storage_class_pvc.yaml

persistentvolumeclaim/default-storage-class-pvc created

kubectl describe persistentvolumeclaims default-storage-class-pvc
Name:          default-storage-class-pvc
Namespace:     default
StorageClass:  
Status:        Pending
Volume:        default-storage-class-pv
Labels:        <none>
Annotations:   <none>
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      0
Access Modes:  
VolumeMode:    Filesystem
Used By:       <none>
Events:Type     Reason         Age   From                         Message----     ------         ----  ----                         -------Warning  FailedBinding  8s    persistentvolume-controller  volume "default-storage-class-pv" already bound to a different claim.

再绑定Released状态的PV

使用下面指令,删除描述绑定信息的claimRef段。

kubectl edit persistentvolume default-storage-class-pv
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: PersistentVolume
metadata:annotations:pv.kubernetes.io/bound-by-controller: "yes"creationTimestamp: "2023-08-09T09:26:04Z"finalizers:- kubernetes.io/pv-protectionname: default-storage-class-pvresourceVersion: "285190"uid: 09782be4-09b9-4116-9b44-8dbb75f08dbf
spec:accessModes:- ReadWriteOncecapacity:storage: 100KiclaimRef:apiVersion: v1kind: PersistentVolumeClaimname: default-storage-class-pvcnamespace: defaultresourceVersion: "285153"uid: c55398f4-77cd-4627-8a11-57b0e049c594local:path: /tmpnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- ubuntudpersistentVolumeReclaimPolicy: RetainvolumeMode: Filesystem
status:phase: Released

保存完后过一会儿,PV就会变成Available状态。而之前处于Pending状态的PVC也会因为PV的状态变化从Pending变成Bound状态,PV也会进而变成Bound状态

kubectl describe persistentvolume default-storage-class-pv 
Name:              default-storage-class-pv
Labels:            <none>
Annotations:       pv.kubernetes.io/bound-by-controller: yes
Finalizers:        [kubernetes.io/pv-protection]
StorageClass:      
Status:            Bound
Claim:             default/default-storage-class-pvc
Reclaim Policy:    Retain
Access Modes:      RWO
VolumeMode:        Filesystem
Capacity:          100Ki
Node Affinity:     Required Terms:  Term 0:        kubernetes.io/hostname in [ubuntud]
Message:           
Source:Type:  LocalVolume (a persistent volume backed by local storage on a node)Path:  /tmp
Events:    <none>
kubectl describe persistentvolumeclaims default-storage-class-pvc
Name:          default-storage-class-pvc
Namespace:     default
StorageClass:  
Status:        Bound
Volume:        default-storage-class-pv
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yes
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      100Ki
Access Modes:  RWO
VolumeMode:    Filesystem
Used By:       <none>
Events:        <none>

参考资料

  • https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/
  • https://cloud.tencent.com/document/product/457/47014

相关文章:

研发工程师玩转Kubernetes——local型PV和PVC绑定过程中的状态变化

PV全称是PersistentVolume&#xff0c;即持久卷&#xff0c;是由管理员事先准备好的资源。它可以是本地磁盘&#xff0c;也可以是网络磁盘。 PVC全称是PersistentVolumeClaim&#xff0c;即持久卷申领。它表示卷的使用者&#xff0c;对PV的申请。即我们可以认为&#xff0c;PV是…...

HTTP——十一、Web的攻击技术

HTTP 一、针对Web的攻击技术1、HTTP 不具备必要的安全功能2、在客户端即可篡改请求3、针对Web应用的攻击模式 二、因输出值转义不完全引发的安全漏洞1、跨站脚本攻击2、SQL 注入攻击3、OS命令注入攻击4、HTTP首部注入攻击5、邮件首部注入攻击6、目录遍历攻击7、远程文件包含漏洞…...

Python-OpenCV中的图像处理-图像金字塔

Python-OpenCV中的图像处理-图像金字塔 图像金字塔高斯金字塔拉普拉斯金字塔 金字塔图像融合 图像金字塔 同一图像的不同分辨率的子图集合&#xff0c;如果把最大的图像放在底部&#xff0c;最小的放在顶部&#xff0c;看起来像一座金字塔&#xff0c;故而得名图像金字塔。cv2…...

ArcGIS、ENVI、InVEST、FRAGSTATS技术教程

专题一 空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 专题二 ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化&#xff1a;地图符号与注…...

Unity-Linux部署WebGL项目MIME类型添加

在以往的文章中有提到过使用IIS部署WebGL添加MIME类型使WebGL项目在浏览器中能够正常加载&#xff0c;那么如果咱们做的是商业项目&#xff0c;往往是需要部署在学校或者云服务器上面的&#xff0c;大部分情况下如果项目有接口或者后台管理系统&#xff0c;后台基本都会使用Lin…...

MySQL:表的约束和基本查询

表的约束 表的约束——为了让插入的数据符合预期。 表的约束很多&#xff0c;这里主要介绍如下几个&#xff1a; null/not null,default, comment, zerofill&#xff0c;primary key&#xff0c;auto_increment&#xff0c;unique key 。 空属性 两个值&#xff1a;null&am…...

mysql统计近7天数据量,,按时间戳分组

可以使用以下 SQL 语句来统计近7天的数据量&#xff0c;并按时间戳分组。如果某一天没有数据&#xff0c;则将其填充为0。 SELECT DATE_FORMAT(FROM_UNIXTIME(timestamp), %Y-%m-%d) AS date,COUNT(*) AS count FROM table_name WHERE timestamp > UNIX_TIMESTAMP(DATE_SUB…...

无涯教程-Perl - endnetent函数

描述 此功能告诉系统您不再希望使用getnetent从网络列表中读取条目。 语法 以下是此函数的简单语法- endnetent返回值 此函数不返回任何值。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perluse Socket;while ( ($name, $aliases, $addrtype, $net) getnetent() )…...

Selenium的xpath高级写法-实用篇

系列文章目录 提示&#xff1a;阅读本章之前&#xff0c;请先阅读目录 文章目录 系列文章目录前言获取父级获取前一个兄弟级获取后一个兄弟级获取内容包含某些内容获取内容是空 前言 获取父级 //div[text()‘我是子级’]/parent::div[text()‘我是父级’] 获取前一个兄弟级 //d…...

阿里云官方关于数据安全保护的声明

“阿里云监控用户的数据流量&#xff1f;”“真的假的&#xff1f;”随着近日早晨 朱峰肥鹅旅行 对阿里云的一条朋友圈截图传遍了整个IT圈。 对于网络上的各种传播&#xff0c;以下是阿里云的官方答复&#xff0c;原文如下&#xff1a; 关于数据安全保护的声明 今天有客户反映…...

【神经网络手写数字识别-最全源码(pytorch)】

Torch安装的方法 学习方法 1.边用边学&#xff0c;torch只是一个工具&#xff0c;真正用&#xff0c;查的过程才是学习的过程2.直接就上案例就行&#xff0c;先来跑&#xff0c;遇到什么来解决什么 Mnist分类任务&#xff1a; 网络基本构建与训练方法&#xff0c;常用函数解析…...

React、Vue和Angular的优缺点

React React 是一个用于构建用户界面的 JAVASCRIPT 库。React 主要用于构建 UI&#xff0c;很多人认为 React 是 MVC 中的 V&#xff08;视图&#xff09;。React 起源于 Facebook 的内部项目&#xff0c;用来架设 Instagram 的网站&#xff0c;并于 2013 年 5 月开源。React …...

ArcGIS Pro根据不同条件显示不同标注

在某些情况下&#xff0c;我们需要根据不同的条件在地图上进行标注&#xff0c;比如我们想要在地图上显示广东省人口从2005年到2010年的变化情况&#xff0c;可以使用ArcGIS Pro的标注类功能实现&#xff0c;这里为大家介绍一下制作方法&#xff0c;希望能对你有所帮助。 标注分…...

DynamicsCRM专栏导览

不知不觉,专栏已经有5个订阅了。很高兴,自己的付出有了回报。很感谢大家的信任。 大家的订阅给了我很好的正反馈,也让我有了更强的动力,更大的责任感,去把这个专栏做好。 于是就有了这篇导览。这篇导览是我根据过往的开发经验总结出来的一个学习的框架。有些部分可能还没…...

Vue自定义指令使用

本篇文章讲述使用Vue自定义指令&#xff0c;并在项目中完成相应功能。 在平常Vue脚手架项目中&#xff0c;使用到 自定义指令较少&#xff0c;一般都是使用的自带指令&#xff0c;比如 v-show 、v-if 、 v-for 、 v-bind 之类的。这些已经能够满足大多数项目使用。更多的可能也…...

python爬虫之scrapy框架介绍

一、Scrapy框架简介 Scrapy 是一个开源的 Python 库和框架&#xff0c;用于从网站上提取数据。它为自从网站爬取数据而设计&#xff0c;也可以用于数据挖掘和信息处理。Scrapy 可以从互联网上自动爬取数据&#xff0c;并将其存储在本地或在 Internet 上进行处理。Scrapy 的目标…...

winform中嵌入cefsharp, 并使用selenium控制

正常说&#xff0c; 需要安装的包 下面是所有的包 全部代码 using OpenQA.Selenium.Chrome; using OpenQA.Selenium; using System; using System.Windows.Forms; using CefSharp.WinForms; using CefSharp;namespace WindowsFormsApp2 {public partial class Form1 : Form{//…...

【leetcode】349. 两个数组的交集(easy)

给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 思路&#xff1a; 先遍历nums1将其元素不重复地添加到哈希表a中&#xff1b;建立哈希表dup用于存储b和a重复的元素&#xff1b;遍历nums2…...

leetcode 2616. 最小化数对的最大差值

在数组nums中找到p个数对&#xff0c;使差值绝对值的和最小。 思路&#xff1a; 最小差值应该是数值相近的一对数之间产生&#xff0c;让数值相近的数字尽量靠在一起方便计算&#xff0c;所以需要排序。 这里不去直接考虑一对对的数字&#xff0c;而是直接考虑差值的取值。 …...

npm install 安装慢的问题处理

原因 npm install 默认使用的安装镜像时国外的镜像&#xff0c;国内使用会受到网络的限制。 解决方案 更换网络更换npm的安装镜像为国内&#xff0c;比如&#xff1a; npm config set registry https://registry.npm.taobao.org...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...