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