Kubernetes 的存储对象 - 持久卷 (Persistent Volume)

2024-05-10 渥太华微生活

os-persistent-volumes_2x.png


前言

Kubernetes(K8s)是一个强大的容器编排平台,为容器化应用程序提供了许多关键功能,包括持久化存储。

在K8s中,持久卷 (Persistent Volume,PV)是一个核心对象,用于抽象和管理集群中的持久化存储资源。

本文将深入研究K8s中的Persistent Volume的概念、工作原理,并通过详细的示例演示如何配置和使用Persistent Volume。


什么是Persistent Volume?

在容器化应用中,Pod的生命周期是短暂的,当Pod终止时,其中的数据通常也会被销毁。

为了解决这个问题,Kubernetes引入了Persistent Volume(PV)的概念。

PV是集群中的一块持久化存储,它独立于Pod存在,可以被多个Pod共享,并且在Pod终止后仍然保留数据。

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


Persistent Volume的基本结构

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

1、Access Modes(访问模式)

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

  • ReadWriteOnce(RWO): 读写模式,只能被单个Pod挂载为读写模式。

  • ReadOnlyMany(ROX): 只读模式,可以被多个Pod挂载为只读模式。

  • ReadWriteMany(RWX): 读写模式,可以被多个Pod挂载为读写模式。

2、Storage Class(存储类)

Storage Class 是一种动态创建PV的机制,它定义了PV的属性,包括存储类型、访问模式等。

Storage Class 可以根据需求动态地创建PV,使得存储的管理更加灵活。

3、Capacity(容量)

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

4、Reclaim Policy(回收策略)

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

  • Retain: 保留,PV的数据会被保留,需要手动清理。

  • Recycle: 回收,PV的数据会被清空,重新变为可用状态。

  • Delete: 删除,PV的数据会被删除,PV也会被删除。

1_b4TjjMQlGQANv5lOT9HjpQ.png


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

总结

通过本文的详细介绍和示例演示,我们深入了解了Kubernetes中的Persistent Volume。PV作为K8s中持久化存储的抽象,提供了一种灵活、可靠的方式来处理容器中的持久性数据。

了解Persistent Volume的基本结构、属性和使用方法,有助于开发者更好地配置和管理Kubernetes集群中的存储资源。

希望通过本文的介绍,读者能够更深入地理解Persistent Volume的原理和用法,为构建可靠、可扩展的容器化应用提供基础。

二维码 | 渥太华微生活

编者注:新闻取自各大新闻媒体,新闻内容并不代表本网立场!文字和图片来自网络,版权归原作者所有。如有侵权,请速联系小编,立即删除。

73
全部评论 (0)
展开快速发表评论

科技专栏