代表性面试主题

系统设计面试:如何把 Kubernetes DRA 设备元数据安全暴露给容器?

系统设计中等
Offer.cc 编辑团队发布 更新

题干

GPU 或网络设备分配后,应用需要读取 PCI 地址、接口名等信息,但不能访问 Kubernetes API。你会如何设计 DRA device metadata 链路?

题干与适用场景

集群使用 Dynamic Resource Allocation(DRA)分配 GPU 或网络设备。容器需要读取已分配设备的 PCI 地址、接口名或驱动属性,但不应获得 Kubernetes API 权限。请设计从驱动到容器的元数据链路,并说明版本、隔离、失败和升级策略。

面试官考察点

  • 是否理解 DRA 驱动、ResourceClaim、kubelet 与容器之间的责任边界。
  • 是否能说明元数据文件的路径、生成时机、挂载和清理生命周期。
  • 是否处理驱动不可信字段、跨节点泄露、版本兼容和 Pod 重启。
  • 是否知道该能力的 feature state 与适用版本,避免把 alpha 当成稳定契约。

回答前需要澄清的问题

  1. 元数据是设备发现信息、网络配置,还是包含凭据的敏感数据?
  2. 应用需要哪些字段和版本,能否容忍字段缺失或延迟出现?
  3. 集群和节点版本是否支持 DRA device metadata,驱动是否使用官方库?
  4. 设备重新分配、Pod 重启、驱动升级或节点故障时,文件如何失效?

30 秒回答框架

我会让驱动只声明与当前 ResourceClaim 关联的非敏感元数据,由 kubelet 在设备准备阶段生成版本化 JSON,并以只读方式挂载到容器约定路径。应用只读文件,不访问 API;文件的创建、更新、卸载与 Pod 生命周期绑定。字段做 schema 校验和大小限制,驱动失败时 Pod 进入可观测的失败状态。由于该能力处于 alpha,必须保留版本探测和降级到环境变量、启动探针或旧驱动路径的方案。

分步骤深入解答

1. 定义数据和信任边界

DRA 负责把设备分配给 ResourceClaim,驱动了解实际设备,应用只需要消费结果。元数据应限于设备属性或网络接口细节,不放私钥、令牌或可跨租户识别的信息。驱动输入必须绑定 claim、request 和 node,防止把其他设备信息写入当前 Pod。

2. 选择稳定的投递方式

官方文档描述了容器内的 well-known 路径,并以 JSON 文件呈现设备属性。使用只读挂载和确定的目录层级,应用通过文件读取而非 API 查询。文件内容应带 schema 或版本字段,让应用能拒绝未知版本并提供兼容逻辑。

3. 处理生命周期和失败

在设备分配和准备成功后生成文件;unprepare、Pod 删除或 claim 释放时清理。生成失败、文件写入失败或 JSON 不合法时,不能暴露半成品,应让 kubelet/驱动报告可观测错误并阻止应用误用。重启后重新从当前 claim 状态生成,不复用旧节点文件。

4. 规划升级和观测

把驱动库、kubelet、节点和应用版本矩阵写入部署契约。监控文件生成延迟、失败率、字段校验失败、驱动版本和 Pod 重启;通过日志记录 claim、request 和 node 标识,但不记录敏感元数据内容。alpha 能力升级时用兼容 schema 和明确 feature gate 验证。

高质量示范回答

我会把 device metadata 设计成 DRA 分配结果的只读投影。驱动只为当前 ResourceClaim 和节点写入非敏感设备属性,kubelet 在设备准备完成后将版本化 JSON 通过 well-known 路径只读挂载给容器,应用不需要 Kubernetes API 权限。生成前校验 claim、request、node 关联、字段白名单和大小;生成后做 schema 校验,失败则不挂载半成品并报告可观测错误。设备释放或 Pod 删除时清理,重启后按当前 claim 重新生成。由于该能力是 alpha,我会做版本探测、feature gate、旧路径或显式环境变量降级,并监控生成失败、延迟和驱动版本,避免把实验性文件格式写成跨版本保证。

常见错误

  • 让容器读取 Kubernetes API 或授予过宽的 RBAC。
  • 把驱动返回的所有字段原样暴露,包含凭据或其他租户设备信息。
  • 没有版本字段、白名单和 JSON schema 校验。
  • Pod 重启或 claim 释放后仍保留旧节点的文件。
  • 生成失败时挂载空文件,让应用误以为设备可用。
  • 把 alpha feature 当成所有版本都兼容的稳定 API。

追问及应对

为什么不直接写环境变量?

环境变量适合少量静态值,但难表达多个设备、结构化字段和动态生命周期。只读 JSON 文件更适合结构化元数据,同时应提供版本和失败语义。

如何防止跨租户信息泄露?

以 claim、request 和 node 作为写入授权边界,只允许驱动写入当前分配的设备;字段白名单过滤敏感属性,挂载目录按 Pod 隔离,并通过权限和测试验证不可读取其他 claim。

alpha 能力如何上线?

先确认集群版本、feature state、驱动库和 kubelet 兼容矩阵;用 feature gate 与小范围节点池灰度,准备旧驱动或应用降级,并把 schema 变更纳入回滚和告警。

公开来源

同类题目

相关面试工具

用 Solve 整理系统设计回答

从澄清需求开始,展开规模、架构、组件选择和取舍。

查看工具