资讯专栏INFORMATION COLUMN

k8s :kube-apiserver 访问 etcd 后端存储

zhjx922 / 2336人阅读

摘要:前言本文介绍是如何访问后端存储相关源代码主要在通用接口原文注释定义了后端存储的通用接口,主要是一些增删改查方法,这种面向接口编程,将实现和设计分离的设计提高了软件的可扩展性,降低了模块间的耦合度,比如只要我们提供的具体实现,那么除了使用

前言

本文介绍 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 后端存储相关的类(结构)和方法,用到的设计模式以及架构上的套路

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/32642.html

相关文章

  • k8skube-apiserver 访问 etcd 后端存储

    摘要:前言本文介绍是如何访问后端存储相关源代码主要在通用接口原文注释定义了后端存储的通用接口,主要是一些增删改查方法,这种面向接口编程,将实现和设计分离的设计提高了软件的可扩展性,降低了模块间的耦合度,比如只要我们提供的具体实现,那么除了使用 前言 本文介绍 kube-apiserver 是如何访问 etcd 后端存储 相关源代码主要在 kubernetes/staging/src/k8s....

    shenhualong 评论0 收藏0
  • k8skube-apiserver 启动流程 - 1

    摘要:前言看源代码有一段时间,总感觉在迷宫里乱窜,有时候觉得终于找到出口了,一下子又撞墙了,总结下来还是自己的内功不够深厚,本文是对遗留,即将废弃初始化流程以及数据结构的一个梳理,算是做个路标,便于以后在迷宫中还能找到回来的路主要功能是提供接 前言 看 k8s 源代码有一段时间,总感觉在迷宫里乱窜,有时候觉得终于找到出口了,一下子又撞墙了,总结下来还是自己的内功不够深厚,本文是对 kube-...

    wwolf 评论0 收藏0
  • k8skube-apiserver 启动流程 - 1

    摘要:前言看源代码有一段时间,总感觉在迷宫里乱窜,有时候觉得终于找到出口了,一下子又撞墙了,总结下来还是自己的内功不够深厚,本文是对遗留,即将废弃初始化流程以及数据结构的一个梳理,算是做个路标,便于以后在迷宫中还能找到回来的路主要功能是提供接 前言 看 k8s 源代码有一段时间,总感觉在迷宫里乱窜,有时候觉得终于找到出口了,一下子又撞墙了,总结下来还是自己的内功不够深厚,本文是对 kube-...

    RayKr 评论0 收藏0
  • k8skube-apiserver RESTful API 实现 - Storage

    摘要:前言了解的同学都知道,对外提供接口提供查询,监听集群资源状态的服务,主要就做一件事,就是如何将接口调用映射到对后端存储比如的增删改查访问,在设计的时候考虑到是个快速迭代的开源项目,很多接口版本可能在未来版本发生变化,因此如何设计一个扩展 前言 了解 k8s 的同学都知道,kube-apiserver 对外提供 RESTful API 接口提供 查询,监听集群(资源)状态的服务,kube...

    frank_fun 评论0 收藏0
  • k8skube-apiserver RESTful API 实现 - Storage

    摘要:前言了解的同学都知道,对外提供接口提供查询,监听集群资源状态的服务,主要就做一件事,就是如何将接口调用映射到对后端存储比如的增删改查访问,在设计的时候考虑到是个快速迭代的开源项目,很多接口版本可能在未来版本发生变化,因此如何设计一个扩展 前言 了解 k8s 的同学都知道,kube-apiserver 对外提供 RESTful API 接口提供 查询,监听集群(资源)状态的服务,kube...

    ChristmasBoy 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<