k8s :kube-apiserver RESTful API 实现 - Storage

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 前言 了解 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

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
3月前
|
Kubernetes JavaScript API
使用 Kubernetes API
使用 Kubernetes API
25 0
|
5月前
|
边缘计算 Kubernetes 安全
基于 Traefik Hub & Rancher Prime 发挥 Kubernetes 原生API管理威力
Hello folks,我是 Luga,今天我们来聊一下云原生网关 Traefik 核心技术之一Traefik Hub。
50 0
|
5月前
|
Kubernetes 监控 网络协议
Kubernetes的API流量查看器-Kubeshark
Kubeshark 由 2021 年 UP9 公司开源的 K8s API 流量查看器 Mizu 发展而来,试图成为一款 K8s 全过程流量监控工具。
229 1
|
5月前
|
Kubernetes 监控 安全
如何访问kubernetes API?
如何访问kubernetes API?
140 0
|
5月前
|
Kubernetes API 容器
Kubernetes 控制器模式为何会依赖声明式 API?
Kubernetes 控制器模式依赖声明式的 API。另外一种常见的 API 类型是命令式 API。
42 0
|
6月前
|
存储 Kubernetes Linux
【探索 Kubernetes|作业管理篇 系列 8】探究 Pod 的 API 对象属性级别与重要字段用法
【探索 Kubernetes|作业管理篇 系列 8】探究 Pod 的 API 对象属性级别与重要字段用法
47 1
|
7月前
|
存储 Kubernetes Cloud Native
带你读《云原生应用开发:Operator原理与实践》——2.3.1 Kubernetes API 访问控制
带你读《云原生应用开发:Operator原理与实践》——2.3.1 Kubernetes API 访问控制
|
7月前
|
云安全 Kubernetes 安全
云安全之Kubernetes API Server 8080端口未授权
在Kubernetes中,API Server是与集群通信的核心组件之一。默认情况下,Kubernetes API Server会在端口8080上侦听请求,如果Kubernetes API Server在8080端口上启用了未授权访问,那么攻击者可以通过该端口访问API Server并获取敏感信息或执行攻击。这可能会影响任何使用未经身份验证的HTTP协议连接的版本,包括Kubernetes的早期版本和未经修补的漏洞版本。
1005 0
|
7月前
|
Kubernetes 安全 API
【kubernetes】API Server 保证性能的方式
【kubernetes】API Server 保证性能的方式
79 0
|
7月前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Gateway API 深入解读和落地指南
Gateway API 作为新一代的 Kubernetes 入口 API,有更广泛的应用场景、更强大的功能、以及更好的可靠性和扩展性。对于生产级的 Kubernetes 环境,Gateway API 是一个更好的选择。本篇文章将深入解读 Kubernetes Gateway API 的概念、特性和用法,帮助读者深入理解并实际应用 Kubernetes Gateway API,发挥其在 Kubernetes 网络流量管理中的优势。
热门文章
最新文章
推荐文章
更多