摘要:前言本文介紹是如何訪問后端存儲相關源代碼主要在通用接口原文注釋定義了后端存儲的通用接口,主要是一些增刪改查方法,這種面向接口編程,將實現和設計分離的設計提高了軟件的可擴展性,降低了模塊間的耦合度,比如只要我們提供的具體實現,那么除了使用
前言
本文介紹 kube-apiserver 是如何訪問 etcd 后端存儲
相關源代碼主要在 kubernetes/staging/src/k8s.io/apiserver/pkg/storage
通用接口Interface offers a common interface for object marshaling/unmarshaling operations and hides all the storage-related operations behind it(原文注釋)
// kubernetes/vendor/k8s.io/apiserver/storage/interfaces.go type Interface interface { Versioner() Versioner Create(...) Delete(...) Watch(...) WatchList(...) Get(...) GetToList(...) List(...) GuaranteedUpdate(...) }
Interface 定義了后端存儲的通用接口,主要是一些"增刪改查"方法,這種面向接口編程,將實現和設計分離的設計提高了軟件的可擴展性,降低了模塊間的耦合度,比如只要我們提供 Interface 的具體實現,那么除了使用 etcd 作為后端存儲之外,是不是也可以使用 consul/zookeeper 等分布式 kv 存儲?
具體實現Interface 接口目前有兩個具體實現類,分別對應 etcd v2 和 etcd v3 兩個不同的 etcd api 版本
// kubernetes/vendor/k8s.io/apiserver/pkg/storage/etcd/etcd_helper.go type etcdHelper struct { ... } // kubernetes/vender/k8s.io/apiserver/pkg/storage/etcd3/store.go type store struct { ... }
這兩個實現類的名字差的也太大了。。。go 語言使用非侵入式的接口,所以從 類(結構)名上是看不出他們兩和 storage.Interface 有半毛線關系的,但是只要它們實現了 storate.Interface 接口里面聲明的方法他們就 "is-a" storage.Interface
創建factory 包里的《工廠方法》Create 會根據配置 storagebackend.Config 創建相應的 storage.Interface
func Create(c storagebackend.Config) (storage.Interface, DestroyFunc, error) { swtich c.Type { case storagebackend.StorageTypeETCD2: return newETCD2Storage(c) case storagebackend.StorageTypeUnset, storageback.StorageTypeETCD3: return newETCD3Storage(c) default: return nil, nil, fmt.Errorf("unknown storage type: %s", c.Type) } }使用
storage.Interface 被 Store 類(這又是什么東東?)用來實現 rest.StandardStorage(RESTful 增刪改查) 接口
// kubernetes/vendor/k8s.io/apiserver/pkg/registry/generic/registry/store.go type Store struct { ... Storage storage.Interface } // Create inserts a new item according to the unique key from the object func (e *Store) Create(ctx genericapirequest.Context, obj runtime.Object, includeUninitialized bool)(runtime.Object, error) { ... key, err := e.KeyFunc(ctx, name) ... out := e.NewFunc() if err := e.Storage.Create(ctx, key, obj, out, ttl); err != nil { ... } ... }總結
本介紹了 kube-apiserver 訪問 etcd 后端存儲相關的類(結構)和方法,用到的設計模式以及架構上的套路
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/32642.html
摘要:前言本文介紹是如何訪問后端存儲相關源代碼主要在通用接口原文注釋定義了后端存儲的通用接口,主要是一些增刪改查方法,這種面向接口編程,將實現和設計分離的設計提高了軟件的可擴展性,降低了模塊間的耦合度,比如只要我們提供的具體實現,那么除了使用 前言 本文介紹 kube-apiserver 是如何訪問 etcd 后端存儲 相關源代碼主要在 kubernetes/staging/src/k8s....
摘要:前言看源代碼有一段時間,總感覺在迷宮里亂竄,有時候覺得終于找到出口了,一下子又撞墻了,總結下來還是自己的內功不夠深厚,本文是對遺留,即將廢棄初始化流程以及數據結構的一個梳理,算是做個路標,便于以后在迷宮中還能找到回來的路主要功能是提供接 前言 看 k8s 源代碼有一段時間,總感覺在迷宮里亂竄,有時候覺得終于找到出口了,一下子又撞墻了,總結下來還是自己的內功不夠深厚,本文是對 kube-...
摘要:前言看源代碼有一段時間,總感覺在迷宮里亂竄,有時候覺得終于找到出口了,一下子又撞墻了,總結下來還是自己的內功不夠深厚,本文是對遺留,即將廢棄初始化流程以及數據結構的一個梳理,算是做個路標,便于以后在迷宮中還能找到回來的路主要功能是提供接 前言 看 k8s 源代碼有一段時間,總感覺在迷宮里亂竄,有時候覺得終于找到出口了,一下子又撞墻了,總結下來還是自己的內功不夠深厚,本文是對 kube-...
摘要:前言了解的同學都知道,對外提供接口提供查詢,監聽集群資源狀態的服務,主要就做一件事,就是如何將接口調用映射到對后端存儲比如的增刪改查訪問,在設計的時候考慮到是個快速迭代的開源項目,很多接口版本可能在未來版本發生變化,因此如何設計一個擴展 前言 了解 k8s 的同學都知道,kube-apiserver 對外提供 RESTful API 接口提供 查詢,監聽集群(資源)狀態的服務,kube...
摘要:前言了解的同學都知道,對外提供接口提供查詢,監聽集群資源狀態的服務,主要就做一件事,就是如何將接口調用映射到對后端存儲比如的增刪改查訪問,在設計的時候考慮到是個快速迭代的開源項目,很多接口版本可能在未來版本發生變化,因此如何設計一個擴展 前言 了解 k8s 的同學都知道,kube-apiserver 對外提供 RESTful API 接口提供 查詢,監聽集群(資源)狀態的服務,kube...
閱讀 3199·2021-11-10 11:36
閱讀 3145·2021-11-02 14:39
閱讀 1726·2021-09-26 10:11
閱讀 4929·2021-09-22 15:57
閱讀 1685·2021-09-09 11:36
閱讀 2053·2019-08-30 12:56
閱讀 3487·2019-08-30 11:17
閱讀 1702·2019-08-29 17:17