題幹與適用場景
節點已經快取私有映像時,Kubernetes 是否仍應驗證 imagePullSecrets?如何選擇驗證策略並安全上線?這道後端題考察容器執行時、憑證生命週期與多租戶隔離。假設叢集使用 IfNotPresent,不同命名空間可能共用同一節點,映像倉庫支援短期憑證,而且不能因安全策略讓正常發布在大範圍同時失效。
面試官考察點
- 能否指出「本地有映像」與「目前工作負載有權使用映像」是兩個不同判斷。
- 能否解釋 kubelet 如何記錄成功拉取與憑證的關係,以及預載映像為什麼需要獨立處理。
- 能否比較
NeverVerify、NeverVerifyPreloadedImages、allowlist 與AlwaysVerify的風險與代價。 - 能否處理憑證輪替、節點重啟、快取記錄遺失、倉庫不可用與回滾問題。
回答前需要釐清的問題
先確認威脅模型:節點是否多租戶、映像是否含敏感程式碼、攻擊者是否可能建立 Pod。再確認映像由 kubelet 拉取還是節點啟動前預載,憑證是 Pod Secret、節點憑證還是服務帳戶權杖。詢問憑證輪替時是否必須立即撤銷舊授權、倉庫是否允許離線驗證,以及叢集能承受多大的重新拉取流量。最後確認目標是相容舊行為、加強隔離,還是為高敏感命名空間使用更強策略。
30 秒回答框架
「我會把映像快取命中與授權驗證分開。多租戶或高敏感映像不應因節點快取就繞過 imagePullSecrets。先啟用憑證記錄並選擇預設的預載映像例外,再按節點與命名空間灰度到 AlwaysVerify;用啟動成功率、重新拉取比例、倉庫延遲、憑證輪替生效時間與跨租戶拒絕率設護欄。必須預留快取記錄遷移、倉庫故障降級與關閉 feature gate 的回滾路徑。」
分步驟深入解答
- 分離兩個判定:快取只回答「位元組是否在節點」,憑證驗證回答「這個請求是否有權使用它」;不能把
IfNotPresent當成授權策略。 - 記錄成功關係:kubelet 為映像記錄曾經成功的認證資訊。相同憑證可本地驗證,陌生或輪替後的憑證需要重新向倉庫拉取並完成授權。
- 處理預載邊界:節點外部預載的映像沒有 kubelet 拉取記錄。
NeverVerifyPreloadedImages可保留相容性,NeverVerifyAllowListedImages把例外縮小到明確清單,AlwaysVerify則要求全部驗證。 - 設計憑證輪替:舊憑證的本地成功記錄不會自動證明新憑證有效;輪替應觸發重新拉取或明確失效,並監控倉庫限流與啟動延遲。
- 管理升級風險:首次啟用時,現有映像可能被視為預載;啟用前清理不應繼續信任的快取,記錄節點重啟與快取檔案遷移對行為的影響。
- 灰度與回滾:先按節點池、工作負載標籤或低風險命名空間啟用,觀察拒絕率與倉庫負載;保留設定為
NeverVerify或關閉 feature gate 的快速回滾。
高品質示範回答
我會驗證,但策略取決於威脅模型。快取命中只說明節點已有映像位元組,不說明目前 Pod 有權使用私有映像;多租戶節點如果跳過驗證,擁有不同憑證的工作負載可能重用快取。Kubernetes 的方案讓 kubelet 記錄映像與成功認證的關係:相同憑證可在本地驗證,未知或輪替後的憑證需要重新存取倉庫。預載映像沒有這些記錄,所以我會先選擇 NeverVerifyPreloadedImages 保持相容,並為高敏感節點逐步改成 AlwaysVerify;允許例外時使用明確的預載 allowlist,而不是全域關閉。上線前清理不應繼續信任的節點快取,演練 kubelet 重啟、記錄遷移、倉庫限流與憑證輪替。灰度階段比較 Pod 啟動成功率、重新拉取比例、倉庫 P95 延遲、認證拒絕與跨租戶重用嘗試。若倉庫故障導致大量冷啟動失敗,回滾 feature gate 或策略,但保留告警與稽核記錄。這樣把安全邊界、相容性與容量風險放在同一個發布決策中。
常見錯誤
- 認為映像 digest 一致就代表所有命名空間都有使用權。
- 只說啟用
AlwaysVerify,不討論預載映像、節點重啟與倉庫不可用。 - 把憑證輪替當成 Secret 更新,忽略舊成功記錄與重新拉取行為。
- 直接全域切換策略,沒有節點池灰度、倉庫容量預算與回滾開關。
- 把
NeverVerifyPreloadedImages描述成安全保證,卻沒有核對預載來源與 allowlist。
追問及應對
為什麼相同憑證可以不重新存取倉庫?
成功拉取記錄已證明該憑證曾被倉庫接受,kubelet 可在本地驗證相同憑證與映像的關係。若憑證變更、記錄不存在或策略要求強驗證,則必須重新拉取或存取倉庫。
節點重啟後快取記錄遺失怎麼辦?
把記錄持久化在 kubelet 目錄並按版本遷移;記錄不可讀時按更嚴格路徑處理,寧可觸發重新拉取,也不要默默恢復成任何人都能使用快取映像。
倉庫暫時不可用,是否允許繼續使用快取?
低風險環境可按明確策略短暫降級,高敏感工作負載不應繞過授權。降級必須可觀測、限時,並記錄哪些請求在離線狀態被允許,避免偶發故障變成長期越權。
如何驗證憑證輪替真的生效?
用舊 Secret、新 Secret、沒有 Secret 與不同命名空間分別啟動同一私有映像;檢查 kubelet 事件、倉庫存取、快取記錄與 Pod 結果。驗證舊憑證拒絕、新憑證成功,以及倉庫限流時的回滾行為。