1 什么是Persistent Volume?

在容器化应用中,Pod的生命周期是短暂的,当Pod终止时,其中的数据通常也会被销毁。为了解决这个问题,Kubernetes引入了Persistent Volume(PV)的概念。PV是集群中的一块持久化存储,它独立于Pod存在,可以被多个Pod共享,并且在Pod终止后仍然保留数据。

PV允许开发者将数据存储和Pod解耦,提供了一种灵活且可靠的存储解决方案。PV的生命周期与Pod无关,可以手动配置也可以使用动态存储类(StorageClass)来动态创建。

2 Persistent Volume的基本结构

PV有一些基本的属性和状态,这些属性决定了PV的可用性和使用方式。

2.1 Access Modes(访问模式)

PV支持不同的访问模式,它定义了Pod如何与PV进行交互。主要有以下三种访问模式:

  • ReadWriteOnce(RWO): 读写模式,只能被单个Pod挂载为读写模式。
  • ReadOnlyMany(ROX): 只读模式,可以被多个Pod挂载为只读模式。
  • ReadWriteMany(RWX): 读写模式,可以被多个Pod挂载为读写模式。

2.2 Storage Class(存储类)

Storage Class是一种动态创建PV的机制,它定义了PV的属性,包括存储类型、访问模式等。Storage Class可以根据需求动态地创建PV,使得存储的管理更加灵活。

2.3 Capacity(容量)

PV的容量定义了可以存储的数据量,以GiB或TiB为单位。Pod可以使用PV上的所有容量,但不会超过PV的限制。

2.4 Reclaim Policy(回收策略)

Reclaim Policy定义了当PV释放后的行为。主要有以下三种策略:

  • Retain: 保留,PV的数据会被保留,需要手动清理。
  • Recycle: 回收,PV的数据会被清空,重新变为可用状态。
  • Delete: 删除,PV的数据会被删除,PV也会被删除。

3 Persistent Volume的使用示例

为了更好地理解Persistent Volume的使用,以下是一个详细的示例,涉及PV的手动创建和使用。

步骤1:创建Persistent Volume

首先,我们创建一个PV,指定其访问模式、容量、回收策略等属性。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 1Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: manual
  hostPath:
    path: "/mnt/data"

在这个例子中,我们创建了一个1Gi容量的PV,使用了ReadWriteOnce的访问模式,并指定了Retain的回收策略。PV的存储类为manual,表示这是一个手动创建的PV。PV的存储路径为/mnt/data

步骤2:创建Persistent Volume Claim

PV只是存储资源的定义,要在Pod中使用这些资源,我们需要创建一个Persistent Volume Claim(PVC)。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: manual
  resources:
    requests:
      storage: 1Gi

在这个例子中,我们创建了一个PVC,请求1Gi容量,并指定了ReadWriteOnce的访问模式和manual的存储类。

步骤3:创建Pod

最后,我们创建一个Pod,并将PVC挂载到Pod的路径中。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: nginx
    volumeMounts:
    - name: my-storage
      mountPath: "/usr/share/nginx/html"
  volumes:
  - name: my-storage
    persistentVolumeClaim:
      claimName: my-pvc

这个Pod使用了Nginx镜像,并将PVC挂载到了/usr/share/nginx/html路径。这样,Pod就能够访问并写入PV中的持久化数据。

步骤4:验证

通过访问Pod中挂载的路径,我们可以验证数据是否能够持久化。

kubectl exec -it my-pod -- /bin/sh
# 在Pod中执行以下命令
echo "Hello, Persistent Volume!" > /usr/share/nginx/html/index.html
exit

通过访问PV的存储路径,我们也可以验证数据是否持久化。

cat /mnt/data/index.html
02-19 06:28