目录
Please enable Javascript to view the contents

K8s 存储 CSI — 速查手册

 ·  ☕ 2 分钟

本文为面试精简版,深入技术细节见 K8s 存储 CSI 系列

1. PV / PVC / StorageClass 是什么

资源角色
PV集群中的一块存储(类型、容量、远程存储地址)
PVCPod 对存储的声明(大小、读写权限)
StorageClassPV 模板(存储插件 + 参数),实现动态供应

2. PVC 与 PV 如何绑定

  1. PV 容量必须满足 PVC 请求
  2. PV 与 PVC 的 StorageClass 必须一致

3. Volume Controller 的功能

控制器功能
PersistentVolumeController监听未绑定 PVC,遍历可用 PV 进行绑定
AttachDetachController检测 Pod 对应的 PV,执行 Attach / Detach
VolumeManagerReconciler每个节点独立运行,负责卷的 Mount / Unmount

4. 容器挂载存储的两阶段处理

阶段操作结果
Attach远程块存储挂载到节点(/dev/sdb设备就绪
Mount格式化 + 挂载到宿主机容器目录/var/lib/kubelet/pods/<podID>/volumes

之后 kubelet 通过 CRI 的 Mounts 参数将目录传给容器运行时。

NFS 跳过 Attach 阶段(无"磁盘挂载到虚拟机"的概念)。

详见 K8s 存储-Volume 生命周期全解析

5. StorageClass 的意义

手动维护 PV 工作量过大,StorageClass 配合 Dynamic Provisioning 自动创建 PV:

  1. 充当 PV 模板
  2. 指定 Provisioner(存储插件)

6. LocalPath 模式如何避免调度冲突

StorageClass 中设置 volumeBindingMode: WaitForFirstConsumer,将 PV/PVC 绑定延迟到 Pod 调度之后。

7. K8S 存储方案演进

阶段特点缺点
In-Tree Volume PluginK8s 核心代码内置新增存储类型需修改 K8s 源码
FlexVolume外部二进制插件,实现 Attach/Detach 等接口不支持 Dynamic Provisioning,上下文不可复用
CSI存储管理从核心代码剥离为独立组件

详见 FlexVolume 与 CSI 演进CSI 架构详解

8. Kubelet 主循环

Kubelet Sync Loop 的设计原则:主控制循环绝对不可以被 block。耗时的 Attach/Mount 操作交由独立的 Controller 和 Goroutine 异步处理。

分享

Hex
作者
Hex
CloudNative Developer