深入剖析 Kubernetes
张磊
Kubernetes 社区资深成员与项目维护者
116706 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 57 讲
再谈开源与社区 (1讲)
结束语 (1讲)
深入剖析 Kubernetes
15
15
1.0x
00:00/00:00
登录|注册

28 | PV、PVC、StorageClass,这些到底在说啥?

是否有更简单、足以解决90%需求的Volume用法?
PV、PVC的设计是否过度?
由Volume Controller和VolumeManagerReconciler负责
两阶段处理:Attach和Mount
撮合PV和PVC的“红娘”
维护PV和PVC的绑定关系
减轻运维人员的工作量
通过StorageClass自动创建PV
支持Dynamic Provisioning机制
定义PV的属性和创建所需的存储插件
创建PV的模板
需要与符合条件的PV进行绑定
通常由开发人员创建
描述Pod所希望使用的持久化存储的属性
由运维人员事先创建在Kubernetes集群里待用
定义持久化存储在宿主机上的目录
描述持久化存储数据卷
思考题
Volume的处理机制
Volume Controller
Dynamic Provisioning
StorageClass
PVC
PV
PV、PVC、StorageClass

该思维导图由 AI 生成,仅供参考

你好,我是张磊。今天我和你分享的主题是:PV、PVC、StorageClass,这些到底在说啥?
在前面的文章中,我重点为你分析了 Kubernetes 的各种编排能力。
在这些讲解中,你应该已经发现,容器化一个应用比较麻烦的地方,莫过于对其“状态”的管理。而最常见的“状态”,又莫过于存储状态了。
所以,从今天这篇文章开始,我会通过 4 篇文章为你剖析 Kubernetes 项目处理容器持久化存储的核心原理,从而帮助你更好地理解和使用这部分内容。
首先,我们来回忆一下我在第 19 篇文章《深入理解 StatefulSet(二):存储状态》中,和你分享 StatefulSet 如何管理存储状态的时候,介绍过的Persistent Volume(PV)和 Persistent Volume Claim(PVC)这套持久化存储体系。
其中,PV 描述的,是持久化存储数据卷。这个 API 对象主要定义的是一个持久化存储在宿主机上的目录,比如一个 NFS 的挂载目录。
通常情况下,PV 对象是由运维人员事先创建在 Kubernetes 集群里待用的。比如,运维人员可以定义这样一个 NFS 类型的 PV,如下所示:
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs
spec:
storageClassName: manual
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
nfs:
server: 10.244.1.4
path: "/"
PVC 描述的,则是 Pod 所希望使用的持久化存储的属性比如,Volume 存储的大小、可读写权限等等。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Kubernetes持久化存储概念深入剖析 本文深入介绍了Kubernetes中的持久化存储概念,包括Persistent Volume(PV)、Persistent Volume Claim(PVC)和StorageClass。文章详细解释了PV和PVC的绑定过程,以及Kubernetes中的Volume Controller的作用。此外,还介绍了持久化Volume的实现原理,包括远程存储服务的使用和为Pod创建Volume目录的过程。另外,文章还介绍了Kubernetes中的StorageClass的作用,以及如何使用StorageClass进行动态存储的创建。 在这个体系中,PVC描述的是Pod想要使用的持久化存储的属性,而PV描述的则是一个具体的Volume的属性。StorageClass的作用是充当PV的模板,并且只有同属于一个StorageClass的PV和PVC才可以绑定在一起。另一个重要作用是指定PV的Provisioner,如果存储插件支持Dynamic Provisioning,Kubernetes可以自动为你创建PV。 这套容器持久化存储体系完全是Kubernetes项目自己负责管理的,并不依赖于docker volume命令和Docker的存储插件。在了解了PV、PVC的设计和实现原理之后,读者可以思考是否觉得它有“过度设计”的嫌疑,或者是否有更加简单、足以解决90%需求的Volume的用法。 通过深入浅出的方式,本文帮助读者理解了Kubernetes中持久化存储的核心原理和操作流程,为读者提供了全面的技术指导。文章内容涵盖了PV、PVC和StorageClass的绑定机制,动态存储的创建以及Static Provisioning的使用,为读者提供了全面的技术指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入剖析 Kubernetes》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(61)

  • 最新
  • 精选
  • swordholder
    容器持久化存储涉及的概念比较多,试着总结一下整体流程。 用户提交请求创建pod,Kubernetes发现这个pod声明使用了PVC,那就靠PersistentVolumeController帮它找一个PV配对。 没有现成的PV,就去找对应的StorageClass,帮它新创建一个PV,然后和PVC完成绑定。 新创建的PV,还只是一个API 对象,需要经过“两阶段处理”变成宿主机上的“持久化 Volume”才真正有用: 第一阶段由运行在master上的AttachDetachController负责,为这个PV完成 Attach 操作,为宿主机挂载远程磁盘; 第二阶段是运行在每个节点上kubelet组件的内部,把第一步attach的远程磁盘 mount 到宿主机目录。这个控制循环叫VolumeManagerReconciler,运行在独立的Goroutine,不会阻塞kubelet主循环。 完成这两步,PV对应的“持久化 Volume”就准备好了,POD可以正常启动,将“持久化 Volume”挂载在容器内指定的路径。

    作者回复: 总结的好!后面还有更多概念!

    2018-10-26
    16
    341
  • Geek_e2f5e1
    老师,如果我原先存储上就有数据需要挂载进去,那格式化操作岂不是不能满足我的需求?

    作者回复: 格式化前肯定要检查啊,只有raw格式才需要格式化

    2019-04-09
    38
  • vx:jiancheng_goon
    张老师,问一个比较空泛的问题。您之前是做paas平台的,今后的pass平台的发展方向是什么呢?当前做paas平台,最大的阻碍是什么?最大的价值又是什么呢?

    作者回复: paas最后就是各家基于kubernetes DIY。这样多好。

    2018-10-27
    30
  • tuxknight
    在公有云上使用 PV/PVC 有个很重要的限制:块存储设备必须和实例在同一个可用区。在 Pod 没被创建的时候是不确定会被调度到哪个可用区,从而无法动态的创建出PV。这种问题要怎么处理?

    作者回复: scheduler里的volumezonechecker规则了解一下。

    2018-10-28
    22
  • Acter
    “所谓将一个 PV 与 PVC 进行“绑定”,其实就是将这个 PV 对象的名字,填在了 PVC 对象的 spec.volumeName 字段上。” 请问老师为什么在pvc的yaml文件中看不到这个字段呢?

    作者回复: 看它的api types定义

    2018-10-29
    3
    15
  • 如果采用ceph rbd StorageClass,Pod所在的node宕机后,在调度到另外一台Node上,这个过程中,k8s是会新node上重新创建PV吗?

    作者回复: 这个取决于你的存储插件是什么类型的。支持 auto provisioning的就可以自动创建。

    2020-03-04
    9
  • yuliz
    你好,我想请教下实际中的疑问点,如果我使用NFS作为共享存储,两个集群中的PV绑定NFS的同一目录,且这两个PV被pvc绑定,最终pod绑定pvc,当第二个pod绑定时会格式化nfs的目录,导致之前的pod数据丢失么?两个集群的pv能共用一个nfs目录和同一rbd么?

    作者回复: volumeMounts有个subpath字段了解一下。可以,但不建议。

    2018-10-30
    3
    7
  • 夕月
    所谓将一个 PV 与 PVC 进行“绑定”,其实就是将这个PV 对象的名字,填在了 PVC 对象的 spec.volumeName 字段上,这个好像在yaml文件里没有提现啊,只有storageClassName是一样的

    作者回复: 你把api对象和yaml文件搞混了?

    2018-11-25
    6
  • jkmzg
    请问下从同一个pod spec 创建出来的不同pod中,pvc相同,会不会冲突?k8s的机制是什么呢?

    作者回复: 带id,不冲突

    2018-11-13
    6
  • jssfy
    请问 1. 同一集群的多个pod可否同时挂载同一个pv的同一个subpath 2. 如果pv写满了如何扩容

    作者回复: 要看存储插件是否支持。pv只是逻辑概念,你的数据是在远程存储里的,所以resize是存储插件的功能。

    2018-11-25
    5
收起评论
显示
设置
留言
61
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部