題幹與適用場景
Kubernetes ValidatingAdmissionPolicy 使用 CEL 評估 API 請求。策略定義與綁定配合使用,綁定選擇資源並定義執行動作。它提供靠近 API Server 的校驗路徑,但範圍過寬或策略不可用可能拒絕合法的恢復操作。
假設生產命名空間有標籤,映像來源可在准入欄位中取得,平台工程師負責策略。設計必須區分硬性安全規則與告警,支援試運行,並保留有審計的緊急路徑。
面試官考察點
面試官關注策略定義與綁定是否分離、失敗行為是否明確、資源匹配是否收窄、例外模型是否可測試。強回答會討論 CEL 類型檢查、版本化發布、審計指標,以及策略引擎或依賴資料不可用時的行為。
普通回答只寫一個拒絕壞 YAML 的表達式。強回答會解釋範圍、動作級別、相容性、可觀測性和回滾。
回答前需要釐清的問題
- 涉及哪些 API group、版本、命名空間和操作?
- 規則檢查映像身份、摘要固定、主機存取,還是全部?
- 試點階段應拒絕、警告還是僅審計?
- 哪些控制器或系統命名空間需要例外,誰負責批准?
- 策略阻止事故修復時,恢復路徑是什麼?
如果規則依賴 CEL 無法可靠存取的外部狀態,應保持策略本地化,並用獨立控制器完成複雜檢查。如果例外範圍很大,策略會產生虛假的安全感。
30 秒回答框架
「我會定義小而有型別的 CEL 規則,只綁定到生產工作負載和相關操作。先以審計或警告模式運行,按負責人統計違規,再逐條轉為拒絕。例外要窄、可審計,並有經過演練的緊急路徑。我會監控准入延遲、拒絕率和恢復成功率;策略不安全時回滾綁定。」
分步驟深入解答
- 定義不變量。 分別編寫映像倉庫白名單、摘要要求和生產禁止 hostNetwork 的規則,避免一個難測難解釋的大表達式。
- 類型檢查 CEL。 針對資源 schema 驗證表達式,涵蓋缺失欄位、列表、更新和刪除操作,把 fixture 納入評審流程。
- 用綁定收窄範圍。 只匹配生產命名空間、必要工作負載和需保護的操作,讓團隊可以獨立採用不同規則。
- 選擇執行動作。 先審計或警告,負責人修復後再拒絕,並把動作寫入變更歷史。
- 設計例外。 只豁免指定系統身份或命名空間,要求過期或批准記錄,並對使用例外告警。
- 安全回滾。 策略定義版本化,回滾時停用綁定而不是刪除歷史,確認文件化路徑可讓緊急 Deployment 繼續。
替代方案包括存取外部資料的校驗 webhook,或用於標準化的變更加校驗組合。確定性、本地化且必須靠近 API Server 執行的不變量適合內建策略。
高品質示範回答
「我會建立三個策略:倉庫白名單、映像摘要必須存在、生產 Deployment 禁止 hostNetwork。綁定只匹配帶標籤的生產命名空間。試點先審計一週,給負責人傳送違規報告,修正誤報後再啟用拒絕。平台和 break-glass 身份是唯一例外,要求過期時間和審計事件。我會告警准入延遲和被拒絕的恢復變更;事故暴露不安全規則時,透過停用綁定回滾。」
常見錯誤
- 錯誤表現: 匹配所有命名空間和操作 → 失敗原因: 系統控制器和恢復路徑被阻塞 → 修正方法: 收窄綁定範圍。
- 錯誤表現: 把警告當作強制執行 → 失敗原因: 使用者誤以為已獲得安全保證 → 修正方法: 明確動作級別和升級條件。
- 錯誤表現: 對缺失欄位使用無類型 CEL → 失敗原因: 更新和舊 API 版本行為不同 → 修正方法: 類型檢查並測試缺失欄位。
- 錯誤表現: 讓例外永久存在 → 失敗原因: 繞過會變成真正的策略 → 修正方法: 要求過期時間、負責人和審計。
追問及應對
策略表達式有語法錯誤怎麼辦?
Kubernetes 會驗證策略定義並報告錯誤,不會接受無效表達式。仍應使用 fixture 評審,並在行為確認前讓綁定保持審計模式。
規則需要外部漏洞資料庫怎麼辦?
不要假設 CEL 可以取得任意外部狀態。使用負責新鮮度、逾時和失敗語義的控制器或 webhook;本地不變量繼續由內建策略執行。
拒絕規則阻止修復時,值班工程師如何恢復?
提供範圍窄、有審計、帶過期的 break-glass 身份或命名空間,記錄批准,並對使用告警。強制前先演練。
什麼時候應該移除策略?
誤報持續過高、准入延遲威脅 API Server,或不變量已由更強控制接管時,停用或移除綁定。保留歷史和指標。