k8s应用存储和持久化
1.Pod Volumes
问题一:
如果 pod 中的某一个容器在运行时异常退出,被 kubelet 重新拉起之后,如何保证之前容器产生的重要数据没有丢失?
问题二:
如果同一个 pod 中的多个容器想要共享数据,应该如何去做?
Volumes 类型
1.本地存储
2.网络存储
1)in-tree:存储于k8s集群内部的网络存储库
2)out-of-tree:为解耦而生的一个网络存储,主推模式
3.Projected Volume:secret/configmap/downwardAPI/ServiceAccountToken
4.PVC与PV体系
PVC与PV体系介绍
疑问:有了PV,为啥有设计了PVC呢?
1.职责分离,PVC中只用声明自己需要的存储siza、access mode等业务真正关心的存储需求,PV和其对应的后端存储信息则由Cluster admin统一运维和管理,安全访问策略更容易控制。
2.PVC简化了User对存储的需求,PV才是存储的实际信息的承载体,通过kube-controller-manager中的PersisentVolumeController将PVC与合适的PV 绑定到一起,从而满足User对存储的实需求。
3.PVC像是面向对象编程中抽象出来的接口,PV是对接口对应的实现。
PVC模式
1.静态Volume
K8S管理员预先分配一起pv,用户提交pvc请求后系统会根剧pvc的大小等规则去与对应的pv和pvc绑定,然后使用,如下图:
静态Volume的不足在于需要提前分配一些不同大小的pv,而User的需求是多样化的,很容易导致User提交的Pvc找不到合适的PV;
更好的方式是集群管理员只创建不同类型的模版,User在PVC中指定使用哪种存储模版以及自己需要的大小、访问方式等,然后K8S自动生成相应的PV对象并绑定,这种方式叫做动态Volume,如下图
2.Pod Volumes使用
1).spec.volumes生命Pod的volumes信息
2).spec.container.volumeMount声明container如何使用pod的volumes
3)多个container共享同一个volume时,可以通过.spec.containers.volumeMounts.subPath隔离不同容器在同一个volume上数据存储的路径
PV Spec其它重要字段解析
Capacity:存储总空间
AccessModes:PV访问策略控制列表,必须同PVC的访问策略控制列表匹配才能绑定
- ReadWriteOnce 只允许单Node访问
- ReadOnlyMany 允许多个Node只读访问
- ReadWriteMany允许多Node读写访问
一个PV可以设置多个访问策略,PVC与PV绑定时,PV Controller会优先知道哦啊哦AccessModes列表最短并且匹配PVC AccessModes 列表中的PV集合,然后从该集合中找到Capaciity最小且复核PVC size需求的PV对象
PersistentVolumeReclaimPolicy:PV被release之后(与之绑定的PVC被删除)回收再利用策略
- Recycle(已废弃,不支持使用)
- Delete:volume被Released之后直接Delete,需要Volume Plugin支持
- Retain:默认策略,由系统管理员来手动管理Volume
StorageClassName:PVC可通过该字段找到对应的PV,也可通过该字段对应的storageclass从而动态Provisioning新PV对象。
NodeAffinity:限制可以访问该volume的nodes,对使用该volume的pod的调度有影响
PV状态流转
、