首页 > 其他分享 >PV和PVC的生命周期

PV和PVC的生命周期

时间:2022-09-24 23:57:05浏览次数:65  
标签:master1 生命周期 pv pvc PVC PV k8s root

  PV是kubernetes集群的存储资源,而PVC则代表着资源需求。创建PVC时对PV发起的使用申请,即为“绑定”。PV和PVC是一一对应的关系,可用于响应PVC申请的PV必须要能够容纳PVC的请求条件,它们二者的交互遵循如下生命周期。

一、存储供给

  存储供给(Provisioning)是指为PVC准备可用的PV机制。kubernetes支持两种PV供给方式:静态供给和动态供给。

1. 静态供给

  静态供给是指由集群管理员手动创建一定数量的PV的资源供应方式。这些PV负责处理存储系统的细节,并将其抽象成易用的存储资源供用户使用。静态提供的PV可能属于某存储类,也可能没有存储类,这一点取决于管理员的设定。

  下面示例就是静态供给,手动创建PV,没有存储类的示例:

  创建nfs共享目录:

[root@k8s-master1 ~]# vim /etc/exports
[root@k8s-master1 ~]# export
export    exportfs
[root@k8s-master1 ~]# exportfs -arv
exporting 10.0.0.131/24:/data/volume_test/v1
exporting 10.0.0.131/24:/data/volumes

  创建pv资源:

[root@k8s-master1 pv]# cat pv-test.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-static-test
spec:
  capacity:
    storage: 1Gi
  accessModes: ["ReadWriteOnce"]
  nfs:
    path: /data/volume_test/v1
    server: 10.0.0.131
[root@k8s-master1 pv]# kubectl apply -f pv-test.yaml
persistentvolume/pv-static-test created
[root@k8s-master1 pv]# kubectl get pv -o wide
NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE   VOLUMEMODE
pv-static-test   1Gi        RWO            Retain           Available                                   15s   Filesystem

2. 动态供给

  不存在某静态的PV匹配到用户的PVC申请时,kubernetes集群会尝试为PVC动态创建符合需求的PV,此即为动态供给。这种方式依赖于存储类的辅助,PVC必须向一个事先存在的存储类发起动态分配PV的请求,没有指定存储类的PVC请求会被禁止使用动态创建PV的方式。

  下面示例就是动态供给,动态创建PV,PVC的创建依赖于存储类course-nfs-storage

[root@k8s-master1 storageclass]# cat test-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc-nfs-dynamic-001
spec:
  storageClassName: course-nfs-storage
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

二、 存储绑定

  用户基于一系列存储需求和访问模式定义好的PVC后,kubernetes系统的控制器即会为其查找匹配的PV,并于找到之后在此二者之间创建其关联的关系,而后它们二者之间的状态即转为“绑定(Binding)”。若PV是为PVC而动态创建的,则该PV专用于其PVC。

  若是无法为PVC找到可匹配的PV,则PVC将一直处于未绑定(unbound)状态,直到有符合条件的PV出现并完全绑定方式才可用。

1. 存储使用

  Pod资源基于persistentVolumeClaim卷类型的定义,将选定的PVC关联为存储卷,而后即可为内部的容器所使用的。对于支持多种访问模式的存储卷来说,用户需要额外指定要使用的模式。一旦完成将存储卷挂载至pod对象的容器中,其应用即可使用关联的PV提供的存储空间。

  创建PVC,关联到匹配的PV,PVC的状态处于Binding状态:

[root@k8s-master1 pv]# vim pvc-demo2.yaml
[root@k8s-master1 pv]# cat pvc-demo2.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-test
spec:
  accessModes: ["ReadWriteOnce"]
  resources:
    requests:
      storage: 1Gi
You have new mail in /var/spool/mail/root
[root@k8s-master1 pv]# kubectl apply -f pvc-demo2.yaml
persistentvolumeclaim/pvc-test created
[root@k8s-master1 pv]# kubectl get pvc -o wide
NAME       STATUS   VOLUME           CAPACITY   ACCESS MODES   STORAGECLASS   AGE   VOLUMEMODE
pvc-test   Bound    pv-static-test   1Gi        RWO                           6s    Filesystem 

  创建pod使用创建的PVC

[root@k8s-master1 pv]# cat pod-pvc.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pvc-pod
spec:
  containers:
  - name: nginx
    image: nginx:latest
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
  volumes:
  - name: html
    persistentVolumeClaim:
      claimName: pvc-test
[root@k8s-master1 pv]# kubectl apply -f pod-pvc.yaml
pod/pvc-pod created
[root@k8s-master1 pv]# kubectl get pods -o wide
NAME                                     READY   STATUS    RESTARTS   AGE     IP             NODE        NOMINATED NODE   READINESS GATES
nfs-client-provisioner-5d65b75f7-2f7qx   1/1     Running   3          5h15m   10.244.36.87   k8s-node1   <none>           <none>
pvc-pod                                  1/1     Running   0          6s      10.244.36.93   k8s-node1   <none>           <none>

  在NFS服务器的共享目录下创建访问页面:

[root@k8s-master1 ~]# cd /data/volume_test/v1
You have new mail in /var/spool/mail/root
[root@k8s-master1 v1]# echo "test pvc in nginx container" >>index.html
[root@k8s-master1 v1]# cat index.html
test pvc in nginx container
[root@k8s-master1 v1]#

  测试访问页面,查看数据是否已被同步到容器中

[root@k8s-master1 pv]# kubectl get pods -o wide
NAME                                     READY   STATUS    RESTARTS   AGE     IP             NODE        NOMINATED NODE   READINESS GATES
nfs-client-provisioner-5d65b75f7-2f7qx   1/1     Running   3          5h23m   10.244.36.87   k8s-node1   <none>           <none>
pvc-pod                                  1/1     Running   0          8m6s    10.244.36.94   k8s-node1   <none>           <none>
You have new mail in /var/spool/mail/root
[root@k8s-master1 pv]# curl 10.244.36.94
test pvc in nginx container
[root@k8s-master1 pv]#

  上述命令结果说明创建的PVC已被pvc-pod使用

2. PVC保护

  为了避免使用中的存储卷被移除而导致数据丢失,kubernetes 自1.9版本起引入了PVC保护机制。启用了此特性后,万一有用户删除了仍处于某pod资源使用中的pvc时,kubernetes不会立即予以移除,而是推迟到不再被任何pod资源使用后方才执行删除操作。处于此阶段的PVC资源的status字段为“Termination”,并且其Finalizers字段中包含“kubernetes.io/pvc-protection”。

  测试PVC的保护机制,删除pvc,查看pvc的状态变为Terminating:

[root@k8s-master1 pv]# kubectl get pvc -o  wide
NAME       STATUS   VOLUME           CAPACITY   ACCESS MODES   STORAGECLASS   AGE   VOLUMEMODE
pvc-test   Bound    pv-static-test   1Gi        RWO                           16m   Filesystem
[root@k8s-master1 pv]# kubectl delete pvc pvc-test
persistentvolumeclaim "pvc-test" deleted

[root@k8s-master1 ~]# kubectl get pvc -o wide
NAME       STATUS        VOLUME           CAPACITY   ACCESS MODES   STORAGECLASS   AGE   VOLUMEMODE
pvc-test   Terminating   pv-static-test   1Gi        RWO                           16m   Filesystem
[root@k8s-master1 ~]# kubectl describe pvc pvc-test
Name:          pvc-test
Namespace:     default
StorageClass:
Status:        Terminating (lasts 77s)
Volume:        pv-static-test
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      1Gi
Access Modes:  RWO
VolumeMode:    Filesystem
Used By:       pvc-pod
Events:        <none>
[root@k8s-master1 ~]#

  删除pod, 再次查看pvc,发现pvc已被删除

[root@k8s-master1 pv]# kubectl get pvc -o  wide
NAME       STATUS        VOLUME           CAPACITY   ACCESS MODES   STORAGECLASS   AGE   VOLUMEMODE
pvc-test   Terminating   pv-static-test   1Gi        RWO                           20m   Filesystem
[root@k8s-master1 pv]# kubectl get pods -o wide
NAME                                     READY   STATUS    RESTARTS   AGE     IP             NODE        NOMINATED NODE   READINESS GATES
nfs-client-provisioner-5d65b75f7-2f7qx   1/1     Running   3          5h31m   10.244.36.87   k8s-node1   <none>           <none>
pvc-pod                                  1/1     Running   0          16m     10.244.36.94   k8s-node1   <none>           <none>
[root@k8s-master1 pv]# kubectl delete pods pvc-pod
pod "pvc-pod" deleted
[root@k8s-master1 pv]# kubectl get pvc -o  wide
No resources found in default namespace.
[root@k8s-master1 pv]#

三、存储回收

  完成存储卷的使用目标后之后,即可删除PVC对象以便进行资源回收。不过,

 

  

标签:master1,生命周期,pv,pvc,PVC,PV,k8s,root
From: https://www.cnblogs.com/jiawei2527/p/16726305.html

相关文章

  • IPv4与IPv6的区别
    IPv4中规定IP地址长度为32,即有2^32-1个地址;而IPv6中IP地址的长度为128,即有2^128-1个地址。.IPv6的地址分配一开始就遵循聚类(Aggregation)的原则,这使得路由器能在路由表......
  • IPV4 与 IPV6 的区别
    IPV4的报文如图所示:  该图出自:https://blog.csdn.net/weixin_38280090/article/details/81171791 IPV6的报文如图所示:   该图出自:https://blog.csdn.net......
  • vue的生命周期
     1.创建前beforeCreateddata和methods还没有进行初始化 2.创建后createddata和methods已经初始化完成 3.渲染前beforeMount 已经编译好了模板字符串,但是......
  • IPV4与IPV6的区别
     什么是IPV4?什么是IPV6? 需要了解IPV4与IPV6的区别,首先需要知道IPV4与IPV6两者是什么网络协议。 IPV4(网际协议版本4)网际协议版本4(英语:InternetProtocolversion4......
  • IPV4和IPV6的区别与联系
    首先IPV4和IPV6的书写规则就有很大区别IPv4(InternetProtocolVersion4)TCP/P协议规定,IPv4地址使用32位的二进制来表示,也就是4个字节。例如,采用二进制表示方法的IPv4......
  • ipv4与ipv6的联系和区别
    什么是ipv4?IPv4是互联网协议第四版,是计算机网络使用的数据报传输机制,此协议是第一个被广泛部署的IP协议。每一个连接Internet的设备(不管是交换机、PC还是其他设备),都会为其......
  • IPv4和IPv6的区别和联系
    一、IPv6是InternetProtocolVersion6的缩写,译为“互联网协议”,用于替代IP协议(IPV4)的下一代IP协议。二、IPV6与IPV4的区别:1、IPv6的地址空间更大。(1)IPv4中规定IP地址长度......
  • ipv4和ipv6的区别与联系
    IPv4和IPv6之间的区别:1.地址类型。IPv4具有三种不同类型的地址:多播,广播和单播。IPv6还具有三种不同类型的地址:任意广播,单播和多播。2.数据包大小。对于IPv4,最小数据包大......
  • IPV4与IPV6的联系与区别
    IPv4IPv4是由 AdvancedResearchProjectsAgencyNetworks(ARPANET) 在1983年首次发明,并且一直被用作路由协议IP地址,以下是几点关于IPv4:IPv4使用了32位地址空间,总......
  • ipv4,ipv6的联系与区别
    联系:都是tcp/IP协议为连接到网络的每个设备分配的地址,让用户能够在网络上被识别,并允许计算机通过网络发送和接收数据。允许用户与他人通信。区别:ipv4先出现,技术老,地至少,用......