在 Kubemetes 集群中为 了使应用能够正常请求存储资源, 同时避免处理基础设 施细节, 引入了两个新的资源, 分别是持久卷和持久卷声明。
- PersistentVolume (持久卷, 简称 PV)
- PersistentVolumeClaim(持久卷声明,简称 PVC)
这两者之间的关系,可以根据下面的关系图简单的了解

首先,集群上首先需要创建类似于nfs类型的网络存储,然后管理员通过创建PV持久卷申请存储资源,PV持久卷声明了申请的空间大小和操作权限,POD不能直接使用PV创建的持久卷,需要借助于PVC持久卷声明来实现持久化存储。
PV示例
这里简单的使用了hostPath示例,直接使用宿主机的存储,实际使用中一般为nfs类的网络存储。
- ReadWriteOnce(RWO):是最基本的方式,可读可写,但只支持被单个 Pod 挂载。
- ReadOnlyMany(ROX):可以以只读的方式被多个 Pod 挂载。
- ReadWriteMany(RWX):这种存储可以以读写的方式被多个 Pod 共享。
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
#nfs:
# path: /tmp
# server: xx.xx.xx.xx
PVC示例
假设现在需要部署一个需要持久化存储的 pod,将要用到之前创建的持久卷, 但是不能直接在 pod 内使用,需要先声明 一个 。为了像使用Volume那样使用这个PV,创建一个PVC对象,并在Pod定义中使用这个PVC。
我们可以看到以下配置:
storageClassName:manual
:此配置用于绑定PVC和PV,可以看到PV上面定义的storageClassName:manual
与PVC的一致;
accessModes: ReadWriteOnce
:可读可写
storage: 20Gi
:存储大小20Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
spec:
storageClassName: manual
accessModes: # PVC也需要定义访问模式,不过它的模式一定是和现有PV相同或者是它的子集,否则匹配不到PV,这里我们使用的是hostPath模式,只支持ReadWriteOnce,若使用nfs,则支持以上三种
- ReadWriteOnce
resources: # 定义资源要求PV满足这个PVC的要求才会被匹配到
requests:
storage: 20Gi
在pod中的使用跟volume类似
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
StorageClass
如你所见,使用持久卷和持久卷声 明可以轻松获得持久化存储资源,无须研发人员处理下面实际使用的存储技术,但这仍然 需要一个集群管理员来支 持实际的存储 。幸运的是, Kubemetes 还可以通过动态配置持久卷来自动执行此任务。
集群管理员可以创建一个持久卷配置,并定义一个或多个 StorageClass对象, 从而让用户选择他们想要的持久卷类型而不仅仅只是创建持久卷 。 用户可以在其持 久卷声明中引用 Storag巳Class,而配置程序在配置持久存储时将采用这一点。
PV是运维人员来创建的,开发操作PVC,可是大规模集群中可能会有很多PV,如果这些PV都需要运维手动来处理这也是一件很繁琐的事情,所以就有了StorageClass,它的作用就是动态创建PV模板。
创建StorageClass里面需要定义PV属性比如存储类型、大小等;另外创建这种PV需要用到存储插件。最终效果是,用户提交PVC,里面指定存储类型,如果符合我们定义的StorageClass,则会为其自动创建PV并进行绑定。
具体的nfs这一块待完善。。。
网友评论