具代表性的面試主題

系統設計面試:如何遷移 Kubernetes KMS v2 並證明 Secret 已加密?

系統設計困難
Offer.cc 編輯團隊發佈 更新

題幹

一個生產叢集仍使用明文或 KMS v1 保存 Secret。如何遷移到 KMS v2,避免控制面中斷,並證明歷史物件也已重新加密?

題幹與適用場景

平台團隊需要保護 etcd 中的 Secret。叢集有多個 kube-apiserver、外部 KMS 外掛和大量歷史物件,且不能在遷移時停止發布。請設計配置變更、金鑰輪換、存量重寫、驗證、監控和回滾。

面試官考察點

  • 是否理解 KMS v2 的信封加密邊界和 DEK/KEK 關係。
  • 是否區分「新寫入加密」與「歷史物件已經重寫」。
  • 是否能處理多個 apiserver、KMS 不可用、輪換和並行更新。
  • 是否用 etcd 取證與 API 讀回證明結果,而非只看配置檔。

回答前需要釐清的問題

  1. 目前 Kubernetes 版本、KMS 外掛版本和高可用拓撲是什麼?
  2. 需要保護哪些資源,是否包含自訂資源和稽核日誌?
  3. 外部 KMS 的可用性、延遲、金鑰輪換與災備承諾是什麼?
  4. 允許的控制面發布窗口、回滾期限和合規證據格式是什麼?

30 秒回答框架

先在非生產叢集驗證 KMS v2 外掛和權限,再把 KMS 設為首選 provider、保留舊 provider 作讀取回退,滾動更新每個 kube-apiserver。新寫入會加密,但歷史物件必須逐個無操作更新或用儲存版本遷移重寫。驗證包括 API 讀回、etcd 前綴取證、KMS 指標、故障演練和稽核記錄。確認所有物件完成重寫後才移除舊 provider,並保留可稽核的回滾窗口。

分步驟深入解答

1. 釐清加密模型

Kubernetes 使用信封加密:資料加密金鑰(DEK)加密資源,金鑰加密金鑰(KEK)由外部 KMS 保護。KMS v2 透過服務端快取和每個 API server 的 DEK 設計降低請求開銷,但不等於 etcd 自動重寫所有舊資料。

2. 先驗證外掛和權限

在隔離叢集測試 socket、身分、逾時、重啟和 KMS 不可用行為。確認 kube-apiserver 能解密舊 provider 寫入的物件,也能用新 provider 寫入新 Secret。記錄延遲、錯誤、快取命中和 KMS 呼叫量。

yaml
providers:
  - kms:
      apiVersion: v2
      name: external-kms
      endpoint: unix:///var/run/kms/plugin.sock
  - aescbc:
      keys:
        - name: old-key
          secret: <base64-secret>

3. 高可用滾動切換

先把新 KMS provider 放在配置首位,保留舊 provider 讀取回退,再逐個重啟 kube-apiserver。每一步確認 API 讀寫、與 leader 無關的並發請求和稽核輸出,避免同時重啟全部控制面。配置檔和外掛版本必須可回滾。

4. 重寫存量物件

只切換 provider 只影響後續寫入。對 Secret 及其他受保護資源執行分批無操作更新,或使用儲存版本遷移工具觸發重寫;遇到衝突要重試。按命名空間分片、限速並記錄物件版本,防止一次性更新壓垮 API server、etcd 或 KMS。

5. 驗證加密證據

建立新 Secret 後從 etcd 讀取原始位元組,確認以 KMS v2 加密前綴儲存;再透過 API 讀取並比較明文。抽樣舊物件和每類資源,統計尚未重寫數量。API 讀回成功不能單獨證明磁碟上的值已加密。

6. 輪換、故障和回滾

輪換 KEK 後保持舊 KEK 可解密,逐批重寫並監控失敗。演練 KMS 逾時、socket 斷開、單個 apiserver 回滾和外掛升級。若錯誤率超閾值,暫停重寫,恢復舊配置讀取資料;只有確認新 provider 穩定和存量完成後才移除舊 provider。

高品質示範回答

我會先在隔離叢集驗證 KMS v2 外掛、權限、延遲和故障行為。生產配置把 KMS v2 放在首位,短期保留舊 provider 作讀取回退,逐個滾動重啟 kube-apiserver。新寫入加密後,再按資源和命名空間分批無操作更新,記錄進度、衝突和重試。驗證既包含 API 讀回,也包含 etcd 前綴和抽樣物件取證;確認歷史物件完成重寫後才移除舊 provider。KEK 輪換和 KMS 故障都要有演練、閾值和局部回滾方案。

常見錯誤

  • 只改配置不重寫舊物件 → 歷史明文仍在 etcd → 分批更新並統計完成度。
  • 同時重啟所有 apiserver → 控制面中斷 → 逐個滾動並觀察健康指標。
  • 只看 API 讀回 → 無法證明底層儲存加密 → 做 etcd 原始位元組取證。
  • 立即刪除舊 provider → 舊資料無法解密 → 等遷移完成並保留回滾窗。
  • 忽略 KMS 延遲和快取 → 高峰時 API 請求雪崩 → 壓測、限速和監控呼叫量。

追問及應對

配置 KMS v2 後,新 Secret 是否全部安全?

新寫入會按首選 provider 加密,但舊物件不會自動變更。必須執行存量重寫,並以 etcd 證據確認。

KMS 暫時不可用時能否繼續寫入?

取決於外掛快取和配置,不能假設一定可用。應預先定義逾時、拒絕寫入、告警和恢復後的重試策略,並演練控制面行為。

為什麼保留舊 provider 是風險而非永久方案?

它在遷移窗口內提供可回滾的解密能力,但擴大了金鑰和配置邊界。存量確認完成後應移除,並保留輪換與恢復證據。

公開來源

同類題目

相關面試工具

用 Solve 整理系統設計回答

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

查看工具