Kubernetes PersistentVolume

本文将介绍 Kubernetes 中的 PersistentVolume。

一、什么是 PersistentVolume?

Pod 并没有持久化功能,一旦发生容器重建,容器将重新由固定的镜像文件生成,一切都会回到初始状态,数据也就丢失了。

因此,Kubernetes 设计了 PersistentVolume 对象,它专门用于表示持久存储设备。

需要注意的是,我们无需关心存储的底层实现,只需要知道它能够可靠安全地保管数据即可。它们一般会由系统管理员单独维护,只在 Kubernetes 中通过 PersistentVolume 做简单关联,这是因为 PersistentVolume 往往和存储设备、文件系统相关,对它们的管理超出了 Kubernetes 的能力范围。

二、什么是 PersistentVolumeClaim、StorageClass?

考虑到不同的存储设备存在着大量的差异:速度快慢、可否共享读写、容量大小…,这么多存储设备不适合直接管理。

因此,Kubernetes 设计了 PersistentVolumeClaim、StorageClass 这两个对象。

PersistentVolumeClaim,供 Pod 使用,相当于

它们的工作方式是这样的:

  • PersistentVolumeClaim 是 Pod 的助手,帮助 Pod 向 Kubernetes 申请存储资源
  • StorageClass 将 PersistentVolume 抽象为若干类型,穿插在 PersistentVolumeClaim 和 PersistentVolume 之间,比main二者的强绑定关系

三、PersistentVolume 的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Kubernetes的KPI版本号
apiVersion: v1
# 资源对象的类型 【Pod、Node、Job、Service等】
kind: PersistentVolume
# 元信息,用于标记资源对象
metadata:
# 名称
name: host-10m-pv
# 说明,描述资源对象的目标状态
spec:
# 分类名
storageClassName: host
# 访问模式
accessModes:
- ReadWriteOnce
# 容量
capacity:
storage: 10Mi
# 本地路径
hostPath:
path: /tmp/host-10m-pv/

具体来说:

  • accessModes 定义了存储设备的访问模式,共有以下三种:
    • ReadWriteOnce:可读可写;只能一个 Pod 挂载
    • ReadOnlyMany:可读不可写;能被若干 Pod 挂载
    • ReadWriteMany:可读可写;能被若干 Pod 挂载

四、PersistentVolumeClaim 的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Kubernetes的KPI版本号
apiVersion: v1
# 资源对象的类型 【Pod、Node、Job、Service等】
kind: PersistentVolumeClaim
# 元信息,用于标记资源对象
metadata:
# 名称
name: host-10m-pvc
# 说明,描述资源对象的目标状态
spec:
# 分类名
storageClassName: host
# 访问模式
accessModes:
- ReadWriteOnce
# 期望描述
resources:
requests:
storage: 5Mi

参考

  • Kubernetes
  • Kubernetes 入门实战课
  • 深入剖析 Kubernetes