摘要:前言了解的同學(xué)都知道,對外提供接口提供查詢,監(jiān)聽集群資源狀態(tài)的服務(wù),主要就做一件事,就是如何將接口調(diào)用映射到對后端存儲比如的增刪改查訪問,在設(shè)計的時候考慮到是個快速迭代的開源項目,很多接口版本可能在未來版本發(fā)生變化,因此如何設(shè)計一個擴(kuò)展
前言
了解 k8s 的同學(xué)都知道,kube-apiserver 對外提供 RESTful API 接口提供 查詢,監(jiān)聽集群(資源)狀態(tài)的服務(wù),kube-apiserver 主要就做一件事,就是如何將 RESTful API (CREATE, DELETE, UPDATE, GET .etc)接口調(diào)用映射到對后端存儲(比如 etcd)的(增刪改查)訪問,在設(shè)計的時候考慮到 k8s 是個快速迭代的開源項目,很多 API 接口(版本)可能在未來版本發(fā)生變化,因此如何設(shè)計一個擴(kuò)展性強,耦合度低的架構(gòu)應(yīng)該是 Google 那幫貨當(dāng)初主要考慮的問題,所以才導(dǎo)致 kube-apiserver 本來相比 kube-scheduler 和 kube-controller-manager 應(yīng)該簡單的代碼設(shè)計的巨復(fù)雜(個人觀點)~
從 kube-apiserver 收到 RESTful API 請求到從 后端存儲中獲?。ǜ?.etc)到數(shù)據(jù)大概需要經(jīng)過一下幾層(非官方命名),各層之間通過 《接口》 交互(解偶)
RESTful API
||
||
Storage
||
||
Sotrage Backend(etcd2,etcd3)
比如 Storage 和 Storage Backend 之間通過 Storage Backend Interface(參考k8s :kube-apiserver 訪問 etcd 后端存儲 )交互,Storage 和 RESTful API 之間通過 REST Operation Interface(增刪改查 方法的封裝)交互
StorageStorage 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 暴露出去的資源都必須實現(xiàn) Storage 接口,Storage 接口是個最小接口(單一職責(zé)),資源類可以根據(jù)自身情況實現(xiàn)其它各種接口
// 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根據(jù)該(子)接口測試 Storage 是否支持相關(guān)操作,然后注冊相應(yīng)的 API 接口,比如如果 Storage 支持 Delete 接口,就注冊一個 HTTP method 為 DELETE 的方法到相應(yīng)的資源路徑
Storage 實現(xiàn)類kubernetes/pkg/registry/core 目錄下包含了各種 Storage 實現(xiàn)類,比如大家耳熟能詳?shù)?pod, service, endpoint, configmap, node 等等,各個資源的目錄結(jié)構(gòu)很相似,以 pod 為例
kubernetes/pkg/registry/core/pod rest storage storage.go <- Storage 實現(xiàn) doc.go strategy.go strategy_test.goPodStorage
我們以 pod storage 為例來分析 storage 創(chuàng)建,首先是 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,對應(yīng)具體的 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 方法創(chuàng)建,各個 XXXREST 共享 Store
func NewStorage(optsGetter generic.RESTOptionsGetter, ...) { 創(chuàng)建 genericregistry.Store store := &genericregistry.Store { ... } ... return PodStorage { Pod: &REST{store, proxyTransport}, Binding: &BindingREST{store: store} ... } }Storage 注冊
Storage 是如何"綁定"到 api 接口呢?這中間還涉及到一些數(shù)據(jù)結(jié)構(gòu)(類),這里先列出綁定相關(guān)的代碼:
// kubernetes/pkg/registry/core/rest/storage_core.go func (c LegacyRESTStorageProvider) NewLegacyRESTStorage(...) { ... restStorageMap := map[string]rest.Storage { "pods": podStorage.Pod, "pods/attach": podStorage.Attach ... } }
后續(xù)再詳細(xì)分析
總結(jié)本文介紹了 kube-apiserver 中 Storage 相關(guān)的一些概念,希望對大家閱讀 k8s 源代碼有所幫助
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/33049.html
摘要:前言了解的同學(xué)都知道,對外提供接口提供查詢,監(jiān)聽集群資源狀態(tài)的服務(wù),主要就做一件事,就是如何將接口調(diào)用映射到對后端存儲比如的增刪改查訪問,在設(shè)計的時候考慮到是個快速迭代的開源項目,很多接口版本可能在未來版本發(fā)生變化,因此如何設(shè)計一個擴(kuò)展 前言 了解 k8s 的同學(xué)都知道,kube-apiserver 對外提供 RESTful API 接口提供 查詢,監(jiān)聽集群(資源)狀態(tài)的服務(wù),kube...
摘要:啟動時報錯,錯誤信息如下此時查看,也沒有。經(jīng)過一些參數(shù)的研究,最后發(fā)現(xiàn)是版本的問題。修改參數(shù),再啟動可以正常使用。 kube-apiserver啟動時報錯,錯誤信息如下: Flag --kubelet-port has been deprecated, kubelet-port is deprecated and will be removed. W0914 15:57:18.5740...
摘要:前言本文介紹是如何訪問后端存儲相關(guān)源代碼主要在通用接口原文注釋定義了后端存儲的通用接口,主要是一些增刪改查方法,這種面向接口編程,將實現(xiàn)和設(shè)計分離的設(shè)計提高了軟件的可擴(kuò)展性,降低了模塊間的耦合度,比如只要我們提供的具體實現(xiàn),那么除了使用 前言 本文介紹 kube-apiserver 是如何訪問 etcd 后端存儲 相關(guān)源代碼主要在 kubernetes/staging/src/k8s....
摘要:前言本文介紹是如何訪問后端存儲相關(guān)源代碼主要在通用接口原文注釋定義了后端存儲的通用接口,主要是一些增刪改查方法,這種面向接口編程,將實現(xiàn)和設(shè)計分離的設(shè)計提高了軟件的可擴(kuò)展性,降低了模塊間的耦合度,比如只要我們提供的具體實現(xiàn),那么除了使用 前言 本文介紹 kube-apiserver 是如何訪問 etcd 后端存儲 相關(guān)源代碼主要在 kubernetes/staging/src/k8s....
摘要:前言看源代碼有一段時間,總感覺在迷宮里亂竄,有時候覺得終于找到出口了,一下子又撞墻了,總結(jié)下來還是自己的內(nèi)功不夠深厚,本文是對遺留,即將廢棄初始化流程以及數(shù)據(jù)結(jié)構(gòu)的一個梳理,算是做個路標(biāo),便于以后在迷宮中還能找到回來的路主要功能是提供接 前言 看 k8s 源代碼有一段時間,總感覺在迷宮里亂竄,有時候覺得終于找到出口了,一下子又撞墻了,總結(jié)下來還是自己的內(nèi)功不夠深厚,本文是對 kube-...
閱讀 1745·2021-10-18 13:30
閱讀 2637·2021-10-09 10:02
閱讀 2972·2021-09-28 09:35
閱讀 2099·2019-08-26 13:39
閱讀 3532·2019-08-26 13:36
閱讀 1960·2019-08-26 11:46
閱讀 1144·2019-08-23 14:56
閱讀 1703·2019-08-23 10:38