深入了解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/

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

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

3)类型(Type)

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

4)种类(Kind)

Kubernetes类型的JSON/YAML表示。

5)资源(Resource)

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

/apis///namespaces//

例如, 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对象上的调用。

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导入别名可以帮助确定一个方法来自哪个包。虽然代码确实使用了别名,但还有更广泛的使用它们的空间。

原文地址:http://blog.51cto.com/13762283/2300585

时间: 2024-10-08 02:35:21

深入了解Kubernetes REST API的工作方式的相关文章

MVC4 WebAPI(二)——Web API工作方式

在上篇文章中和大家一起学习了建立基本的WebAPI应用,立刻就有人想到了一些问题:1.客户端和WebService之间文件传输2.客户端或者服务端的安全控制要解决这些问题,要了解一下WebAPI的基本工作方式. (一)WebAPI中工作的Class 在MVC中大家都知道,获取Request和Response使用HttpRequest和HttpResponse两个类,在WebAPI中使用两外两个类:HttpRequestMessage 和HttpResponseMessage,分别用于封装Requ

Java NIO的工作方式

1.BIO带来的挑战 BIO即阻塞IO,不管是磁盘IO,还是网络IO,数据在写入OutputStream或者从InputStream读取时都有可能发生阻塞,一旦有阻塞,当前线程将会被挂起,即线程进入非可执行状态,在这个状态下,CPU不会给线程分配时间片,线程将会失去CPU的使用权,即线程暂停运行,这在当前的大规模访问量和有性能要求的情况下是不能被接受的.虽然当前的网络I/O有一些解决办法,如一个客户端一个处理线程,出现阻塞时只是一个线程阻塞而不会影响其他线程工作,还有为了减少系统线程的开销  ,

kubernetes 1.14.2 kubeadm 方式部署

kubernetes 1.14.2 kubeadm方式部署 主机 192.168.100.111 k8s-master192.168.100.112 k8s-node1192.168.100.113 k8s-node2 基本环境 systemctl stop firewalld ystemctl disable firewalld sed -i 's/enforcing/disabled/' /etc/selinux/config setenforce 0 swapoff -a vim /etc

Rsync的工作方式及Sersync

Rsync的工作方式 单个主机本地之间的数据传输(此时类似于cp命令的功能). 借助rcp,ssh等同到来传输数据(此时类似于scp命令的功能). 以守护进程(socket)的方式传输数据(这个是rsync自身的重要的功能). cp -a /etc/hosts /tmp/ rsync -avz /etc/hosts /tmp/ rsync --delete /null/ tmp/ 推送scp /etc/hosts ***@********:/tmp/ 推送rsync -avz -e 'ssh '

从一个简单例子来理解js引用类型指针的工作方式

? 1 2 3 4 5 6 7 <script> var a = {n:1};  var b = a;   a.x = a = {n:2};  console.log(a.x);// --> undefined  console.log(b.x);// --> [object Object]  </script> 上面的例子看似简单,但结果并不好了解,很容易把人们给想绕了--"a.x不是指向对象a了么?为啥log(a.x)是undefined?".&

LVS三种工作方式八种算法

一.集群简介 什么是集群 计算机集群简称集群是一种计算机系统,它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作.在某种意义上,他们可以被看作是一台计算机.集群系统中的单个计算机通常称为节点,通常通过局域网连接,但也有其它的可能连接方式.集群计算机通常用来改进单个计算机的计算速度和/或可靠性.一般情况下集群计算机比单个计算机,比如工作站或超级计算机性能价格比要高得多. 集群就是一组独立的计算机,通过网络连接组合成一个组合来共同完一个任务 LVS在企业架构中的位置: 以上的

Buffer的工作方式

1.Buffer的工作方式 前面<java NIO的工作方式>介绍了Selector检测到通信信道I/O有数据传输时,通过select()方法取得SocketChannel,将数据读取或写入Buffer缓冲区,下面讨论Buffer如何接受和写出数据.通过查看JDK源码可知道,Buffer的构造函数 Buffer(int mark, int pos, int lim, int cap) { // package-private if (cap < 0) throw new IllegalA

使用Android中API建议的方式实现SQLite数据库的增、删、改、查的操作

package com.examp.use_SQLite.dao; import java.util.ArrayList; import java.util.List; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.examp

单片机定时/计数工作方式

单片机中的定时/计数器都能有多种用途,要通过定时/计数器的方式控制字来设置,需要的用途. 在单片机中有两个特殊功能寄存器与定时/计数有关,这就是TMOD和TCON.,TMOD和TCON是名称,我们在写程序时就能直接用这个名称来指定它们,当然也能直接用它们的地址89H和88H来指定它们(其实用名称也就是直接用地址,汇编软件帮你翻译一下而已).     TMOD被分成两部份,每部份4位.分别用于控制T1和T0.TCON也被分成两部份,高4位用于定时/计数器,低4位则用于中断(TF1.0在这).TR0