ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Kubernetes CSI 卷热扩容全流程剖析:从 PVC 修改到文件系统拉伸

Kubernetes CSI 卷热扩容全流程剖析:从 PVC 修改到文件系统拉伸 Kubernetes CSI 卷热扩容全流程剖析从 PVC 修改到文件系统拉伸在 Kubernetes 生产运维中有状态应用如 MySQL、Elasticsearch、Prometheus TSDB的磁盘空间告警是极其常见的值班事件。随着业务数据不断写入原本规划的 100GB 存储卷PersistentVolumeClaimPVC很快达到了 85% 的红色警戒线。在早期没有 CSIContainer Storage Interface卷热扩容特性的时代扩容存储是一场极其痛苦的“停机运维灾难”必须先暂停业务 Pod - 卸载存储卷 - 手动登录云厂商控制台或底层存储扩容 LUN - 手动在宿主机执行resize2fs- 重新挂载启动 Pod。整个过程需要中断服务数十分钟。从 Kubernetes v1.24 开始CSI 卷在线热扩容Online Volume Expansion已经进入 GA 稳定状态。运维人员只需要执行一条kubectl patch pvc修改容量声明底层的存储扩容与容器内文件系统拉伸就会在完全不重启 Pod、不中断业务读写的前提下自动完成。本文将深入 Linux 内核块设备层与 CSI 控制器系统性拆解Kubernetes 卷热扩容背后的完整状态机链路与排障要点。sequenceDiagram autonumber actor Admin as 运维工程师 / GitOps participant API as K8s APIServer participant ExtController as csi-resizer 控制面 participant CloudStorage as 底层存储服务 (云盘/Ceph) participant Kubelet as 宿主机 Kubelet (VolumeManager) participant NodeDriver as csi-node-driver (主机端) participant Kernel as Linux 内核文件系统 (ext4/xfs) Admin-API: 1. kubectl edit pvc (将容量从 100Gi 修改为 200Gi) API-ExtController: 2. 监听 PVC Spec 变更事件 ExtController-CloudStorage: 3. 调用 CSI ControllerExpandVolume RPC Note over CloudStorage: 4. 底层存储端完成块设备 LUN 扩容 CloudStorage--ExtController: 5. 扩容成功响应 ExtController-API: 6. 更新 PV Spec.capacity 为 200Gi API-Kubelet: 7. 下发 NodeExpandVolume 意图 Kubelet-NodeDriver: 8. 调用 CSI NodeExpandVolume RPC NodeDriver-Kernel: 9. 执行 Linux 文件系统在线拉伸 (resize2fs / xfs_growfs) Note over Kernel: 10. 容器内 df -h 立即呈现 200Gi业务零中断1. 热扩容的前置条件与 StorageClass 约束并非所有的存储卷都能无脑执行热扩容底层必须满足以下三个硬性条件StorageClass 必须显式开启allowVolumeExpansion: true底层 CSI 驱动必须实现EXPAND_VOLUME控制面能力与节点端能力底层文件系统必须支持在线拉伸如 Linux 的ext4和xfs。apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: fast-nvme-sc provisioner: rbd.csi.ceph.com allowVolumeExpansion: true # 核心配置: 允许动态在线扩容 volumeBindingMode: Immediate2. 状态机推进热扩容的两个关键阶段热扩容之所以能在业务无感知下进行是因为 Kubernetes 将整个扩容拆分为了清晰的两个物理阶段阶段一控制面块设备扩容ControllerExpandVolume当用户修改了 PVC 的spec.resources.requests.storage: 200Gicsi-resizer外部控制器监听到变更调用底层存储 API如云厂商 EBS API 或 Ceph 存储 API将物理块设备的容量从 100GB 扩容至 200GB此时底层块设备虽然变大了但宿主机操作系统和容器内部的文件系统超级块Superblock依然记录的是 100GB控制面将 PVC 的status.conditions标记为FileSystemResizePending。阶段二节点端文件系统在线拉伸NodeExpandVolume宿主机上的 Kubelet VolumeManager 感知到FileSystemResizePending状态调用本地节点的csi-node-driver执行NodeExpandVolumeNode 驱动在宿主机操作系统层执行文件系统拉伸命令对于ext4文件系统执行resize2fs /dev/rbd0对于xfs文件系统执行xfs_growfs /var/lib/kubelet/pods/.../volumes/...内核在内存中动态调整 inode 分布与空闲块位图容器内部瞬间即可使用 200GB 空间。3. 生产排障实战扩容卡住怎么办在实际运维中偶尔会遇到 PVC 已经修改但容量迟迟不生效的问题。标准排障流程如下# 1. 查看 PVC 详细状态与事件 kubectl describe pvc pvc-name -n production # 常见卡死原因 A: StorageClass 未配置 allowVolumeExpansion: true # 报错: Volume cannot be expanded because the StorageClass does not support it. # 常见卡死原因 B: 底层存储达到物理配额上限 # 查看 csi-resizer 控制器日志 kubectl logs -n kube-system deploy/csi-resizer -c csi-resizer # 2. 检查节点端文件系统拉伸是否成功 # 查看 csi-node 守护进程日志 kubectl logs -n kube-system ds/csi-node-driver -c csi-node-driver | grep ExpandVolume4. 生产避坑红线绝对不支持“缩容”Kubernetes CSI 与绝大多数 Linux 文件系统尤其是 XFS只支持单向扩大容量严禁缩容。如果在 PVC 中把容量从 200Gi 改小为 100GiAPIServer 会直接报错拒绝。XFS 文件系统的挂载点约束xfs_growfs命令要求目标设备必须处于挂载Mounted状态才能执行在线扩容如果 Pod 处于停止状态某些 CSI 插件在拉伸 XFS 时会报错直到 Pod 重新启动挂载后才会自动完成拉伸。
返回列表