Loading

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状态流转

 

posted @ 2022-11-20 11:22  屌丝逆袭记  阅读(55)  评论(0编辑  收藏  举报