K8s的网络共享存储原理
背景
Kubernetes对于有状态的容器应用或者对数据需要持久化的应用,不仅需要将容器内的目录挂载到宿主机的目录或者emptyDir临时存储
卷,而且需要更加可靠的存储来保存应用产生的重要数据,以便容器应用在重建之后仍然可以使用之前的数据。
PV
定义
PV是对底层网络共享存储的抽象。PV由管理员创建和配置,它与共享存储的具体实现直接相关。PV作为存储资源,包括:
- 存储能力
- 访问模式
- 存储类型
- 回收策略
- 后端存储类型
K8s支持的PV类型
- NFS
- AWS
- Fc等
PV的关键配置参数
- 存储能力——storage=xx
- 存储卷模式——volumeMode=xxx
- 访问模式AccessMode
- ReadWriteOnce(只读,且供一个Node挂载)
- ReadOnlyMany(只读,可供多个node挂载)
- ReadWriteMany(读写,可供多个node挂载)
- 存储类别——StorageClassName
- 回收策略——persistentVolumeReclaimPolicy
- 挂载参数——mountOptions
- 节点亲和性——nodeAffinity(只适用于Local存储卷)
PV生命周期
- Available——可用状态,还未与某个PVC绑定
- Bound——已与某个PVC绑定
- Released——绑定的PVC已经删除,资源已经释放,但是还没有被集群回收
- Failed——自动回收资源失败
PVC
定义
PVC则是用户对存储资源的一个“申请“。PVC消费PV资源,PVC可以申请特定的存储空间和访问模式。
StorageClass4种类型:快速存储、慢速存储、有数据冗余、无数据冗余。
PVC作为用户对存储资源的需求申请,主要包括:
- 存储空间请求
- 访问模式
- PV选择条件
- 存储类别等信息。
PVC的关键参数
- 资源请求——request.storage
- 访问模式AccessMode
- 存储卷模式——块存储,文件系统
- PV选择条件——label selector:matchLabels和matchExpressions
- 存储类别——StorageClassName
PV与PVC的生命周期
资源回收
静态模式
动态模式
注意
PV与PVC都受限于命名空间namespace,PVC在选择PV时受到namespace的限制,只有相同namespace的PV才能与PVC进行绑定。