具代表性的面試主題

系統設計面試:如何把 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 整理系統設計回答

從澄清需求開始,展開規模、架構、元件選擇和取捨。

查看工具