为什么要使用 Kubernetes 准入控制器
Kubernetes 準入控制器是什么?為什么要使用準入控制器?如何使用?本文對 Kubernetes 準入控制器進行了詳細解釋。
來源 | K8sMeetup
作者 |?Arun Prasad
頭圖?|?下載于視覺中國
Kubernetes 控制平面由幾個組件組成。其中一個組件是 kube-apiserver,簡單的 API server。它公開了一個 REST 端點,用戶、集群組件以及客戶端應用程序可以通過該端點與集群進行通信。總的來說,它會進行以下操作:
從客戶端應用程序(如 kubectl)接收標準 HTTP 請求。
驗證傳入請求并應用授權策略。
在成功的身份驗證中,它能根據端點對象(Pod、Deployments、Namespace 等)和 http 動作(Create、Put、Get、Delete 等)執行操作。
對 etcd 數據存儲進行更改以保存數據。
操作完成,它就向客戶端發送響應。
請求流程
現在讓我們考慮這樣一種情況:在請求經過身份驗證后,但在對 etcd 數據存儲進行任何更改之前,我們需要攔截該請求。例如:
攔截客戶端發送的請求。
解析請求并執行操作。
根據請求的結果,決定對 etcd 進行更改還是拒絕對 etcd 進行更改。
Kubernetes 準入控制器就是用于這種情況的插件。在代碼層面,準入控制器邏輯與 API server 邏輯解耦,這樣用戶就可以開發自定義攔截器(custom interceptor),無論何時對象被創建、更新或從 etcd 中刪除,都可以調用該攔截器。
有了準入控制器,從任意來源到 API server 的請求流將如下所示:
準入控制器階段(來自官方文檔)
官方文檔地址:https://kubernetes.io/blog/2019/03/21/a-guide-to-kubernetes-admission-controllers/
根據準入控制器執行的操作類型,它可以分為 3 種類型:
Mutating(變更)
Validating(驗證)
Both(兩者都有)
Mutating:這種控制器可以解析請求,并在請求向下發送之前對請求進行更改(變更請求)。
示例:AlwaysPullImages
Validating:這種控制器可以解析請求并根據特定數據進行驗證。
示例:NamespaceExists
Both:這種控制器可以執行變更和驗證兩種操作。
示例:CertificateSigning
有關這些控制器更多信息,查看官方文檔:https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#what-does-each-admission-controller-do
準入控制器過程包括按順序執行的2個階段:
Mutating(變更)階段(先執行)
Validation (驗證)階段(變更階段后執行)
Kubernetes 集群已經在使用準入控制器來執行許多任務。
Kubernetes 附帶的準入控制器列表:https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#what-does-each-admission-controller-do
通過該列表,我們可以發現大多數操作,如 AlwaysPullImages、DefaultStorageClass、PodSecurityPolicy 等,實際上都是由不同的準入控制器執行的。
如何啟用或禁用準入控制器?
要啟用準入控制器,我們必須在啟動 kube-apiserver 時,將以逗號分隔的準入控制器插件名稱列表傳遞給?--enable-ading-plugins。對于默認插件,命令如下所示:
要禁用準入控制器插件,可以將插件名稱列表傳遞給?--disable-admission-plugins。它將覆蓋默認啟用的插件列表。
默認準入控制器
NamespaceLifecycle
LimitRanger
ServiceAccount
TaintNodesByCondition
Priority
DefaultTolerationSeconds
DefaultStorageClass
StorageObjectInUseProtection
PersistentVolumeClaimResize
RuntimeClass
CertificateApproval
CertificateSigning
CertificateSubjectRestriction
DefaultIngressClass
MutatingAdmissionWebhook
ValidatingAdmissionWebhook
ResourceQuota
為什么要使用準入控制器?
準入控制器能提供額外的安全和治理層,以幫助 Kubernetes 集群的用戶使用。
執行策略:通過使用自定義準入控制器,我們可以驗證請求并檢查它是否包含特定的所需信息。例如,我們可以檢查 Pod 是否設置了正確的標簽。如果沒有,那可以一起拒絕該請求。某些情況下,如果請求中缺少一些字段,我們也可以更改這些字段。例如,如果 Pod 沒有設置資源限制,我們可以為 Pod 添加特定的資源限制。通過這樣的方式,除非明確指定,集群中的所有 Pod 都將根據我們的要求設置資源限制。Limit Range 就是這種實現。
安全性:我們可以拒絕不遵循特定規范的請求。例如,沒有一個 Pod 請求可以將安全網關設置為以 root 用戶身份運行。
統一工作負載:通過更改請求并為用戶未設置的規范設置默認值,我們可以確保集群上運行的工作負載是統一的,并遵循集群管理員定義的特定標準。這些就是我們開始使用 Kubernetes 準入控制器需要知道的所有理論。
原文鏈接:https://medium.com/cloudlego/kubernetes-admission-controllers-request-interceptors-47a9b12c5303
更多閱讀推薦
都在說云原生,它的技術圖譜你真的了解嗎?
SRE 是如何保障穩定性的
如何寫出讓 CPU 跑得更快的代碼?
Serverless 在 SaaS 領域的最佳實踐
云原生人物志|Pulsar翟佳:社區的信任最重要
阿里的 RocketMQ 如何讓雙十一峰值之下0故障
總結
以上是生活随笔為你收集整理的为什么要使用 Kubernetes 准入控制器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实现工具自由!开源的桌面工具箱
- 下一篇: 年终福利 | “社区之星”(社区核心贡