一、概念
在 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:
-
ReadWriteOnce (RWO):该卷可以被单个节点以读写方式挂载。这是最常见的访问模式,适用于大多数场景。
-
ReadOnlyMany (ROX):该卷可以被多个节点以只读方式挂载。适用于需要多个读取者的场景,如只读数据库。
-
ReadWriteMany (RWX):该卷可以被多个节点以读写方式挂载。适用于需要多个写入者的场景,但需要注意数据一致性问题。
三、回收策略
PV 的回收策略定义了当 PVC 被删除后 PV 的行为:
-
Retain:默认策略,PV 不会被自动删除,需要管理员手动回收。这适用于需要保留数据的场景。
-
Delete:删除 PVC 时,关联的 PV 也会被自动删除。这适用于不保留数据的场景。
四、状态说明
PV 的状态表示其当前状态:
-
Available:PV 可用,尚未绑定到任何 PVC。
-
Bound:PV 已绑定到某个 PVC。
-
Released:PVC 已被删除,但 PV 尚未被集群回收。
-
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 作为存储后端。
操作步骤:
-
替换
nfs-server.example.com
和/path/to/nfs
为实际的 NFS 服务器地址和路径。 -
应用 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
操作步骤:
-
应用 YAML 文件创建 PVC:
kubectl apply -f pvc.yaml
-
验证 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 服务的网页文件目录。
操作步骤:
-
应用 YAML 文件创建 Pod:
kubectl apply -f pod.yaml
-
验证 Pod 是否成功挂载 PVC: