k8s :kube-apiserver RESTful API 實現 - Storage
前言
瞭解 k8s 的同學都知道,kube-apiserver 對外提供 RESTful API 介面提供 查詢,監聽集 群(資源)狀態的服務,kube-apiserver 主要就做一件事,就是如何將 RESTful API (CREATE, DELETE, UPDATE, GET .etc)介面呼叫對映到對後端儲存(比如 etcd)的(增刪改查)訪問,在設計的時候考慮到 k8s 是個快速迭代的開源專案,很多 API 介面(版本)可能在未來版本發生變化,因此如何設計一個擴充套件性強,耦合度低的架構應該是 Google 那幫貨當初主要考慮的問題,所以才導致 kube-apiserver 本來相比 kube-scheduler 和 kube-controller-manager 應該簡單的程式碼設計的巨複雜(個人觀點)~
從 kube-apiserver 收到 RESTful API 請求到從 後端儲存中獲取(更新 .etc)到資料大概需要經過一下幾層(非官方命名),各層之間通過 《介面》 互動(解偶)
RESTful API
||
<REST Operation Interface>
||
Storage
||
<Storage Backend Interface>
||
Sotrage Backend(etcd2,etcd3)
比如 Storage 和 Storage Backend 之間通過 Storage Backend Interface(參考k8s :kube-apiserver 訪問 etcd 後端儲存)互動,Storage 和 RESTful API 之間通過 REST Operation Interface(增刪改查 方法的封裝)互動
Storage
Storage is a generic interface for RESTful storage services.
Resources which are exported to the RESTful API of apiserver need to implement this interface(原文註釋,下同)
It is expected that objects may implement any of the below interfaces
所有想通過 RESTful API 暴露出去的資源都必須實現 Storage 介面,Storage 介面是個最小介面(單一職責),資源類可以根據自身情況實現其它各種介面
// kubernetes/staging/src/k8s.io/apiserver/pkg/registry/rest/rest.go
type Storage interface {
New() runtime.Object
}
REST Operation Interface
StandardStorage is an interface covering the common verbs. Provided for testing whether a resource satisfies the normal storage methods.
Use Storage when passing opaque storage objects
StandardStorage
type StandardStorage interface {
Getter Lister GreaterUpdater GracefulDeleter CollectionDeleter Watcher
}
StandardStorage 聚合了可以對 Storage 施加的操作(或者叫 Verb,動作),RESTful API根據該(子)介面測試 Storage 是否支援相關操作,然後註冊相應的 API 介面,比如如果 Storage 支援 Delete 介面,就註冊一個 HTTP method 為 DELETE 的方法到相應的資源路徑
Storage 實現類
kubernetes/pkg/registry/core 目錄下包含了各種 Storage 實現類,比如大家耳熟能詳的 pod, service, endpoint, configmap, node 等等,各個資源的目錄結構很相似,以 pod 為例
kubernetes/pkg/registry/core/pod
rest
storage
storage.go <- Storage 實現
doc.go
strategy.go
strategy_test.go
PodStorage
我們以 pod storage 為例來分析 storage 建立,首先是 pod storage 定義
type PodStorage struct {
Pod *REST Binding *BindingREST Eviction *EvictionREST Status *StatusREST Log *podrest.LogREST Proxy *podrest.ProxyREST Exec *podrest.ExecREST Attach *podrest.AttachREST PortForward *podrest.PortForwardREST
}
這裡又冒出一些新的型別 REST,BindingREST .etc,這些 XXXREST 才是"真正"的 Storage,對應具體的 RESTful endpoint
// REST implements a RESTStorage for pods type REST struct {
*genericregistry.Store
proxyTransport http.RoundTripper
}
// BindingREST implements the REST endpoint for binding pods to nodes when etcd is in use type BindingREST struct {
store *genericregistry.Store
}
XXXREST 類類包含一個 genericregistry.Store 型別的欄位,我們在k8s :kube-apiserver 訪問 etcd 後端儲存中分析過,它用於訪問後端儲存
PodStorage 通過 NewStorage 方法建立,各個 XXXREST 共享 Store
func NewStorage(optsGetter generic.RESTOptionsGetter, ...) {
建立 genericregistry.Store
store := &genericregistry.Store {
...
}
...
return PodStorage {
Pod: &REST{store, proxyTransport},
Binding: &BindingREST{store: store}
...
}
}
Storage 註冊
Storage 是如何"繫結"到 api 介面呢?這中間還涉及到一些資料結構(類),這裡先列出繫結相關的程式碼:
// kubernetes/pkg/registry/core/rest/storage_core.go func (c LegacyRESTStorageProvider) NewLegacyRESTStorage(...) {
...
restStorageMap := map[string]rest.Storage {
"pods": podStorage.Pod,
"pods/attach": podStorage.Attach
...
}
}
後續再詳細分析
總結
本文介紹了 kube-apiserver 中 Storage 相關的一些概念,希望對大家閱讀 k8s 原始碼有所幫助
相關文章
- nodejs實現restful APINodeJSRESTAPI
- 實現一個簡單的 RESTful APIRESTAPI
- SpringBoot使用Swagger2實現Restful APISpring BootSwaggerRESTAPI
- RESTful API 最佳實踐RESTAPI
- restful api最佳實踐RESTAPI
- Holer實現外網訪問本地RESTful APIRESTAPI
- DRF使用超連結API實現真正RESTfulAPIREST
- 安全優雅的RESTful API簽名實現方案RESTAPI
- RESTful API實踐總結RESTAPI
- Yii2.0 實現RESTful風格的簡單APIRESTAPI
- 理解RESTful APIRESTAPI
- 使用JWT做RESTful API的身份驗證-Go語言實現JWTRESTAPIGo
- 如何使用Node.js、TypeScript和Express實現RESTful API服務Node.jsTypeScriptExpressRESTAPI
- .NET雲原生應用實踐(二):Sticker微服務RESTful API的實現微服務RESTAPI
- SpringBoot Restful 介面實現Spring BootREST
- k8s :kube-apiserver 啟動流程 – 2K8SAPIServer
- Django RESTful API設計與實踐指南DjangoRESTAPI
- RESTful風格APIRESTAPI
- Gin與Mysql實現簡單Restful風格API實戰示例詳解PRHCMySqlRESTAPI
- 基於MySql和Sails.js的RESTful風格的api實現MySqlAIJSRESTAPI
- 我所認為的RESTful API最佳實踐RESTAPI
- 使用Golang建立RESTful API的最佳實踐案例GolangRESTAPI
- Koa2+MongoDB+JWT實戰--Restful API最佳實踐MongoDBJWTRESTAPI
- restful api設計指南RESTAPI
- 理解RESTful Api設計RESTAPI
- 使用 dynamic 型別讓 ASP.NET Core 實現 HATEOAS 結構的 RESTful API型別ASP.NETRESTAPI
- RESTful api風格介紹RESTAPI
- RESTful API 設計規範RESTAPI
- Zalando RESTful API和事件指南RESTAPI事件
- RESTFUL API 安全設計指南RESTAPI
- 簡單說說Restful APIRESTAPI
- RestFul Api 設計 之 URLRESTAPI
- 對比Restful Api和RpcRESTAPIRPC
- 一文搞懂RESTful APIRESTAPI
- 使用靜態基類方案讓 ASP.NET Core 實現遵循 HATEOAS Restful Web APIASP.NETRESTWebAPI
- RESTful架構和實現級別REST架構
- 【SpringMVC】RESTFul簡介以及案例實現SpringMVCREST
- Bing每日桌布的RESTful介面實現REST