开发者学堂课程【Kubernetes 入门: 应用存储和持久化数据卷:核心知识(一)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/51/detail/1015
应用存储和持久化数据卷:核心知识(一)
内容介绍:
一、Volumes 介绍
二、用例解读
三、操作演示
四、架构设计
五、下节预告
一、Volumes 介绍
1、Pod Volumes
l 如果一个 Pod 中某一个容器异常退出,被 kubelet 拉起如何保证之前产生的重要数据不丢?
l 同一个 Pod 的多个容器如何共享数据?
2、Kubernetes Volume 类型:
l 本地存储: emptydir/hostpath …
l 网络存储:
in-tree: awsElasticBlockStore/gcePersistentDisk/nfs …out-of-tree: flexvolume/csi
等网络存储volume plugins
l
Projected Volume: secret/configmap/downwardAPl/serviceAccountToken
3、PVC 与 PV 体系
Persistent Volumes
Pod 中声明的 volume 的生命周期与 Pod 相同,以下常见场景:
1. Pod销毁重建(如 Deployment 管理的 Pod 镜像升级)
2.宿主机故障迁移(如 StatefulSet 管理的 Pod 带远程 volume 迁移)
3.多Pod共享同一个数据 volume
4.数据 volume snapshot, resize 等功能的扩展实现
不足之处:
使用 Pod Volumes 无法准确表达数据 volume 复用/共享语义,新功能扩展很难实现。
优化:
如果能将存储与计算分离,使用不同的组件(Controllers)管理存储与计算资源,解耦 Pod 与 Volume 的生命周期关联,可以很好的解决这些场景下的问题。
二、用例解读
1、PersistentVolumeClaim ( PVC)设计意图
有了PV,为什么又设计了 PVC?
l 职责分离,PVC 中只用声明自己需要的存储 size、access mode (单 node 独占还是多 node 共享?只读还是读写访问?)等业务真正关心的存储需求(不用关心存储实现细节),PV 和其对应的后端存储信息则由交给 cluster admin 统一运维和管控,安全访问策略更容易控制。
l PVC 简化了 User 对存储的需求,PV 才是存储的实际信息的承载体,通过 kube-controller-manager 中的 PersisentVolumeController 将 PVC 与合适的 PV bound 到一起,从而满足 User 对存储的实际需求。
l PVC 像是面向对象编程中抽象出来的接口,PV 是接口对应的实现。
2、Static Volume Provisioning
Static Volume Provisioning 的不足:Cluster Admin 需要提前规化或预测存储需求,而 User 的需求是多样化的,很容易导致 User 提交的 PVC 找不到合适的 PV。
更好的方式:
Cluster Admin 只创建不同类型存储的模板,User 在 PVC 中指定使用哪种存储模板以及自己需要的大小、访问方式等参数,然后 K8s 自动生成相应的 PV 对象。
3、Dynamic Volume Provisioning
这里的 StorageClass 就是前文所说的创建 PV 的模板,它包含了创建某种具体类型 PV 所需的参数信息,User 无需关心这些 PV 的细节。
而 K8s 则会结合 PVC 和 SC 两者的信息动态创建 PV 对象。
4、Pod Volumes 使用
spec.volumes 声明 pod 的 volumes 信息
spec.containers.volumeMounts 声明container 如何使用 pod 的 volumes
多个 container 共享同一个 volume 时,可以通过.spec.containers.volumeMounts.subPath 隔离不同容器在同个 volume 上数据存储的路径
5、Static Volume Provisioning
以使用阿里云文件存储(NAS)为例:
Ø Cluster Admin:
l 通过阿里云文件存储控制台,创建 NAS 文件系统和添加挂载点。
l 创建 PV 对象,将 NAS 文件系统大小,挂载点,以及 PV 的 access mode,reclaim policy 等信息添加到 PV 对象中。
User:
1.创建 PVC 对象,声明存储需求。
2.创建应用 pod 并通过在.spec.volumes 中通过 PVC 声明 volume,通
过.spec.containers.volumeMounts 声明 container 挂载使用该 volume。