深入了解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,一经查实,立即删除!

相关文章

mapper 判断条件为null

在双引号里面再判断不为空 <if test"name ! null and name !" > and name #{name} </if>

gitlab hook触发jenkins自动构建

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

The content of elements must consist of well-formed character data or markup

SQL语句中包括XML预定义字符&#xff0c;则需将SQL语句放在<![CDATA[ ]]> 中。在 XML 中有 5 个预定义的实体引用&#xff1a; 预定义字符 说明 < 小于 > 大于 & 和号单引号 " 双引号例子&#xff1a; <if test"id ! null and id ! ">a…

Python开发【第一篇】:初识Python

1. Python简介 Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言&#xff0c;由Guido van Rossum于1989年底发明。 1.1 Python 介绍 1. 开发语言 低级语言&#xff1a;C、汇编等&#xff08;机器码&#xff09;高级语言&#xff1a;Python、Java、PHP、C# 等&am…

[Ljava.lang.String; cannot be cast to java.lang.String

问题描述&#xff1a;不能把String[]转化为String类型。 解决方案&#xff1a; String name ((String[])request.getAttribute(“name”))[0];

Transactional 事务

1、事务场景中&#xff0c;抛出异常被catch后&#xff0c;如果需要回滚&#xff0c;一定要手动回滚 其实像第一种try catch这种把整个包裹起来&#xff0c;这种业务方法也就等于脱离了spring事务的管理&#xff0c;因为没有任何异常会从业务方法中抛出&#xff0c;全被捕获并“…

oracle varchar2改成大字段类型clob,读取大字段内容

oracle varchar2&#xff08;4000&#xff09;改成大字段类型clob&#xff0c;如果需要改成大字段的varchar2列有内容&#xff0c;不能直接用 alter table med_generic modify option07 blob; 直接用上面的会提示&#xff1a;ORA-22858: 数据类型的变更无效 因此&#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"…

For input string:

问题描述&#xff1a;在进行类型转换的时候&#xff0c;输入的字符串为空值造成的 解决方案&#xff1a;对字符串进行非空判断就可以&#xff0c;输入 if(str ! null && !.equals(str)){//类型转换; }

long型转String

long a1 12;String s1 a1 ""; // 法1&#xff1a;直接加空串System.out.println(s1);long a2 34;String s2 String.valueOf(a2); // 法2&#xff1a;String.valueOf()System.out.println(s2);long a3 56;String s3 Long.toString(a3); …

004-linux常用命令-权限管理命令

权限管理命令&#xff1a;chmod命令名称&#xff1a;chmod命令英文原意&#xff1a;change the permissions mode of a file命令所在路径&#xff1a;/bin/chmod执行权限&#xff1a;所有用户语法&#xff1a;chmod [{ugoa}{-}{rwx}] [文件或目录][mode421 ] [文件或目录]-R 递…

B cannot be cast to java.sql.Blob

问题描述&#xff1a;BLOB类型的数据从数据库提取出来&#xff0c;提示不能强制转换为BLOG 解决方案&#xff1a;转换为二进制数组 byte[] object (byte[]) Map.get("blob");

SSH-key连接原理

1&#xff0c;我们想通过远程的方式从我的电脑远程连接到对方的电脑上那么在LINUX系统下我们可以通过一种叫ssh的方式连接过去。SSH客户端&#xff08;ssh命令&#xff09;还包含一个很有用的远程安全拷贝命令scp。 2&#xff0c;有两种连接方式&#xff0c; &#xff08;1&…

byte[]和InputStream的相互转换

1、byte[]转换为InputStream InputStream sbs new ByteArrayInputStream(byte[] buf); 2、InputStream转换为InputStreambyte[] ByteArrayOutputStream swapStream new ByteArrayOutputStream(); byte[] buff new byte[100]; //buff用于存放循环读取的临时数据 int rc 0; …

[学习总结] python语言学习总结 (三)

函数闭包 定义 延伸了作用域的函数(能访问定义体之外定义的非全局变量 作用 共享变量的时候避免使用了不安全的全局变量允许将函数与某些数据关联起来,类似于简化版面向对象编程相同代码每次生成的闭包,其延伸的作用域都彼此独立(计数器,注册表)函数的一部分行为在编写时无法预…

jQuery中$.each()方法的使用

$.each()是对数组&#xff0c;json和dom结构等的遍历&#xff0c;说一下他的使用方法吧。 1、遍历一维数组 var arr1[aa,bb,cc,dd];//两个参数&#xff0c;第一个参数表示遍历的数组的下标&#xff0c;第二个参数表示下标对应的值$.each(arr1,function(i,val){console.log(ival…

【学习笔记】慕课网—Java设计模式精讲 第3章 软件设计七大原则-3-6 迪米特原则(最少知道原则)...

/** * 软件设计七大原则-迪米特原则 学习笔记 * author cnRicky * date 2018.11.10 */迪米特原则&#xff08;最少知道原则&#xff09; 一个对象应该对其他对象保持最少的了解。又叫最少知道原则 迪米特原则主要强调&#xff1a;尽量降低类与类之间的耦合 优点&#xff1a;降…

ORA-01745: 无效的主机/绑定变量名

问题描述&#xff1a;oracle中执行插入语句时报错 解决方案&#xff1a;缺失逗号

to_date , to_char

select sum(t.paid_fee)from order_payment_log twhere to_char(to_date(t.edit_time, yyyy-MM-dd HH24:mi:ss),yyyy-MM-dd) to_char(sysdate, yyyy-MM-dd)and t.paid_state Y; to_char to_char:将日期转换为字符串, to_char(to_date(t.edit_time, yyyy-MM-dd HH24:mi:ss),yy…

Duplicate local variable variable

问题描述&#xff1a;重复定义了变量。