开发者社区> 店家小二> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

k8s :kube-apiserver RESTful API 实现 - Storage

简介: 前言 了解 k8s 的同学都知道,kube-apiserver 对外提供 RESTful API 接口提供 查询,监听集群(资源)状态的服务,kube-apiserver 主要就做一件事,就是如何将 RESTful API (CREATE, DELETE, UPDATE, GET .
+关注继续查看

前言

了解 k8s 的同学都知道,kube-apiserver 对外提供 RESTful API 接口提供 查询,监听集 群(资源)状态的服务,kube-apiserver 主要就做一件事,就是如何将 RESTful API (CREATE, DELETE, UPDATE, GET .etc)接口调用映射到对后端存储(比如 etcd)的(增删改查)访问,在设计的时候考虑到 k8s 是个快速迭代的开源项目,很多 API 接口(版本)可能在未来版本发生变化,因此如何设计一个扩展性强,耦合度低的架构应该是 Google 那帮货当初主要考虑的问题,所以才导致 kube-apiserver 本来相比 kube-scheduler 和 kube-controller-manager 应该简单的代码设计的巨复杂(个人观点)~

从 kube-apiserver 收到 RESTful API 请求到从 后端存储中获取(更新 .etc)到数据大概需要经过一下几层(非官方命名),各层之间通过 《接口》 交互(解偶)

RESTful API
||
<REST Operation Interface>
||
Storage
||
<Storage Backend Interface>
||
Sotrage Backend(etcd2,etcd3)

比如 Storage 和 Storage Backend 之间通过 Storage Backend Interface(参考k8s :kube-apiserver 访问 etcd 后端存储)交互,Storage 和 RESTful API 之间通过 REST Operation Interface(增删改查 方法的封装)交互

Storage

Storage is a generic interface for RESTful storage services.
Resources which are exported to the RESTful API of apiserver need to implement this interface(原文注释,下同)
It is expected that objects may implement any of the below interfaces
所有想通过 RESTful API 暴露出去的资源都必须实现 Storage 接口,Storage 接口是个最小接口(单一职责),资源类可以根据自身情况实现其它各种接口

// 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 聚合了可以对 Storage 施加的操作(或者叫 Verb,动作),RESTful API根据该(子)接口测试 Storage 是否支持相关操作,然后注册相应的 API 接口,比如如果 Storage 支持 Delete 接口,就注册一个 HTTP method 为 DELETE 的方法到相应的资源路径

Storage 实现类

kubernetes/pkg/registry/core 目录下包含了各种 Storage 实现类,比如大家耳熟能详的 pod, service, endpoint, configmap, node 等等,各个资源的目录结构很相似,以 pod 为例

kubernetes/pkg/registry/core/pod
 rest
 storage
 storage.go <- Storage 实现
 doc.go
 strategy.go
 strategy_test.go

PodStorage

我们以 pod storage 为例来分析 storage 创建,首先是 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
}

这里又冒出一些新的类型 REST,BindingREST .etc,这些 XXXREST 才是"真正"的 Storage,对应具体的 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 类类包含一个 genericregistry.Store 类型的字段,我们在k8s :kube-apiserver 访问 etcd 后端存储中分析过,它用于访问后端存储

PodStorage 通过 NewStorage 方法创建,各个 XXXREST 共享 Store

func NewStorage(optsGetter generic.RESTOptionsGetter, ...) {
 创建 genericregistry.Store
 store := &genericregistry.Store {
 ...
 }
 ...
 return PodStorage {
 Pod: &REST{store, proxyTransport},
 Binding: &BindingREST{store: store}
 ...
 }
}

Storage 注册

Storage 是如何"绑定"到 api 接口呢?这中间还涉及到一些数据结构(类),这里先列出绑定相关的代码:

// kubernetes/pkg/registry/core/rest/storage_core.go func (c LegacyRESTStorageProvider) NewLegacyRESTStorage(...) {
 ...
 restStorageMap := map[string]rest.Storage {
 "pods": podStorage.Pod,
 "pods/attach": podStorage.Attach
 ...
 }
}

后续再详细分析

总结

本文介绍了 kube-apiserver 中 Storage 相关的一些概念,希望对大家阅读 k8s 源代码有所帮助

本文转自中文社区-k8s :kube-apiserver RESTful API 实现 - Storage

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
深度剖析Kubernetes API Server三部曲 - part 2
欢迎来到深入学习Kubernetes API Server的系列文章的第二部分。在上一部分中我们对APIserver总体,相关术语及request请求流进行探讨说明。在本部分文章中,我们主要聚焦于探究如何对Kubernetes 对象的状态以一种可靠,持久的方式进行管理。
1106 0
深度剖析Kubernetes API Server三部曲 - part 1
欢迎来到深入学习Kubernetes API Server的系列文章,在本系列文章中我们将深入的探究Kubernetes API Server的相关实现。如果你对Kubernetes 的内部实现机制比较感兴趣或者正在进行Kubernetes 项目的相关开发工作,那么本系列文章能够为你提供一些帮助。
921 0
Sealer - 把 Kubernetes 看成操作系统集群维度的 Docker
功能上 sealer 已经完成了“集群维度的 Docker”这一设定,未来在生态发展上会增加更多的投入,创造更多更优质的官方镜像,建立更多的合作伙伴,真正把软件的提供者与使用者连接起来,高效的协作。
0 0
使用 ezctl 工具部署和管理 Kubernetes 集群
使用 ezctl 工具部署和管理 Kubernetes 集群
0 0
Kubernetes集群添加用户
Kubernetes集群添加用户
0 0
Kubernetes 集群升级指南:从理论到实践
集群升级是 Kubernetes 集群生命周期中最为重要的一环,也是众多使用者最为谨慎对待的操作之一。
0 0
如何使用 “自定义镜像” 创建容器服务 Kubernetes 集群
在使用容器服务创建 Kubernetes 集群的时候,默认是没有用户选择镜像的地方的,只能是系统镜像。但是对于一些客户而言,出于运维管理的需要,都希望可以安装一些特点的软件包。虽然说,目前也有比较绕的方案去解决类似的问题,例如在集群部署好以后,通过云助手等工具来协助完成软件包的安装,但是这种方式却不是最佳的解决方案。本文将教大家如何使用 “自定义镜像” 快速创建容器服务 Kubernetes 集群。
0 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
阿里云 API 精选手册(Alibaba Cloud API Playbook)
立即下载
基于 RocketMQ+ Knative 驱动云原生 Ser
立即下载
API 网关实践
立即下载