Kubernetes Volume 使用方法
常用 Volume 类型
以下是几种可用卷类型:
emptyDir
- 用于存储临时数据的简单空目录,生命周期和 Pod 一致。hostPath
- 用于将宿主机中的文件系统挂载到 Pod 中,生命周期不与 Pod 绑定。gitRepo
- 通过拉取 Git 仓库的内容来初始化的卷。已弃用nfs
- 挂载到 Pod 中的 NFS 共享文件系统。configMap
、secret
- 用于将 Kubernetes 中的部分资源和集群信息公开给 Pod 的特殊类型的卷persistentVolumeClaim
- 简称 PVC,使用预置和动态配置的持久卷。downwardAPI
- 在不使用 Kubernetes 客户端或 API 服务器的情况下获得自己或集群的信息 [5]
emptyDir 卷
emptyDir
表示与 Pod 生命周期相同的临时目录。[4]
emptyDir 配置示例
apiVersion: v1 |
emptyDir.medium
- 表示此目录应使用哪种类别的存储介质,默认为""
,表示使用节点的默认介质(一般是节点的本地磁盘)。可选值必须为""
或者Memory
,Memory
表示使用tmfs
(存在内存而非硬盘)
PersistentVolume 和 PersistentVolumeClaim
PersistentVolume (PV)
(持久化卷),是对底层的共享存储的一种抽象,PV 由管理员进行创建和配置,它和具体的底层的共享存储技术的实现方式有关,比如 Ceph
、GlusterFS
、NFS
等,都是通过插件机制完成与共享存储的对接。[1]
PersistentVolumeClaim(PVC)
是由用户发起的对存储的请求。 它类似于 Pod。 Pod 消耗节点资源,PVC 消耗 PV 资源。Pod 可以请求特定级别的资源(CPU和内存)。PVC 可以请求特定的存储大小和访问模式(例如,可以一次读/写或多次只读)匹配的 PV。
PVC
和 PV
中的 spec
关键字段要匹配,比如存储(storage)大小、读写模式,才能申请到对应的 PV 中的资源。PV 和 PVC 处于一一对应的关系。 [2]
PV
可以设置三种回收策略:
- 保留(Retain) - 保留产生的数据,PV 不进行处理
- 回收(Recycle) - 将执行清除操作,之后可以被新的pvc使用,需要插件支持。NFS 支持全部 3 种。
- 删除(Delete) - 删除pv和外部关联的存储资源,需要插件支持。
PV卷阶段状态
Available
– 资源尚未被 claim 使用Bound
– 卷已经被绑定到 claim 了Released
– claim 被删除,卷处于释放状态,但未被集群回收。Failed
– 卷自动回收失败
NFS 作为 PV
NFS 服务部署参考创建 PV
PV
属于集群级别的资源,不属于任何 namespace
apiVersion: v1 |
以上配置分别创建了 PV
nfs-pv-1
-accessModes
为["ReadWriteMany", "ReadOnlyMany"]
,大小为100Gi
nfs-pv-2
-accessModes
为["ReadWriteOnce"]
,大小为5Gi
查看 PV
kubectl get pv |
创建对应的 PVC 申请 PV 存储资源
PVC
属于 Namespace
基本的资源,需要在相应的 Namespace
中使用。
apiVersion: v1 |
以上 PVC 会匹配到持久卷 nfs-pv-1
查看 PVC
kubectl get pvc -A |
使用 PVC
apiVersion: v1 |
k8s 该 Pod 所在 NODE 节点服务器需要安装 nfs-utils
,否则挂载会报错,POD 无法运行。建议每台节点都安装
Pod 成功运行后,进入对应容器,会看到容器中通过 NFS 方式挂载了 NFS 共享存储。
kubectl exec -it vol-pvc -- df -h |
以上方法创建的 PV 为静态 PV,此种情况下,PV 和 PVC 具有一对一的绑定关系,即一个 PV 只能绑定到一个 PVC,如果要在另一个 Namespace 中使用同一个的 PV,是不被允许的,此时 PVC 会绑定失败: no persistent volumes available for this claim and no storage class is set
常见错误
PV 处于 Released 状态,新建 PVC 处于 Pending 状态
kubectl get pv |
如上所示,创建 PVC 后,PV 处于 Bound
状态,此时创建其他内容一样,只是 matadata.name
不同的 PVC ,PVC 无法成功创建,状态为 Pending
kubectl get pvc -A |
查看新建的 PVC pvc-api
的描述信息
kubectl describe pvc pvc-api -n default |
结果显示 no persistent volumes available for this claim and no storage class is set
,这是因为 PV 已经分配到了 PVC,无法再进行分配。
此时查看 PV 状态,处于 Bound
状态,CLAIM
为第一次创建 PVC
kubectl get pv |
此种情况下,执行以下命令手动删除已分配的 PVC
kubectl delete pvc -n default pvc-admin |
再次查看 PVC
kubectl get pvc -A |
发现 PVC 依然处于 Pending
状态,而 PV 状态变为了 Released
,无法再分配给其他 PVC。
解决方法
- 删除 PV
手动删除 PV,因为之前创建的 PV,其回收策略为Retain
,PV 删除后,数据依然存在。如果需要此存储作为 PV,创建新的 PV 即可,然后针对不同的 Namespace 创建对应的 PVC - 修改 PV 的回收策略
执行以下命令,修改 PV 的回收策略 [3]kubectl patch pv PV_NAME -p '{"spec":{"claimRef": null}}'