首页 > 其他分享 >k8s pvc详解

k8s pvc详解

时间:2023-10-31 22:46:09浏览次数:31  
标签:kubectl pv yaml pvc 详解 nfs k8s root

一、概述
PVC 的全称是:PersistentVolumeClaim(持久化卷声明),PVC 是用户存储的一种声明,PVC 和 Pod 比较类似,Pod 消耗的是节点,PVC 消耗的是 PV 资源,Pod 可以请求 CPU 和内存,而 PVC 可以请求特定的存储空间和访问模式。对于真正使用存储的用户不需要关心底层的存储实现细节,只需要直接使用 PVC 即可。

PVC作为用户对存储资源的需求申请,主要涉及存储空间请求、访问模式、 PV选择条件和存储类别等信息的设置。

二、参数解释
创建pvc,如下:

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
storageClassName: nfs
volumeMode: Filesystem
accessModes:访问模式

PVC也可以设置访问模式,用于描述用户应用对存储资源的访问权限,其设置参数和pv一致

resources:资源请求

描述对存储的请求数量,通过 resources.requests.storage字段设置需要的存储空间大小。

volumeMode:存储卷格式,用于描述用户使用的PV存储卷模式,包括文件系统(Filesystem)和块设备 (Block),与pv一致。

storageClassName:存储类型

在创建pvc时需要指定后端存储类型,以减少对后端存储详细信息的依赖。

如果系统中存在一个DefaultStorageClass,可以在创建pvc的时候不指定storageclassname,系统会自动使用默认的存储类型。

如果将多个StorageClass都定义为default,则由于不唯一,系统将无法创建PVC。

三、pod使用pvc
编辑配置文件,如下:

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
storageClassName: nfs
volumeMode: Filesystem

---
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: myfrontend
image: docker.io/library/centos:7
command: ["init"]
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /data name: test-path
volumes:
- name: test-path
persistentVolumeClaim:
claimName: test-pvc


执行创建命令如下:
kubectl apply -f pod.yaml
[root@node1 yaml]# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mypod 1/1 Running 0 4s 10.233.96.10 node2 <none> <none>

进入pod查看挂载的目录,如下:
[root@node1 yaml]# kubectl exec -it mypod bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
[root@mypod /]# ls
anaconda-post.log bin data dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@mypod /]# ll
total 12
-rw-r--r-- 1 root root 12114 Nov 13 2020 anaconda-post.log
lrwxrwxrwx 1 root root 7 Nov 13 2020 bin -> usr/bin
drwxrwxrwx 2 root root 6 Jun 5 06:27 data ####目录被自动挂载
drwxr-xr-x 5 root root 360 Jun 5 06:34 dev
drwxr-xr-x 1 root root 41 Jun 5 06:34 etc
drwxr-xr-x 2 root root 6 Apr 11 2018 home

四、pv、pvc状态变化
不同情况下,PV和PVC的状态变化如下:

 

具体操作如下:

#############################
1:创建pv
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 2Gi
nfs:
path: /data/
server: 192.168.5.79
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
volumeMode: Filesystem

[root@node1 yaml]# kubectl apply -f nfs-pv.yaml
persistentvolume/pv-nfs created
[root@node1 yaml]#
[root@node1 yaml]# kubectl get pv | grep pv-nfs
pv-nfs 2Gi RWO Retain Available nfs 23s
[root@node1 yaml]#
此时查看pv的状态为Available


##############################
2:创建pvc,如下:
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
storageClassName: nfs
volumeMode: Filesystem

[root@node1 yaml]# kubectl apply -f pvc.yaml
persistentvolumeclaim/pvc-nfs created
[root@node1 yaml]# kubectl get pvc ###正常是状态先为pending,然后是Bound
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-nfs Bound pv-nfs 2Gi RWO nfs 7s

############################
3:删除pv,查看pvc的状态
[root@node1 yaml]# kubectl delete pv pv-nfs
persistentvolume "pv-nfs" delete ####会一直卡在这里

打开新的终端,查看pv状态已经是Terminating
[root@node1 ~]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-nfs 2Gi RWO Retain Terminating default/pvc-nfs nfs 11m

出现删除不掉问题的主要原因是pv已经和pvc绑定,pv内部有kubernetes.io/pv-protection这个参数进行保护,编辑pv,删除这个参数,kubectl edit pv pv-nfs,如下:

apiVersion: v1
kind: PersistentVolume
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{},"name":"pv-nfs"},"spec":{"accessModes":["ReadWriteOnce"],"capacity":{"storage":"2Gi"},"nfs":{"path":"/data/","server":"192.168.5.79"},"persistentVolumeReclaimPolicy":"Retain","storageClassName":"nfs","volumeMode":"Filesystem"}}
pv.kubernetes.io/bound-by-controller: "yes"
creationTimestamp: "2023-06-05T08:12:28Z"
deletionGracePeriodSeconds: 0
deletionTimestamp: "2023-06-05T08:23:27Z"
# finalizers: ####将此参数删除
# - kubernetes.io/pv-protection
name: pv-nfs
resourceVersion: "9420641"
uid: cb3b7c54-b8e9-4132-b273-16e9415ae643
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 2Gi

再次查看pv已经被删除了,此时pvc状态为Lost,如下:
[root@node1 yaml]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-nfs Lost pv-nfs 0 nfs 13m

解决方式,将删除的pv进行重新创建,pvc和pv的状态都会变成Bound
[root@node1 yaml]# kubectl apply -f nfs-pv.yaml
persistentvolume/pv-nfs created
[root@node1 yaml]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-nfs 2Gi RWO Retain Bound default/pvc-nfs nfs 4s
[root@node1 yaml]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-nfs Bound pv-nfs 2Gi RWO nfs 15m

############################
4:删除pvc,查看pv状态变化,如下:
[root@node1 yaml]# kubectl delete pvc pvc-nfs
persistentvolumeclaim "pvc-nfs" deleted
[root@node1 yaml]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-nfs 2Gi RWO Retain Released default/pvc-nfs nfs 84s

此时的pv状态已经是released,但如果此时在创建新的pvc,能够进行pv和pvc的绑定呢,大答案是不行的,因为pvc只能和Available状态的pv进行绑定。
在pv变成released的时候,查看claimRef属性,其中依然保留着PVC的绑定信息,如下:
[root@node1 yaml]# kubectl get pv pv-nfs -o yaml
apiVersion: v1
kind: PersistentVolume
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{},"name":"pv-nfs"},"spec":{"accessModes":["ReadWriteOnce"],"capacity":{"storage":"2Gi"},"nfs":{"path":"/data/","server":"192.168.5.79"},"persistentVolumeReclaimPolicy":"Retain","storageClassName":"nfs","volumeMode":"Filesystem"}}
pv.kubernetes.io/bound-by-controller: "yes"
creationTimestamp: "2023-06-05T08:29:29Z"
finalizers:
- kubernetes.io/pv-protection
name: pv-nfs
resourceVersion: "9421489"
uid: 09c62907-7fa3-491f-bb48-656003581c8f
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 2Gi
claimRef: ####查看此处,保留了pvc的绑定信息
apiVersion: v1
kind: PersistentVolumeClaim
name: pvc-nfs
namespace: default
resourceVersion: "9421099"
uid: 15935386-4b7b-4b97-88b3-2bece1ed6ea9
nfs:
path: /data/
server: 192.168.5.79
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
volumeMode: Filesystem
status:
phase: Released
[root@node1 yaml]#

解决方式是导出pv的信息进行备份,然后删除claimRef出的内容,如下:
[root@node1 yaml]# kubectl get pv pv-nfs -o yaml > pv.yaml
[root@node1 yaml]# kubectl edit pv pv-nfs
---
apiVersion: v1
kind: PersistentVolume
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{},"name":"pv-nfs"},"spec":{"accessModes":["ReadWriteOnce"],"capacity":{"storage":"2Gi"},"nfs":{"path":"/data/","server":"192.168.5.79"},"persistentVolumeReclaimPolicy":"Retain","storageClassName":"nfs","volumeMode":"Filesystem"}}
pv.kubernetes.io/bound-by-controller: "yes"
creationTimestamp: "2023-06-05T08:29:29Z"
finalizers:
- kubernetes.io/pv-protection
name: pv-nfs
resourceVersion: "9421489"
uid: 09c62907-7fa3-491f-bb48-656003581c8f
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 2Gi
nfs:
path: /data/
server: 192.168.5.79
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
volumeMode: Filesystem
status:
phase: Released
persistentvolume/pv-nfs edited
[root@node1 yaml]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-nfs 2Gi RWO Retain Available nfs 10m
再次查看pv状态变为Available,此在创建pvc,pv/pvc状态都为Bound,如下:
[root@node1 yaml]# kubectl apply -f pvc.yaml
persistentvolumeclaim/pvc-nfs created
[root@node1 yaml]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-nfs 2Gi RWO Retain Bound default/pvc-nfs nfs 12m
[root@node1 yaml]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-nfs Bound pv-nfs 2Gi RWO nfs

标签:kubectl,pv,yaml,pvc,详解,nfs,k8s,root
From: https://www.cnblogs.com/A121/p/17801843.html

相关文章

  • BFD的参数详解
    ver:BFD协议版本号,目前为1diag:诊断字,标明本地BFD系统最近一次会话状态发生的原因p:参数发生变化时,发送方再BFD报文中置该标志,接收方必须立即响应该报文F:响应p标志置位的回应报文中必须将F标志置位C:转发/控制分离标志,一旦置位,控制平面的变化不影响BFD检查A:认证标识,置1代表会话需要进行......
  • 软件测试|Python对JSON的解析和创建详解
    简介JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,已经成为当今互联网应用中广泛使用的数据格式之一。Python提供了内置的模块来解析和创建JSON数据,使得在Python中处理JSON变得非常简单。本文将详细介绍Python对JSON的解析和创建过程,并提供示例代码来帮助大家更好......
  • 软件测试|MySQL唯一约束详解
    简介MySQL唯一约束(UniqueKey)是指所有记录中字段的值不能重复出现。MySQL中的唯一约束是一种用于确保表中某列或多列的取值唯一的数据库约束。唯一约束的作用是防止表中出现重复的值,确保数据的完整性和一致性。在本文中,我们将详细介绍MySQL中唯一约束的定义、用法以及其在数据......
  • 软件测试|MySQL 非空约束详解
    简介MySQL中的非空约束(NOTNULLConstraint)是一种用于确保表中某列不允许为空值的数据库约束。非空约束的作用是保证特定列的数据始终包含有效值,防止在插入或更新操作时出现空值,从而维护数据的完整性和一致性。在本文中,我们将详细介绍MySQL中非空约束的定义、用法以及在数据库设......
  • 软件测试|MySQL算术运算符使用详解
    简介MySQL是一种流行的开源关系型数据库管理系统,广泛用于各种应用程序和网站的数据存储和管理。在MySQL中,算术运算符是执行数学计算的特殊符号,用于处理数字类型的数据。本文将详细介绍MySQL中常用的算术运算符及其使用方法。常用算术运算符算术运算符是SQL中最基本的运算符,M......
  • 软件测试|MySQL逻辑运算符使用详解
    简介在MySQL中,逻辑运算符用于处理布尔类型的数据,进行逻辑判断和组合条件。逻辑运算符主要包括AND、OR、NOT三种,它们可以帮助我们在查询和条件语句中进行复杂的逻辑操作。本文将详细介绍MySQL中逻辑运算符的使用方法和示例。AND运算符AND运算符用于将多个条件组合起来,要求所有......
  • 采购仪器预约管理系统思路详解,QPQ盐浴氮化处理
    成都工具研究所有限公司的前身是成都工具研究所,于1956年创建于北京,是原机械工业部的直属研究所,是我国机械工业的综合性工具科研机构。公司官网:http://www.ctri.com.cn/公司主要从事精密切削工具、精密测量仪器以及表面改性处理技术的技术研究、产品开发和应用服务。一、主机(仪器预......
  • k8s1.18参数详解
    -v,--vint日志级别详细程度的数字。--logtostderr默认值:true在标准错误而不是文件中输出日志记录。--bind-addressstring默认值:"0.0.0.0"用来监听--secure-port端口的IP地址。集群的其余部分以及CLI/web客户端必须可以访问所关联的接口。如果为空白或未指定......
  • 快速运维 - K8s
    更新日志:-2023.10.311055初始化HELMHelm是一个用于k8s的包管理器,使用helm之后就不需要了解k8s的yaml语法并编写应用部署文件,可以通过helm下载并在k8s上安装需要的应用。Helm还提供了k8s的软件部署,删除,升级,回滚应用的强大功能。列表列举安装的应用helmlist卸载卸......
  • 【面试题】详解JavaScript中的Map()
    JavaScript中的Map()JavaScript是一种动态、解释性的编程语言,用于开发web上的动态页面和交互式应用程序。与其他编程语言相比,JavaScript拥有更加灵活的内置数据类型,并且拥有更高级别的调试和错误处理工具。JavaScript的核心特征之一就是其内置的Map()数据结构,本文将详细介绍JavaScr......