深度解析 | K8S API Server之請求處理

對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之請求處理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章