k8s :kube-apiserver 訪問 etcd 後端存儲

前言

本文介紹 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 存儲?api

具體實現

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.Interfaceide

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 後端存儲相關的類(結構)和方法,用到的設計模式以及架構上的套路rest

相關文章
相關標籤/搜索