前面在介紹 Pod 的時候,有提到應用程式的架構有可能會因為需求而改變,其中一個提到的例子是網路,由於容器共享 Linux Kernel,所以其中一個容器漏洞,可能變成攻擊面而橫向取得其他容器的封包,為了避免這個問題,我們導入的 mTLS 雙向加密 Pod 與 Pod 之間的流量。
提供 mTLS 最常見的方式,就是在 Pod 裡面啟動一個 sidecar 容器,然後由這個 sidecar 去處理流入以及對外的流量。
這一切都很美好對吧?只要在你的 Pod 裡面多一個 container 就可以解決這個問題,直到你發現你需要幫 500+ 個 Pod 配置 sidecar,而且同時,還陸陸續續有其他 Pod 創建。
因此,我們可以藉由 Admission Controller,去對每一個 Pod 注入 Sidecar,
方法是用 mutate 類型的 admission controller 會去打 Webhook,而這個 Webhook 會把接收的請求裡面的 Pod 注入 sidecar。
這樣你就不需要為每一個 Pod 手動配置 sidecar 了!
Dynamic Admission controller 的 validate 常用於安全以及配置檢查功能,如果有開發 CRDs 可以用 Admission Controller 去檢查配置錯誤。
實務上注意:
一次一個 namespace 注入: 大部分這類工具都提供注入整個叢集,但是這樣有可能出現非預期的錯誤,尤其是 kube-system 這類關鍵的 namespace,所以一定要使用 NamespaceSelector 相關的功能。
嚴格控管 Admission webhook RBAC: 只要用戶可以修改 Admission webhook,幾乎可以端走整個叢集,所以必須要注意這個攻擊面。