【Kubernetes】持久卷声明 PVC

持久卷声明Persistent Volume ClaimPVC),是用户对 Kubernetes 存储资源的一种请求。

通过使用 持久卷声明PVC),用户可以将实际的存储需求告诉给 Kubernetes,然后由 Kubernetes 在已有的 持久卷PV)中进行查找。当寻找到合适的 持久卷PV)时,Kubernetes 会将它提供给 持久卷声明PVC)使用。

因此,持久卷声明PVC)可以被看成资源消费者,它消费的是 持久卷PV)这种资源。

1.持久卷和持久卷声明的区别

持久卷持久卷声明 都是 Kubernetes 提供给用户使用的两种资源对象。通过使用 持久卷PV)和 持久卷声明PVC),可以封装集群数据持久化时的存储细节。

二者也有明显的区别,主要体现在以下两方面。

  • 二者的使用者不同。
    • Kubernetes 集群的管理员应当重点关注 持久卷PV)如何被创建、应该通过 持久卷PV)提供什么样的存储功能,却不需要关注它如何被使用。
    • Kubernetes 集群的用户,应重点关注 持久卷声明PVC)。用户只需要将存储的需求通过 持久卷声明PVC)挂载到 Pod 中即可,不需要关注需求如何被具体实现。
  • 二者所承担的任务不同。
    • 持久卷PV)可以被看成资源的生产者,而 持久卷声明PVC)可以被看成资源的消费者。持久卷PV)负责生成存储的资源,并提供给 持久卷声明PVC)使用。
    • 持久卷声明PVC)在消费 持久卷PV)时,可以向 持久卷PV)申请存储资源的大小及访问模式等。

在这里插入图片描述

2.在 Pod 中使用持久卷声明

在《持久卷 PV》中已经创建了一个 持久卷 pv-demo-1

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-demo-1
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: slow
  nfs:
    server: 172.30.1.2
    path: /nfs

下面在 Pod 中创建一个 持久卷声明 来使用它。

编辑 pvc-demo-1.yaml 文件,在其中输入以下内容。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-demo-1
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: slow

执行 kubectl apply -f 命令创建一个 PVC 资源。

kubectl apply -f pvc-demo-1.yaml

查看创建的 持久卷(PV)和 持久卷声明(PVC),如下图所示。

kubectl get pv,pvc

在这里插入图片描述

🚀可以看到,在创建了 持久卷声明 pvc-demo-1 后,持久卷 pv-demo-1 的状态会自动地从 Available 变成 Bound,并且自动匹配了 pvc-demo-1。这种自动匹配是通过存储类 storageClass 来实现的,因为在 pv-demo-1pvc-demo-1 的描述文件中都指定了 storageClassName: slow 字段。

编辑 pvc-pod-demo1.yaml 文件以创建 Pod 来使用持久卷声明对象,在文件中输入以下内容。

apiVersion: v1
kind: Pod
metadata:
  name: pvc-pod-demo1
spec:
  containers:
    - name: pvc-pod-container
      image: busybox
      imagePullPolicy: IfNotPresent
      args:
      - /bin/sh
      - -c
      - sleep 30000
      volumeMounts:
      - mountPath: "/mydata"
        name: mydata
  volumes:
    - name: mydata
      persistentVolumeClaim:
        claimName: pvc-demo-1

🚀 在 pvc-pod-demo1.yaml 描述文件中,通过 volumes.persistentVolumeClaim 字段指定了 持久卷声明(PVC)的对象为 pvc-demo-1,并将其挂载到了容器内部的 /mydata 目录下,而 持久卷声明 对象 pvc-demo-1 又自动匹配了 持久卷(PV)对象 pv-demo-1。因此,最终的效果是:把网络数据卷 NFS 挂载到了容器的 /mydata 目录下了。

执行 kubectl apply -f 命令。

kubectl apply -f pvc-pod-demo1.yaml

执行 kubectl exec -it 命令进入容器内。

kubectl exec -it pvc-pod-demo1 -c pvc-pod-container sh

查看容器内的 /mydata 目录。

ls /mydata/
more /mydata/index.html

在这里插入图片描述

🚀 /mydata 目录下的内容就是在《K8s 持久化存储方式》中创建在 NFS Server 上的 Nginx 的首页 index.html

3.storageClass 详解

持久卷(PV)对象可以属于某一个存储类 storageClass。

  • 如果属于特定存储类的 持久卷声明(PVC)对象请求存储资源,则它只能请求与其对应存储类所标识的 持久卷(PV)对象。
  • 如果 持久卷(PV)对象没有设置存储类,则它只能被没有指定存储类的 持久卷声明(PVC)对象请求。

下面是 Kubernetes 官方提供的一个创建存储类 storageClass 的示例。该存储类使用 NFS(网络文件系统)的制备器来提供存储资源。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: example-nfs
provisioner: example.com/external-nfs
parameters:
  server: "nfs-server.example.com"
  path: "/share"
  readOnly: "false"

从示例中可以看出,在存储类 storageClass 的定义中包含 provisionerparametersreclaimPolicy 字段。这些字段会在存储类 storageClass 需要动态分配 持久卷(PV)时被使用。

在这 3 个字段中,只有 provisioner(制备器)字段是必需的,它决定在创建 PV 资源时使用哪种类型的卷插件作为存储资源。例如,在该示例中使用 example.com/external-nfs 作为 PV 对象的制备器,该制备器通过 NFS 的方式提供存储资源。因此,在存储类 storageClass 的最后通过 parameters 参数指定了 NFS 的地址信息。

每一个被创建的 持久卷(PV)对象会有一个存储资源的回收策略(通过 reclaimPolicy 字段指定)。该字段的值可以是 DeleteRetain,默认值是 Delete

下面是 Kubernetes 官方提供的另一个存储类示例,该存储类使用 Glusterfs 插件来提供相应的存储资源。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: slow
provisioner: kubernetes.io/glusterfs
parameters :
  resturl: "http://127.0.0.1:8081"
  clusterid: "630372ccdc720a92c681fb928f27b53f"
  restauthenabled: "true"
  restuser: "admin"
  secretNamespace: "default"
  secretName: "heketi-secret"
  gidMin: "40000"
  gidMax: "50000"
  volumetype: "replicate:3"
  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

G皮T

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值