對Kubernetes API 請求流程進行解析。後續還將對API Server的存儲和擴展點等主題進行介紹。本篇是Kubernetes API Server系列第三篇。
請求和處理流程
在介紹了Kubernetes API中使用到的術語之後,接下來我們介紹如何處理API請求。API源碼存在於kubernetes/pkg/api路徑中,會處理集羣內以及集羣外客戶端的請求。
那麼,當HTTP請求到達Kubernetes API時,具體會發現什麼呢?從上層看,會發現以下交互:
1.HTTP請求由一串過濾器(filters)進行處理,這些過濾器註冊在DefaultBuildHandlerChain()(參閱源碼:https://github.com/kubernetes/apiserver中的config.go)中,並執行相應的處理。過濾器要麼會將信息傳遞並附加到ctx.RequestInfo上(例如通過了身份認證的用戶),要麼返回適當的HTTP響應代碼。
2.第二步,複用器(multiplexer,參閱源碼:https://github.com/kubernetes/apiserver中的container.go)會根據HTTP路徑,將HTTP請求路由到相應的處理程序(handler)。
3.第三步,routes(在routes/*中定義)會將處理程序(handler)與HTTP路徑進行連接。
4.第四步,按照API Group進行註冊的處理程序(參閱源碼:https://github.com/kubernetes/apiserver中的groupversion.go和installer.go),會處理HTTP請求和上下文(context,如user、rights等),並將請求的對象從存儲中傳送出來。
注意,爲了簡潔,在上圖中我們省略了HTTP路徑中的$NAMESPACE字段。
現在我們進一步深入的對前文中提到的DefaultBuildHandlerChain()中建立的過濾器(filters)進行介紹:
WithRequestInfo():在requestinfo.go中定義,將RequestInfo附加到上下文中。
WithMaxInFlightLimit():在maxinflight.go中定義,對當前的請求數量進行限制。
WithTimeoutForNonLongRunningRequests():在timeout.go中定義,超時暫停非長時間運行請求(如大多數GET,PUT,POST,DELETE請求),這種請求與長時間運行請求(如watch和proxy請求)正好相反。
WithPanicRecovery():在wrap.go中定義,包裝一個http Handler來恢復和記錄報錯。
WithCORS():在cors.go中定義,提供了一個CORS實現;CORS代表跨原始資源共享(Cross-Origin Resource Sharing),是一種允許嵌入在HTML頁面中的JavaScript生成XMLHttpRequests請求到一個域(domain)的機制,這個域不同於JavaScript的初始起源。
WithAuthentication():在authentication.go中定義,嘗試以用戶身份對給定的請求進行驗證,並將用戶信息存儲在提供的上下文中。成功後,授權HTTP header將從請求中刪除。
WithAudit():在audit.go中定義,使用所有傳入請求的審計日誌信息來充實handler。審計日誌的條目包含很多信息,例如請求的源IP、調用操作的用戶信息以及請求的命名空間等。
WithImpersonation():在impersonation.go中定義,通過檢查試圖對用戶進行修改的請求(類似sudo),來對假用戶進行處理;
WithAuthorization():在authorization.go中定義,將所有授權的請求傳遞給已經將請求分發給正確的handler的複用器,否則返回禁止錯誤(forbidden error)。
本文轉移K8S技術社區-深度解析 | K8S API Server之請求處理