Kubernetes基础(十九)-k8s存储对象Persistent Volume Claim

1 什么是Persistent Volume Claim?

在容器编排中,Pod的生命周期是短暂的,当Pod终止时,其中的数据通常也会被销毁。为了解决这个问题,Kubernetes引入了Persistent Volume(PV)和Persistent Volume Claim(PVC)的概念。

PVC是对PV的一种声明,它定义了Pod对存储资源的需求。Pod通过PVC来请求PV,而PV则提供了实际的存储资源。PVC的引入使得开发者无需关心底层存储的细节,能够更灵活地使用和管理存储。

2 Persistent Volume Claim的基本结构

PVC有一些基本的属性和状态,这些属性决定了PVC的行为和与PV的关联。

2.1 Access Modes(访问模式)

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

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

2.2 Storage Class(存储类)

PVC可以选择性地指定Storage Class,用于指导Kubernetes动态地创建PV。Storage Class定义了PV的属性,包括存储类型、访问模式等。

2.3 Resources(资源需求)

PVC可以定义对存储资源的需求,包括容量和访问模式。这决定了K8s为Pod提供的PV的选择。

2.4 Status(状态)

PVC的状态包括当前的Phase,表示PVC的生命周期阶段,可能包括Pending、Bound、Lost等

3 Persistent Volume Claim的使用示例

为了更好地理解Persistent Volume Claim的使用,以下是一个详细的示例,涉及PVC的创建、Pod的声明和与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

接下来,我们创建一个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 Claim!" > /usr/share/nginx/html/index.html
exit

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

复制代码
cat /mnt/data/index.html

4 Persistent Volume Claim的优势

  1. 抽象存储细节: PVC允许Pod声明对存储的需求,而无需关心底层存储的细节。这使得应用程序更加灵活和可移植。
  2. 动态存储: 通过Storage Class,PVC可以实现动态地创建PV,使得存储的管理更加灵活,无需手动创建和管理PV。
  3. 持久化存储: PVC可以确保应用程序的数据在Pod重启或迁移时得以保留,提供了持久化存储的解决方案。
相关推荐
知已难寻6 小时前
第 2 篇 · 云的地基:服务器、存储、网络三大基础设施
运维·服务器·网络·云原生·云计算·负载均衡·1024程序员节
阿里云云原生10 小时前
车企数据隐私保护必修课:如何用 SLS mask 守住日志中的敏感信息
云原生
阿里云云原生11 小时前
切换模型会损失缓存,智能路由还省钱吗?
云原生
闲云野鹤在人间11 小时前
Kubernetes Service 与 kube-proxy 详解
云原生·容器·kubernetes
我不会起名字32212 小时前
节点 NotReady:kubelet 与容器运行时的 4 步排查
云原生·kubernetes·kubelet·排查
说实话起个名字真难啊12 小时前
实战docker部署dify及注意点
运维·docker·容器
闲云自留地13 小时前
K8s Service 全解:服务发现、四种类型、会话保持、金丝雀发布一篇通
容器·kubernetes·服务发现
分布式存储与RustFS13 小时前
GPU 在空转等数据?PyTorch 训练集进 RustFS 的三种接法
云原生·开源·对象存储·分布式存储·s3·rustfs·性能基准
choumin14 小时前
C++ 标准容器为什么不能存引用
c++·容器·引用类型
时间售卖铺16 小时前
MySQL 备份
运维·数据库·mysql·云原生