什么是AdmissionWebhook?
什么是AdmissionWebhook,就要先了解K8S中的admission controller, 按照官方的解釋是: admission controller是攔截(經過身份驗證)API Server請求的網關,並且可以修改請求對象或拒絕請求。簡而言之,它可以認為是攔截器,類似web框架中的middleware。
為什么使用 admission webhook?
kubernetes的admission webhook為開發者提供了非常靈活的插件模式,在kubernetes資源持久化之前用戶可以對指定資源做校驗、修改等操作。應用場景 eg:接入sidecare、設置默認的servceaccount、設置quota等等。
總體來說,admission-plugins分為三大類:
1.修改類型(mutating)
2.驗證類型(validating)
3.既是修改又是驗證類型(mutating&validating)
這些admission plugin構成一個順序鏈,先后順序決定誰先調用,但不會影響使用。
這里關心的plugin有兩個:
一、MutatingAdmissionWebhook, ValidatingAdmissionWebhook
- MutatingAdmissionWebhook: 做修改操作的AdmissionWebhook
- ValidatingAdmissionWebhook: 做驗證操作的AdmissionWebhook
引用kubernetes官方博客的一張圖來說明MutatingAdmissionWebhook和ValidatingAdmissionWebhook所處的位置:
解釋下這個過程:
1.api請求到達K8S API Server
2.請求要先經過認證
- kubectl調用需要kubeconfig
- 直接調用K8S api需要證書+bearToken
- client-go調用也需要kubeconfig
3.執行一連串的admission controller,包括MutatingAdmissionWebhook和ValidatingAdmissionWebhook, 先串行執行MutatingAdmission的Webhook list
4.對請求對象的schema進行校驗
5.並行執行ValidatingAdmission的Webhook list
6.最后寫入etcd
應用場景:
- 自動打標簽 比如啟動一個應用,應用包括deployment、service、ingress; 怎么快速過濾出哪些資源屬於應用? 在K8S中,pod、service、ingress 都是獨立的資源,通過給這些資源打上label,是最快速的方式。
- 自動注入sidecar容器 應用啟動后,應用的監控、日志如何處理?借助sidecar容器注入到其pod中
- 設置默認的servceaccount、設置quota等等。