当创建pvc后,kubernetes组件如何协作
内容提要
本文介绍了Kubernetes中创建pvc的过程,包括外部存储接入方式、CSI架构解读、动态创建Volume的执行过程以及涉及的组件和资源。同时还介绍了CSI API对象,如CSINode、CSIDriver和VolumeAttachment。最后还介绍了存储拓展中的延迟绑定。
延伸解读
CSI 成为存储扩展唯一方式
文章指出,Kubernetes 外部存储接入方式中,In-Tree 驱动与代码库一同发布,灵活性差且门槛高;Out-of-Tree 方式包括 FlexVolume 和 CSI,但 FlexVolume 因命令式特点不易维护,自 v1.23 起被弃用。因此 CSI 已成为 Out-of-Tree 的唯一方式。这意味着后续存储扩展应优先考虑 CSI 插件,避免使用已弃用的 FlexVolume。
Attach 与 Mount 的区别
外部存储挂载到容器通常涉及 attach 和 mount 两个阶段。attach 是将存储介质在指定虚拟机上绑盘,仅部分存储介质需要,例如块存储需调用接口将磁盘绑定到虚拟机;mount 则是操作系统层面的挂载,所有存储介质挂载到容器中都需要执行,如 NAS 或 OBS 本质是通过 NFS 命令挂载到容器目录。理解这一区别有助于排查存储挂载问题。
延迟绑定如何影响调度
延迟绑定通过 StorageClass 的 volumeBindingMode 字段控制。Immediate 模式下,PVC 创建后立即完成卷绑定和动态制备,不参与调度,可能导致 PV 在不知道 Pod 调度要求的情况下绑定。WaitForFirstConsumer 模式则延迟绑定和制备,直到使用该 PVC 的 Pod 被创建,PV 会根据 Pod 的调度约束(如资源需求、节点筛选器、亲和性、污点等)选择或制备,从而避免拓扑不匹配问题。
关键组件与资源协作
动态创建 Volume 过程中,PV Controller 负责 PVC/PV 状态转换和 Provision/Delete 操作,AD Controller 管理 VolumeAttachment 生命周期,并通过 external-attacher 将设备挂载到目标节点。kubelet 的 Volume Manager 负责 Mount/Unmount 和格式化,Volume Plugin 提供存储接入接口。资源方面,PV 是集群级,PVC 是命名空间级,SC 是集群级模板,CSINode 判断 CSI 插件注
Q&A
Kubernetes 外部存储接入方式中,In-Tree 和 Out-of-Tree 有什么区别?
In-Tree 指存储驱动源码在 Kubernetes 代码库中,与 Kubernetes 一起发布、迭代和管理,灵活性较差且门槛较高。Out-of-Tree 指存储插件由第三方编写、发布和管理,作为扩展与 Kubernetes 配合使用。Out-of-Tree 主要有 FlexVolume 和 CSI 两种实现方式,其中 FlexVolume 因命令式特点不易维护,从 Kubernetes v1.23 版本开始已被弃用,因此 CSI 已成为 Kubernetes 存储扩展的唯一方式。
创建 PVC 后,Kubernetes 中 attach 和 mount 两个阶段分别是什么?
attach 是将存储介质在指定虚拟机上绑盘,部分存储介质才需要 attach 操作,比如容器中使用块存储,需要先调用 openstack 接口将某块 evs 绑到某个虚拟机上成为虚拟机设备,再将存储设备挂载到容器目录上。mount 是将某个存储挂载到对应文件系统上,是操作系统层面的行为,所有存储介质挂载到容器中都需要 mount 阶段,比如容器中使用 nas 或者 obs,本质上就是执行 nfs 命令将网络存储挂载到容器目录上。
Kubernetes 动态创建 Volume 时涉及哪些关键组件?各自职责是什么?
涉及的关键组件包括:PV Controller 负责处理集群中的 pvc/pv 对象,进行状态转换,并根据需求进行数据卷的 Provision/Delete 操作(Static pv 不会触发 provisioner,Dynamic pv 才会触发)。AD Controller 负责 VolumeAttachment 的生命周期管理,并通过 external-attacher 将设备挂载到目标节点或从目标节点卸载。kubelet 包含 Volume Manager 和 Volume Plugin 两个存储相关插件:Volume Manager 管理存储卷的 Mount/Unmount 操作、卷设备的格式化等;Volume Plugin 为存储提供商提供存储接入的插件接口,包括 in-tree 和 out-of-tree 插件。
PV、PVC 和 StorageClass 在 Kubernetes 中分别是什么级别的资源?由谁创建?
PV 是集群级别的资源,由集群管理员或 External Provisioner 创建,其生命周期独立于使用 PV 的 Pod。PVC 是命名空间级别的资源,由用户或 StatefulSet 控制器(根据 VolumeClaimTemplate)创建,类似于 Pod 消耗 Node 资源,PVC 消耗 PV 资源。StorageClass 是集群级别的资源,由集群管理员创建,为管理员提供了一种动态提供存储卷的“类”模板,详细定义了存储卷 PV 的不同服务质量级别、备份策略等。
CSINode、CSIDriver 和 VolumeAttachment 这三个 CSI API 对象有什么作用?
CSINode 用于判断外部 CSI 插件是否注册成功,在 Node Driver Registrar 组件向 Kubelet 注册完毕后由 Kubelet 创建,不需要显式创建,它还将 Kubernetes 中 Node 资源名称与三方存储系统中节点名称(nodeID)一一对应,并显示卷拓扑信息。CSIDriver 用于简化外部 CSI 插件的发现,由集群管理员创建,通过 kubectl get csidriver 即可得知环境上有哪些 CSI 插件,还可以自定义 Kubernetes 行为,如设置 .spec.attachRequired 为 false 表示不需要执行卷挂接操作。VolumeAttachment 是控制块存储设备的 Attach/Detach 操作的逻辑对象,由 AD Controller 创建,External-attacher 通过观察该对象的状态属性来进行存储的挂载和卸载操作。
Kubernetes 存储中的延迟绑定是什么?如何配置?
延迟绑定是指 kube-schedule 在绑定 Pod 和 Node 时先不等待 PVC 和 PV 绑定,先进行节点预调度,然后把预调度结果写到 PVC 注解中,PVC 控制器获取到预调度 az 信息后,再完成 PV 创建和 PV 绑定。延迟绑定延迟了 PVC 和 PV 绑定阶段。在 StorageClass 中通过 volumeBindingMode 字段配置:Immediate 表示一旦创建 PVC 就完成卷绑定和动态制备(不参与调度);WaitForFirstConsumer 表示延迟 PV 的绑定和制备,直到使用该 PVC 的 Pod 被创建,PV 会根据 Pod 调度约束指定的拓扑来选择或制备。