前言
本文介绍 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 后端存储相关的类(结构)和方法,用到的设计模式以及架构上的套路
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。