深入了解Kubernetes REST API的工作方式

关于Kubernetes REST API的工作方式:

在哪里以及如何定义从REST路径到处理REST调用的函数的映射?

与etcd的交互发生在哪里?

从客户端发出请求到保存在etcd中对象的端到端路径是怎样的?

Kubernetes REST框架

Kubernetes REST实现可大致分为三个部分,如下图所示。

客户端/服务器功能通过k8s.io包中的各种库实现。服务器端实现分布在多个包中。

服务器端的根目录包是apiserver, 其包含有endpoints,server,registry和storage等重要的包。

客户端在client-go包中实现,其包含的主要包是rest。

几个关键Kubernetes概念

1)组(Group)

KubernetesREST API以层次结构组织,并以/apis为根。 一个组为根下的一组REST资源集定义一个逻辑名称。例如API组名为apps,它在层次结构中就表示为/apis/apps。

可以使用如下命令检查所有可用的API组:

kubectl get --raw/apis | python -mjson.tool

2)版本(Version)

KubernetesREST API使用版本。版本名用于定义REST资源端点,这些资源短点在组内不断演变。典型的版本名称有v1,v1alpha1,v1beta1。可以使用如下命令查找API组的所有可用版本:

kubectl get-raw /apis/<group-name>

例如,想找apps组下的所有可用版本,可使用如下命令:

kubectl get --raw/apis/apps | python -mjson.tool

3)类型(Type)

表示概念的命名实体(例如:Pod,Deployment,Service等)。

4)种类(Kind)

Kubernetes类型的JSON/YAML表示。

5)资源(Resource)

处理特定种类的REST请求的端点/路径。资源在api层次结构中通用表示为:

/apis/<group>/<version>/namespaces/<namespace>/<kind-plural>

例如, deployments可表示为

/apis/apps/v1/namespaces/default/deployments

服务器端

服务器端集中探究以下问题:

A: 服务器中注册了哪些资源?

B: 与etcd的交互发生在哪里?

1)genericapiserver.go

文件先定义APIGroupInfo类型用于保存关于API组的信息,例如存在哪些版本以及在这些版本中定义了哪些资源。其次,定义GenericAPIServer类型,并实现为API组注册REST端点的InstallAPIGroup方法。该方法在api组版本实例中内部调用InstallREST方法。为运行服务器端,GenericAPIServer还包含Run()方法。

2)groupversion.go

文件先定义APIGroupVersion类型,用于承载关于某api组的特定版本的信息,例如引用提供实际REST端点实现(store.go)的对象的引用。还定义InstallREST方法,内部调用安装程序上的Install方法来注册该版本的REST资源。

3)installer.go

文件定义实现Install方法的APIInstaller类型。Install方法使用GroupVersion实例中的REST实现对象(请参见第2点),以将REST路径注册到go-restful库中的处理函数映射。当使用这个库时,模式是为一个特定的REST路径定义一个可调用的`handler`函数。该模式在installer.go中用于设置处理对应于不同资源端点。

例如:ws.GET(action.Path).To(handler), 其中handler是从GroupVersion实例的REST实现对象中获得的函数。它被定义为处理action.Path上的GET请求时被调用。

4)master.go

文件先定义了包含指向GenericAPIServer实例的指针的Master类型。还定义了InstallAPIs方法,通过调用genericapiserver的InstallAPIGroup方法启动注册工作流程。在创建Master的新实例时,InstallAPIs方法被调用。

5)registry/rest/rest.go

文件定义了不同的各种接口,应该被任何想要提供Kubernetes-like REST端点的后端实现。该文件中的关键接口是:Storage和StandardStorage。REST实现对象的引用属于rest.Storage接口类型,该对象由在groupversion.go中的APIGroupVersion维护。

6)registry/generic/registry/store.go

文件定义了实现rest.StandardStorage接口的Store类型。方法实现在由Store类型维护的Storage对象上的调用。此对象的类型为storage.Inte**ce(请参见下文)。

7)storage/Interface.go

文件定义了一个名为Interface的接口,包含一些方法。如果我们想可用于实际持久化的store,必须实现这些方法。对于'Interface'接口中所有方法,一个关键点是它们只返回error而没有其他的内容。如果任何数据需要由方法返回,将通过一个指针作为参数传递的对象返回。作为一个例子,检查签名的Get方法。

8)storage/etcd3/store.go

文件定义了实现storage.Interface的Store类型它使用etcd 的clientv3库与etcd3进行交互。

客户端

在客户端,我们主要探究REST调用如何进行?

1)request.go

文件定义了Request类型,实现用于在资源上进行REST调用的方法。进行调用的模式是先创建一个NewRequest对象,然后使用流式样方法链来调用REST方法(GET,POST,PUT,DELETE)。资源和名称空间的名称是创建完整端点所必需的,它们通过链式方法调用进行定义。

2)client.go

文件首先定义了一个名为Interface的接口,它包含返回Request对象指针(在request.go中定义)的REST方法包装器。其次定义了实现Interface接口的REST Client类型。

进行REST调用的模式是首先创建一个NewRESTClient,然后通过其中一个REST方法包装体获取NewRequest对象。一旦NewRequest对象可用,REST调用就像上面解释的那样使用方法链进行。

探究

1.   Kubernetes代码拥有丰富的文档,这有助于理解一段代码作用。

2.   包含类型隐含地实现方法的地方,可以很方便的在Interfaces中统计所有方法,进而很容易明白该类型实现了哪些方法。 (注册表包很好地实现了这一点,但installer.go是一个不会发生这种情况的例子。)

3.   Golang导入别名可以帮助确定一个方法来自哪个包。虽然代码确实使用了别名,但还有更广泛的使用它们的空间。

转载于:https://www.cnblogs.com/CCE-SWR/p/9915905.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gitlab hook触发jenkins自动构建

意义&#xff0c;gitlab推送或合并代码后触发jenkin自动构建发布代码或者执行命令推送规则 1.安装gitlab和hook插件有时需要重启jenkins服务&#xff0c;可能兼容性问题&#xff0c;安装完之后构建中看不到hook插件 2.配置jenkins构建中的hook插件下图中圈出为必选&#xff0c;…

React 点击按钮显示div与隐藏div

<!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>React 点击按钮显示div与隐藏div</title><script src"https://unpkg.com/react16/umd/react.development.js"></script><script src"…

mac/linux 解决启动命令行出现declare问题

问题描述&#xff1a;启动命令行时出现以下现象&#xff0c;如图所示&#xff1a; 问题解决&#xff1a; 在配置环境变量时&#xff0c;在某一行直接单独写了一个export,要么在bashrc中&#xff0c;要么在bash_profile等配置文件中&#xff0c;系统加载环境变量时就出现了上述情…

MVC 模式和模型 2

MVC框架 一个实现 MVC 模式的应用包含模型、视图、控制器 3 个模块&#xff1a; 模型&#xff1a;封装了应用的数据和业务逻辑&#xff0c;负责管理系统业务数据 视图&#xff1a;负责应用的展示 控制器&#xff1a;负责与用户进行交互&#xff0c;接收用户输入、改变模型、调整…

Java中线程池,你真的会用吗?

在《深入源码分析Java线程池的实现原理》这篇文章中&#xff0c;我们介绍过了Java中线程池的常见用法以及基本原理。 在文中有这样一段描述&#xff1a; 可以通过Executors静态工厂构建线程池&#xff0c;但一般不建议这样使用。 关于这个问题&#xff0c;在那篇文章中并没有深…

深入了解java虚拟机(JVM) 第四章 对象的创建

一、对象的创建过程 对象的创建过程大致可以分为六步&#xff0c;其中对象的分配尤为重要&#xff1a; 二、对象分配内存 一般来说对象分配内存有两种方式&#xff1a; 第一种是指针碰撞&#xff0c;这是一种比较理想的方式&#xff1a;如果Java堆是绝对规整的&#xff1a;一边…

[UWP]使用Picker实现一个简单的ColorPicker弹窗

[UWP]使用Picker实现一个简单的ColorPicker弹窗 原文:[UWP]使用Picker实现一个简单的ColorPicker弹窗在上一篇博文《[UWP]使用Popup构建UWP Picker》中我们简单讲述了一下使用Popup构建适用于MVVM框架下的弹窗层组件Picker的过程。但是没有应用实例的话可能体现不出Picker相对于…

C# WebRequest.Create 锚点“#”字符问题

背景 在与后台API接口对接时&#xff0c;如将网页Url作为参数请求数据时&#xff0c;如果是锚点参数&#xff0c;则会丢失。 锚点参数 请求通过WebRequest.Create创建一个WebRequest&#xff1a; 1 var uri "https://id.test.xxx.com/api/v1/auth/sso/url?redirectUrlht…

免费的编程中文书籍索引(2018第三版)

之前我在 github 上整理了来一份&#xff1a;free-programming-books-zh_CN&#xff08;免费的计算机编程类中文书籍&#xff09;。 截至目前为止&#xff0c;已经在 GitHub 收获了 40000 多的 stars&#xff0c;有 90 多人发了 600 多个 Pull Requests 和 issues。 在收集的过…

分类与监督学习,朴素贝叶斯分类算法

1.理解分类与监督学习、聚类与无监督学习。 &#xff08;1&#xff09;简述分类与聚类的联系与区别。 分类就是按照某种标准给对象贴标签&#xff0c;再根据标签来区分归类。聚类是指事先没有“标签”而通过某种成团分析找出事物之间存在聚集性原因的过程。 区别是&#xff0c…

一张图搞定OAuth2.0

转发&#xff1a;https://www.cnblogs.com/flashsun/p/7424071.html 目录 1、引言2、OAuth2.0是什么3、OAuth2.0怎么写1、引言 本篇文章是介绍OAuth2.0中最经典最常用的一种授权模式&#xff1a;授权码模式 非常简单的一件事情&#xff0c;网上一堆神乎其神的讲解&#xff0c;让…

linux部署redis详细步骤

公司一直在使用redis集群&#xff0c;寻思着自己也部署一套练练手。 打开redis的官网下载页&#xff1a;https://redis.io/download 按照官网的步骤进行操作&#xff1a; 你会发现输入src/redis-cli命令之后&#xff0c;一直连接不上。 提示信息&#xff1a;Could not connect …

四则运算 结对项目

github 地址:https://github.com/wangshicheng0213/HomeWork02 一、基本要求 1) 实现一个带有用户界面的四则运算。 2) 生成的题目不能重复。 3) 支持负数&#xff0c;例如-1&#xff0c;-1/2&#xff0c;-3‘4/5等。 4) 题目的数量&#xff08;个人项目的要求&#xff09; 5) …

大型数据库

over&#xff08;order by salary&#xff09; 按照salary排序进行累计&#xff0c;order by是个默认的开窗函数 over&#xff08;partition by deptno&#xff09;按照部门分区 如何使用Oracle Round 函数 (四舍五入)描述 : 传回一个数值&#xff0c;该数值是按照指定的小数位…

thinkPHP 数据库操作和分页类

转载于:https://www.cnblogs.com/finddata/p/10013962.html

RHCE基础环境系统的搭建

RHCE基础环境系统的搭建 安装前提&#xff1a; 安装的时候对系统和硬件的要求&#xff1a; 红帽系统安装队系统的要求&#xff1a;Windows操作系统选择64位的内存至少6GCPU需要支持虚拟化技术在做红帽系统实验的时候&#xff0c;把360类似这样的杀毒或是管家软件退出了&#xf…

Chrome Extension Dark Theme

Chrome Extension & Dark Theme https://chrome.google.com/webstore/detail/eimadpbcbfnmbkopoojfekhnkhdbieeh https://github.com/darkreader/darkreader https://github.com/xyz-data/darkreader 转载于:https://www.cnblogs.com/xgqfrms/p/10017780.html

mybatis 控制台打印执行的SQL语句

1. Spring boot 集成 mybatis 【转载】SpringBoot中Mybatis打印sql 1.1 如果使用的是application.properties文件&#xff0c;加入如下配置&#xff1a; 1 logging.level.com.example.demo.daodebug 红色部分指的是mybatis对应的方法接口所在的包路径。 1.2 如果使用的是appli…

轻知 | 为什么全球只有13组根域名服务器?

欢迎大家前往腾讯云社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 本文由9527发表 根域名服务器是域名解析系统&#xff08;DNS&#xff09;中最为顶级的域名服务器&#xff0c;它们负责管理顶级域的权威域名服务器地址。作为互联网基础设施的重要部分&#xff0c;所有域名…

check_http语法和选项

check_http H hostname (or) -I ip-address {optional options} 常用的几个例子 1. 检测http协议 $ check_http -H 192.168.1.50 HTTP OK HTTP/1.1 200 OK - 332 bytes in 0.004 seconds |time0.004144s;;;0.000000 size332B;;;0 2.检测https协议 $ check_http -H 192.168.1.50…