Kubernetes 中的 PersistentVolume 与 PersistentVolumeClaim 详解

一、概念

在 Kubernetes 集群中,存储资源和计算资源(如 CPU 和内存)是分开管理的。PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 是 Kubernetes 提供的用于管理存储资源的抽象概念

PersistentVolume (持久卷,PV)

PV 是集群中的一块存储,它已经预先配置好,可供用户使用。它类似于云提供商的虚拟机磁盘,或者数据中心的物理硬盘。PV 是集群资源,由 Kubernetes 管理员预先配置,或者通过动态供应(Dynamic Provisioning)自动创建。

PV 具有以下特点

  • 独立于 Pod 生命周期:PV 的生命周期与使用它的 Pod 分开,即使 Pod 被删除,PV 也不会被删除,其中的数据会保留。

  • 持久化存储:PV 提供持久化存储,数据可以跨 Pod 生命周期持久保存。

  • 多种存储类型:支持多种存储类型,如 NFS、iSCSI、云存储等。

PersistentVolumeClaim (持久卷声明,PVC)

PVC 是用户对存储的请求。它指定了存储的大小、访问模式和存储类型等要求。当用户创建一个 PVC 时,Kubernetes 会根据这些要求找到一个匹配的 PV 来绑定。

PVC 具有以下特点

  • 请求存储:用户通过 PVC 请求特定大小和访问模式的存储。

  • 绑定到 PV:当一个 PVC 被创建时,Kubernetes 会找到一个匹配的 PV 并将其绑定到 PVC 上。如果没有匹配的 PV,PVC 会保持在未绑定状态,直到合适的 PV 出现。

  • 动态供应:如果集群中没有合适的 PV,且启用了动态供应,Kubernetes 可以自动创建一个新的 PV 来满足 PVC 的要求。

二、访问模式

PV 支持不同的访问模式,这些模式定义了 Pod 如何访问 PV

  1. ReadWriteOnce (RWO):该卷可以被单个节点读写方式挂载。这是最常见的访问模式,适用于大多数场景。

  2. ReadOnlyMany (ROX):该卷可以被多个节点只读方式挂载。适用于需要多个读取者的场景,如只读数据库。

  3. ReadWriteMany (RWX):该卷可以被多个节点读写方式挂载。适用于需要多个写入者的场景,但需要注意数据一致性问题。

三、回收策略

PV 的回收策略定义了当 PVC 被删除后 PV 的行为:

  1. Retain:默认策略,PV 不会被自动删除,需要管理员手动回收。这适用于需要保留数据的场景。

  2. Delete:删除 PVC 时,关联的 PV 也会被自动删除。这适用于不保留数据的场景。

四、状态说明

PV 的状态表示其当前状态:

  1. Available:PV 可用,尚未绑定到任何 PVC。

  2. Bound:PV 已绑定到某个 PVC。

  3. Released:PVC 已被删除,但 PV 尚未被集群回收。

  4. Failed:PV 的自动回收操作失败。

五、静态配置 PV 和 PVC

配置好nfs服务

mkdir /nfsdata
#部署nfs主机
[root@reg ~]# dnf install nfs-utils -y
[root@reg ~]# systemctl enable --now nfs-server.service

[root@reg ~]# vim /etc/exports
/nfsdata   *(rw,sync,no_root_squash)

[root@reg ~]# exportfs -rv
exporting *:/nfsdata

[root@reg ~]# showmount  -e
/nfsdata *

#在k8s所有节点中安装nfs-utils
[root@k8s-master & node1 & node2  ~]# dnf install nfs-utils -y

5.1 创建 PV

创建一个名为 pv.yaml 的文件,定义一个静态 PV:

apiVersion: v1  # 指定 Kubernetes API 的版本
kind: PersistentVolume  # 定义资源类型为 PersistentVolume
metadata:  # PV 的元数据部分
  name: my-pv  # 为这个 PV 指定一个名称
spec:  # PV 的具体规格和配置
  capacity:  # 定义 PV 的存储容量
    storage: 10Gi  # 指定存储容量为 10 GiB
  volumeMode: Filesystem  # 指定卷的模式为文件系统
  accessModes:  # 定义 PV 的访问模式
  - ReadWriteOnce  # 该 PV 可以被单个节点以读写方式挂载
  persistentVolumeReclaimPolicy: Retain  # 当关联的 PVC 被删除后,保留 PV
  storageClassName: standard  # 指定存储类名称,用于分类存储
  nfs:  # 定义 NFS 类型的存储
    path: /exports  # 指定 NFS 服务器上的路径
    server: nfs-server.example.com  # 指定 NFS 服务器的地址

这个配置文件定义了一个名为 my-pv 的 PersistentVolume,它使用 NFS 作为存储后端。

操作步骤

  1. 替换 nfs-server.example.com/path/to/nfs 为实际的 NFS 服务器地址和路径。

  2. 应用 YAML 文件创建 PV:

kubectl apply -f pv.yaml

5.2 创建 PVC

创建一个名为 pvc.yaml 的文件,定义一个 PVC:

apiVersion: v1  # 指定 Kubernetes API 的版本为 v1
kind: PersistentVolumeClaim  # 定义资源类型为 PersistentVolumeClaim
metadata:  # 定义 PVC 的元数据
  name: my-pvc  # 为这个 PVC 指定一个名称
spec:  # PVC 的具体规格和配置
  accessModes:  # 定义 PVC 所请求的卷的访问模式
  - ReadWriteOnce  # 该 PVC 请求的卷可以被单个节点以读写方式挂载
  resources:  # 定义 PVC 请求的资源规格
    requests:  # 指定对存储资源的请求
      storage: 3Gi  # 请求的存储容量为 3 GiB
  storageClassName: standard  # 指定存储类名称,用于选择匹配相应的 PV 和存储解决方案

这个配置文件定义了一个名为 my-pvc 的 PersistentVolumeClaim,它请求一个可以被单个节点以读写方式挂载的存储卷,请求的存储容量为 3 GiB,并且指定了存储类为 standard 

操作步骤

  1. 应用 YAML 文件创建 PVC:

kubectl apply -f pvc.yaml
  1. 验证 PVC 是否绑定到 PV:

kubectl get pvc my-pvc

六、在 Pod 中使用 PVC

创建一个名为 pod.yaml 的文件,定义一个使用 PVC 的 Pod:

apiVersion: v1  # 指定 Kubernetes API 的版本
kind: Pod  # 定义资源类型为 Pod
metadata:  # Pod 的元数据部分
  name: my-pod  # 为这个 Pod 指定一个名称
spec:  # Pod 的具体规格和配置
  containers:  # 定义 Pod 中的容器列表
  - name: my-container  # 为容器指定一个名称
    image: nginx  # 指定容器使用的镜像为 nginx
    volumeMounts:  # 定义容器需要挂载的卷
    - name: my-pv  # 引用在 volumes 中定义的卷名称
      mountPath: /usr/share/nginx/html  # 指定容器内部的挂载路径
  volumes:  # 定义 Pod 可以使用的卷列表
  - name: my-pv  # 为卷指定一个名称
    persistentVolumeClaim:  # 指定卷的类型为 PersistentVolumeClaim
      claimName: my-pvc  # 指定要使用的 PVC 的名称

这个配置文件定义了一个名为 my-pod 的 Pod,其中包含一个使用 nginx 镜像的容器。容器启动后会将 PVC my-pvc 挂载到 /usr/share/nginx/html 路径,这通常用于 Nginx 服务的网页文件目录。 

操作步骤

  1. 应用 YAML 文件创建 Pod:

kubectl apply -f pod.yaml
  1. 验证 Pod 是否成功挂载 PVC:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值