一、 k8s持久化存储概述
1. k8s架构
k8s的master在真正的工业上产中一般是多个,而不是一个。但一般是奇数个,比如说3或者5个。在k8s上面如果想要做应用的持久化,肯定需要有存储的。而且这个存储,必须要是可以share的。为什么呢?因为pod运行在不同的节点上。我们希望在pod发生变化的时候,在某些场景下满足存储可以“跟着”pod“走”到不同的结点上去。比如说statefulset,第一次起在一号结点上,如果对应的是专属于node1的stateful1这个卷,那么当pod跑到二号结点上,此时它的卷又应该跑到专属于node2的statefule2这个卷,那么久无法保证之前在node1上面的数据的可用性。因此,卷设计成可以share的,这样来保证在任何一个pod上都可以去使用。
存储卷可以有很多种存储类型,比如说ceph, NFS, Block storage.
2. PV和PVC
(1)Persistent Volume(PV)
PV是集群中的一块网络存储空间(它是集群概念。可以是一块盘,也可以是NFS的目录,分配给不同的结点去使用)
PV和kubernetes的node一样,同属于集群资源层的概念(被整个系统所占有,不分namespace)
PV和kubernetes Volume(k8s最基本的单位是pod,一个pod中可以有多个容器,每个容器都可以有Volume.它指的是:一个pod内不同的容器共享的卷。这里的卷和pod的生命周期是相同的)类似,不同之处为PV的生命周期和使用PV的pod的生命周期相互独立
(2)Persistent Volume Claim(PVC)
PVC是用户对存储资源的请求(是消费者的概念)
PVC和Kubernetes Pod一样,同属资源消费者的概念,即Pod请求CPU和内存资源,PVC请求存储空间和访问权限
总结:pod和pvc两者合并到一起是一个完整的应用,它们都属于是消费者,是属于具体的命名空间的。而pv是属于集群的,pv和pvc成对出现。
3. PV的概念
(1)pv可以设置三种回收策略:保留(Retain)、回收(recycle)和删除(Delete)
- 保留策略: 允许人工处理保留的数据
- 删除策略: 将删除pv和外部关联的存储资源,需要插件支持
- 回首策略: 将执行清楚操作,之后可以被新的pvc使用,需要插件支持。新的系统已经被retain和delete替代
(2)pv的状态
- Available 资源尚未被claim使用
- Bound 已经绑定到某个PVC上
- Release 对应的pvc已经被删除,但是资源还没有被集群回收
- Failed 自动回收失效
(3)访问权限
- ReadWriteOnce 被单个节点mount为读写rw模式
- ReadOnlyMany 被多个节点mount为只读ro模式
- ReadWriteMany 被多个节点mount为读写rw模式