题目重点:Nvidia Senior DGX AI Infra 电面提到 Kubernetes operator 和 CRD;本文用明确标注的训练场景解释资源模型、reconcile、状态、删除和运维取舍。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练场景:团队希望提交 GpuJob 自定义资源,其中 spec 含镜像、GPU 数量和重试上限;这是示例 API,真实字段、调度语义和配额必须与使用者确认。
- 集群已有运行作业所需的节点、设备插件、基础权限和原生 Job 能力;本文只讨论是否需要在其上增加领域控制器,不把 GPU 运行时安装也算作 Operator 的职责。
- 允许控制器最终一致地创建或更新子资源;不承诺创建 GpuJob 后立刻完成作业,也不要求单次 reconcile 就完成全部步骤。
解题路线
- 先分清两层:CRD 向 API server 注册 GpuJob 类型、版本和结构化 schema,使资源能被存储、校验和 watch;单有 CRD 不会自动创建 Job。Operator 是把领域操作知识编码进控制器,通过 watch/队列触发 reconcile。若原生 Job 加配置即可满足需求,就无需新增领域 API。
- reconcile 读取当前 GpuJob 的 spec、generation 与子 Job 状态,对照期望计算最小变更:缺 Job 则创建,配置变更则按允许的策略更新或替换,作业终态则更新 GpuJob status。重复事件、失败重试和控制器重启后再次执行必须收敛到相同目标;给子资源稳定命名或打 owner reference,创建时处理 AlreadyExists,而不是每次生成新 Job。
- status 只记录观测事实,例如 observedGeneration、phase、conditions 和最近错误;用户期望保留在 spec。先持久化可恢复的外部操作标识,再标记成功,避免控制器崩溃后重复申请昂贵资源。status 更新也可能冲突,应读取新版本重试,且避免无变化时反复写入引发事件循环。
- 删除时先区分 Kubernetes 子资源和外部资源:owner reference 可帮助清理集群内依赖;云端配额、外部存储等需要 finalizer,在确认清理完成后才移除。外部清理调用也须幂等,并考虑永久失败时的告警与人工解锁路径。控制器 RBAC 只授予 GpuJob 与必要子资源的最小权限。
- 上线前用失败注入验证:重复 watch 事件、API 超时、两个控制器实例争用、配额不足、用户修改 spec 和删除过程重启。监控队列积压、reconcile 错误率与耗时、资源长期未收敛以及 API server 请求量。
手动走一遍
训练例:用户创建 spec.gpus=2 的 GpuJob。控制器第一次读取时找不到子 Job,于是创建带 GpuJob owner reference 的 Job;第二次收到事件时发现 Job 已存在,只写回 Ready=False 与 observedGeneration,不再创建副本。Job 成功后写 status.phase=Succeeded。若用户删除 GpuJob,集群内 Job 按所有权清理;若还占有外部配额,finalizer 先幂等释放配额,再允许删除完成。这里的字段和生命周期都是训练约定。
规模与取舍
不是单一算法题。一次 reconcile 主要成本是读取目标和相关子资源并执行必要的 API 调用,可视为 O(R),R 为要检查的关联资源数;全局压力由资源数、变更频率、重试风暴与 API QPS 决定。大量 GpuJob 应用带速率限制的工作队列、退避重试和可观测指标,不能靠无限轮询;CRD schema/version 变更还需要兼容与迁移计划。
易错点与追问
容易失分的边界
- 把 CRD 当成完整 Operator:只有类型定义而没有控制器,实际工作负载不会被协调。
- 在每次 reconcile 都无条件创建 Job 或写 status,使重复事件产生重复作业或无限事件循环。
- 把观测结果写进 spec,或认为 status 表示同步完成而不核对 observedGeneration。
- 用 finalizer 却没有超时、告警和恢复路径,导致外部系统故障时对象长期卡在 Terminating。
- 控制器使用 cluster-admin 权限、忽略 CRD schema 和版本升级,扩大故障面。
继续深挖
- 何时用 Deployment/Job 加 Helm 或 GitOps,何时值得自建 CRD?看是否需要长期协调的领域状态机、跨资源依赖和自动故障恢复,以及维护自定义 API 的成本。
- 如果两个控制器副本同时收到事件,怎样用 leader election、资源版本冲突重试和幂等外部调用防止重复动作?
- CRD v1 升级到 v2 后如何处理已存对象、默认值、字段废弃和 conversion webhook?先定义兼容窗口,再规划回滚。
- 如果 GPU 配额不足,status conditions、退避队列、告警和用户可见错误应如何配合,避免 API 请求风暴?
技术参考
- Kubernetes 官方 Operator 文档:技术参考:Operator 的自定义资源与控制器协调循环;不是面经题干来源。
- Kubernetes 官方 CustomResourceDefinition 文档:技术参考:CRD schema、status subresource 等机制;不是面经题干来源。
