Skip to content

面试题深度详解:存储、调度与资源(10 题)

覆盖 PV/PVC/CSI、调度器、QoS、HPA/VPA/CA、GPU 调度等高频面试题。


Q21: PV 和 PVC 的绑定流程,静态 vs 动态供给

答题思路

从 PVC 的创建出发,解释静态和动态两种 PV 供给方式的差异。

三级参考答案

B 级:

PV 是集群中的存储资源,PVC 是用户对存储的请求。静态供给:管理员预先创建 PV,PVC 绑定匹配的 PV。动态供给:通过 StorageClass 的 Provisioner 自动创建 PV。

A 级:

PVC 绑定 PV 的条件:容量 >= PVC 请求、accessModes 匹配、storageClassName 匹配、labelSelector 匹配(如有)。静态供给适合预知存储需求的场景,动态供给适合自助服务。回收策略:Retain(保留数据)和 Delete(删除数据)。

S 级:

PV 绑定流程:PVC 创建后,PV Controller 扫描可用 PV,按容量、accessMode、storageClass 匹配,绑定后一对一关系不可变。WaitForFirstConsumer 模式等 Pod 调度后再绑定(避免跨 AZ 挂载问题)。Reclaim Policy 为 Retain 时,PVC 删除后 PV 变为 Released 状态,需手动清理。


Q22: CSI 插件的架构和工作流程

答题思路

从 CSI 的设计目标(标准化存储接口)出发,解释三大组件和完整生命周期。

三级参考答案

B 级:

CSI 分 Controller Plugin(管理卷生命周期)和 Node Plugin(节点挂载),通过 gRPC 接口与 K8s 交互。常见实现有 Rook-Ceph、OpenEBS、NFS-CSI。

A 级:

CSI Controller Plugin 通常 Deployment 部署(1 副本 + Leader Election),负责 CreateVolume/DeleteVolume/ControllerPublishVolume。Node Plugin 用 DaemonSet 部署,负责 NodeStageVolume/NodePublishVolume。Sidecar 容器(external-provisioner/external-attacher/node-driver-registrar)辅助 CSI 驱动与 K8s 交互。

S 级:

完整卷生命周期:CreateVolume → ControllerPublishVolume(附加到节点)→ NodeStageVolume(格式化、挂载到暂存路径)→ NodePublishVolume(bind mount 到 Pod 目录)。反向操作:NodeUnpublishVolume → NodeUnstageVolume → ControllerUnpublishVolume → DeleteVolume。Volume Snapshot 通过 external-snapshotter sidecar 实现。


Q23: 如何在 K8s 上运行有状态应用(数据库)

答题思路

这是实战设计题,需要从 StatefulSet、存储、备份、高可用多角度分析。

三级参考答案

B 级:

使用 StatefulSet 运行数据库,每个 Pod 有固定的标识(如 mysql-0)和独立的 PVC。使用 Headless Service 提供稳定的 DNS 名称。

A 级:

关键要素:1) StatefulSet + volumeClaimTemplates(每个 Pod 独立 PVC);2) 使用 Local PV 或高性能 CSI(如 Rook-Ceph);3) 配置 ReadinessProbe 确保主从切换时流量正确;4) 使用 Operator 管理(如 Zalando Postgres Operator、Vitess);5) 定期备份(Velero + VolumeSnapshot)。

S 级:

生产建议:1) 优先使用云厂商托管数据库(如 RDS/Aurora),K8s 上只运行无状态应用;2) 必须在 K8s 上运行时,使用 Operator 管理(自动故障转移、备份恢复);3) 使用 Local PV + Pod Anti-Affinity 确保数据分布在不同的物理节点;4) 配置 PodDisruptionBudget 防止同时驱逐多个数据库 Pod;5) 监控慢查询和复制延迟。


Q24: Volume 快照和克隆的区别和使用场景

答题思路

从快照和克隆的技术实现差异出发,解释各自的适用场景。

三级参考答案

B 级:

Volume 快照是某个时间点的数据副本,用于备份和恢复。克隆是从现有卷创建新卷。两者都通过 CSI 实现。

A 级:

快照:通过 VolumeSnapshot 资源创建,使用 CSI CreateSnapshot,可用于恢复到新 PVC(dataSource 指向 VolumeSnapshot)。克隆:通过 PVC 的 dataSource 指向现有 PVC,底层调用 CSI CloneVolume。快照适合定期备份,克隆适合快速创建测试环境。

S 级:

快照分全量快照和增量快照,取决于 CSI 驱动实现(Ceph 支持增量快照)。GroupSnapshot(1.27+)支持同时对多个 PVC 创建一致性快照。生产建议:定期 VolumeSnapshot + 异地备份(如上传到 S3)实现完整灾备。


Q25: local volume vs network volume 的权衡

答题思路

从性能、可靠性、调度约束三个维度对比。

三级参考答案

B 级:

Local Volume 性能极高(本地磁盘),但 Pod 绑定到特定节点,节点故障数据丢失。Network Volume(如 Ceph)可跨节点迁移,有分布式冗余,但有网络延迟。

A 级:

Local Volume 适合:高性能数据库、缓存、临时数据。Network Volume 适合:需要数据持久化和迁移的生产应用。Local PV 通过 nodeAffinity 绑定到特定节点,调度器需要考虑节点可用性。

S 级:

Local PV 的 Topology-aware 调度:使用 volumeBindingMode: WaitForFirstConsumer 确保 Pod 先调度到节点,再绑定同节点的 Local PV。混合方案:Local PV 用于数据库主节点(高性能),Network Volume 用于从节点(可迁移)。TopoLVM 项目可以在 Local Volume 上实现 thin provisioning 和动态扩容。


Q26: K8s 调度器的调度流程和扩展点

答题思路

从调度器的插件化架构出发,解释各个扩展点。

三级参考答案

B 级:

调度器流程:过滤(Filter)→ 打分(Score)→ 绑定(Bind)。Filter 排除不可用节点,Score 对可用节点打分,选择得分最高的节点。

A 级:

完整流程:PreFilter → Filter → PostFilter → PreScore → Score → Reserve → Permit → PreBind → Bind → PostBind。Filter 插件包括 NodeResourcesFit、NodeAffinity、TaintToleration。Score 插件包括 LeastAllocated、BalancedAllocation、InterPodAffinity。

S 级:

调度器框架支持自定义插件,通过 KubeSchedulerConfiguration 配置。PostFilter 在 Filter 失败时执行抢占逻辑。Permit 插件可以实现 Gang Scheduling(等待一组 Pod 同时调度)。自定义调度器通过 schedulerName 字段指定。大规模集群建议开启 percentageOfNodesToScore 优化调度速度。


Q27: 如何保证关键应用不被驱逐

答题思路

从 QoS、Priority、PDB 三个层面保障关键应用。

三级参考答案

B 级:

通过设置 Guaranteed QoS(requests = limits)降低驱逐优先级,配置 PodDisruptionBudget 限制同时驱逐数量,设置 PriorityClass 提高调度优先级。

A 级:

三层保障:1) QoS Guaranteed(CPU/Memory requests = limits),驱逐优先级最低;2) PriorityClass(如 system-cluster-critical),调度时优先抢占低优先级 Pod;3) PDB(minAvailable 或 maxUnavailable),限制自愿驱逐数量。注意:PDB 只防止自愿驱逐(如 drain),不防止节点故障导致的非自愿驱逐。

S 级:

完整保障方案:Guaranteed QoS + PriorityClass + PDB + Pod Anti-Affinity(跨 AZ 分布)+ 专用节点池(Taint + Toleration)+ 监控告警。节点资源压力下的驱逐顺序:BestEffort → Burstable → Guaranteed,同 QoS 内按 usage/requests 比率排序。


Q28: HPA 和 VPA 能否同时使用?如何配合

答题思路

从 HPA 和 VPA 的功能差异出发,解释同时使用的限制和配合方式。

三级参考答案

B 级:

HPA 调整 Pod 副本数(水平伸缩),VPA 调整 Pod 的 requests/limits(垂直伸缩)。不能对同一指标(如 CPU)同时使用 HPA 和 VPA,会互相冲突。

A 级:

可以配合使用:HPA 基于 CPU 伸缩副本数,VPA 基于 Memory 调整 requests。或者 HPA 基于自定义指标(如 QPS),VPA 基于 CPU/Memory。VPA 的推荐模式(Off/Initial/Auto),Auto 模式会自动重启 Pod 应用新的 requests。

S 级:

VPA 的限制:1) 不能与基于 CPU/Memory 的 HPA 同时使用;2) 更新 requests 需要重启 Pod;3) 不支持 StatefulSet。替代方案:KEDA(Kubernetes Event-driven Autoscaling)基于事件驱动伸缩(如 Kafka lag、Prometheus 指标),比 HPA 更灵活。生产推荐:HPA(自定义指标)+ VPA(Off 模式,仅推荐)+ Cluster Autoscaler。


Q29: QoS 等级是如何计算的,对驱逐有什么影响

答题思路

从三种 QoS 的计算规则出发,解释驱逐优先级。

三级参考答案

B 级:

三种 QoS:Guaranteed(requests = limits)、Burstable(requests < limits)、BestEffort(未设置 requests/limits)。驱逐优先级:BestEffort 最先被驱逐,Guaranteed 最后。

A 级:

Guaranteed 的条件:所有容器都设置了 requests 和 limits,且 requests == limits(CPU 不设置 limits 也算 Guaranteed,只要 requests 相等)。节点内存不足时,kubelet 按 BestEffort → Burstable → Guaranteed 顺序驱逐。

S 级:

驱逐细节:Burstable Pod 的驱逐优先级按 usage/requests 比率排序(比率高的先驱逐)。OOMKilled 不同于节点级驱逐:OOMKilled 是 cgroup 内存限制触发,只影响单个容器;节点级驱逐是 kubelet 检测到节点内存压力后主动驱逐 Pod。可通过 eviction-hardeviction-soft 配置驱逐阈值。


Q30: 如何实现 GPU 调度

答题思路

从 K8s 的 GPU 调度机制出发,解释 device plugin 和 vGPU 方案。

三级参考答案

B 级:

K8s 通过 Device Plugin 机制调度 GPU。NVIDIA device plugin 将 GPU 注册为可扩展资源(nvidia.com/gpu),Pod 通过 resources.limits 请求 GPU。

A 级:

GPU 调度限制:1) 只能请求整数个 GPU(不能共享);2) GPU 不支持超卖;3) 调度器通过 Filter 阶段检查节点 GPU 可用性。MIG(Multi-Instance GPU)允许将 A100 切分为多个实例,每个实例独立调度。

S 级:

vGPU 方案:HAMi(异构 AI 算力虚拟化)和 NVIDIA MPS 允许 GPU 共享,提高利用率。HAMi 支持显存和算力两个维度的切分。调度器扩展:使用 scheduler extender 或 scheduling framework 插件实现 GPU 拓扑感知调度。GPU 监控:DCGM Exporter 采集 GPU 指标,通过 Prometheus + Grafana 可视化。生产建议:训练任务用整卡,推理服务用 vGPU 共享。


上一章:面试题深度详解:网络(10 题) 下一章:面试题深度详解:安全、运维与排障(15 题)