kubernetes存储方案(三):Heketi+GlusterFS+PV+PVC
PV的介绍
- PersistentVolume(PV) 是集群中由管理员配置的一段网络存储。集群中的资源就像一个节点是一个集群资源,可以从远程的NFS 或分布式对象存储系统中创建得来(PV 存储空间大小、访问方式)。
- PV 是诸如卷之类的卷插件,但是只有独立于使用 PV 的任何单个 pod 的生命周期。
- 该 API 对象捕获存储的实现细节,即 NFS,ISCSI 或云提供商特定的存储系统。
- PV 就是从存储设备中的空间创建出一个存储资源。
PVC的介绍
- PersistentVolumeClaim(PVC) 是用户存储的请求。PVC 的使用逻辑:在 pod 中定义一个存储卷(该存储卷类型为PVC),定义的时候直按指定大小,PVC 必须与对应的 PV 建立关系,PVC 会根据定义去 PV 申请,而 PV是由存储空间创建出来的。PV 和PVC 是 kubernetes 抽象出来的一种存储资源。
- 虽然 PersistentVolumeClaims 允许用户使用抽象存储资源,但是常见的需求是,用户需要根据不同的需求去创建PV,用于不同的场景。而此时需要集群管理员提供不同需求的 PV,而不仅仅是 PV 的大小和访问模式,但又不需要用户了解这些卷的实现细节。对于这样的需求,此时可以采用 storageclass 资源。
PV 与 PVC
- PV 是集群中的资源,PVC 是对这些资源的请求,也是对资源的索引检查。
PV 与 PVC生命周期
PV 和 PVC 之间的相互作用遵循这个生命周期:
-
Provisioning(配置) —> Binding(绑定) —> Using(使用) —> Releasing(释放) —> Recycling(回收)
-
Provisioning,即 PV 的创建,可以直接创建 PV(静态方式),也可以使用 StorageClass 动态创建
-
Binding,将 PV 分配给 PVC
-
Using,Pod 通过 PVC 使用该Volume,并可以通过准入控制StorageProtection(1.9及以前版本为PVCProtection) 阻止删除正在使用的PVC
-
Releasing,Pod 释放 Volume 并删除 PVC
-
Recycling,回收 PV,可以保留 PV 以便下次使用,也可以直接从云存储中删除
根据这 5 个阶段,PV 的状态有以下 4 种:
-
Available(可用):表示可用状态,还未被任何 PVC 绑定
-
Bound(已绑定):表示 PV 已经绑定到 PVC
-
Released(已释放):表示 PVC 被删掉,但是资源尚未被集群回收
-
Failed(失败):表示该 PV 的自动回收失败
一个PV从创建到销毁的具体流程
- 一个PV创建完后状态会变成Available,等待被PVC绑定。
- 一旦被PVC邦定,PV的状态会变成Bound,就可以被定义了相应PVC的Pod使用。
- Pod使用完后会释放PV,PV的状态变成Released。
- 变成Released的PV会根据定义的回收策略做相应的回收工作。
三种回收策略
有三种回收策略,Retain、Delete和Recycle。
- Retain就是保留现场,K8S集群什么也不做,等待用户手动去处理PV里的数据,处理完后,再手动删除PV。
- Delete策略,K8S会自动删除该PV及里面的数据。
- Recycle方式,K8S会将PV里的数据删除,然后把PV的状态变成Available,又可以被新的PVC绑定使用。
基于Heketi+GlusterFS使用pv和pvc
Heketi+GlusterFS部署安装请参考:https://www.cnblogs.com/zoujiaojiao/p/17676234.html
在glusterfs上创建一个volume
登录安装了heketi的服务器,使用heketi命令添加一个卷
# heketi-cli volume create --name dmp-dev --size 10 --replica 2 --user admin --secret adminkey
创建glusterfs的endpoint和service
这样做的好处:不需要在每个k8s节点上挂载glusterfs。
apiVersion: v1
kind: Endpoints
metadata:
labels:
app: dmp
name: glusterfs
namespace: dmp-dev
subsets:
- addresses:
- ip: 10.1.30.32
ports:
- port: 1
protocol: TCP
- addresses:
- ip: 10.1.30.30
ports:
- port: 1
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: glusterfs
namespace: dmp-dev
labels:
app: dmp
spec:
ports:
- port: 1
PV 和 PVC 的配置
volumeMounts:
- mountPath: /datart/files #容器内路径
name: dmp-datart #这个pvc的名称与pv的名称一致
volumes:
- name: dmp-datart #这个是pv的名称
glusterfs: #这个是glusterfs
endpoints: glusterfs
path: dmp-dev