关于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调用就像上面解释的那样使用方法链进行。

探究

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

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

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

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

  1. Kubernetes exec API串接分析

    本篇将说明Kubernetes exec API的运作方式,并以简单范例进行开发在前后端上.虽然Kubernetes提供了不同资源的RESTful API来进行CRUD操作,但是部分API并非单纯的回 ...

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

    http://www.cnblogs.com/wk1234/archive/2012/05/07/2486872.html 在上篇文章中和大家一起学习了建立基本的WebAPI应用,立刻就有人想到了一些 ...

  3. Kubernetes集群的部署方式及详细步骤

    一.部署环境架构以及方式 第一种部署方式 1.针对于master节点 将API Server.etcd.controller-manager.scheduler各组件进行yum install.编译安 ...

  4. kubernetes 中的证书工作机制

    一文带你彻底厘清 Kubernetes 中的证书工作机制 搬砖者: 张首富 时 间: 2020-05-26 w x: y18163201 原文地址:https://zhaohuabing.com/po ...

  5. (读书笔记)第2章 TCP-IP的工作方式

    第2章 TCP-IP的工作方式 TCP/IP协议系统 为了实现TCP的功能,TCP/IP的创建者使用了模块化的设计.TCP/IP协议系统被分为不同的组件,每个组件分别负责通信过程的一个步骤.这种模块化 ...

  6. Java NIO的工作方式

    1.BIO带来的挑战 BIO即阻塞IO,不管是磁盘IO,还是网络IO,数据在写入OutputStream或者从InputStream读取时都有可能发生阻塞,一旦有阻塞,当前线程将会被挂起,即线程进入非 ...

  7. 第2章 TCP-IP的工作方式

    第2章 TCP-IP的工作方式 TCP/IP协议系统 为了实现TCP的功能,TCP/IP的创建者使用了模块化的设计.TCP/IP协议系统被分为不同的组件,每个组件分别负责通信过程的一个步骤.这种模块化 ...

  8. 不吹不黑,今天我们来聊一聊 Kubernetes 落地的三种方式

    作者 | 王国梁  Kubernetes 社区成员与项目维护者原文标题<Kubernetes 应用之道:让 Kubernetes落地的"三板斧">,首发于知乎专栏:进击 ...

  9. kubernetes 的API 介绍

    在API conventions doc中描述了API的全部协议. 在API Reference文档中描述了API的端点.资源类型和示例. 在Controlling API Access doc中讨论 ...

随机推荐

  1. innodb_file_per_table - 转换为InnoDB

    共享InnoDB / var / lib / mysql / ibdata1存储的问题InnoDB表当前将数据和索引存储到共享表空间(/ var / lib / mysql / ibdata1).由于 ...

  2. Gmail 设置,时区

    问题提出: 我们工作的时候,需要和不同时区的人进行合作.我们需要注意时区问题.如果没有设置好时区,会造成很多不便. 了解时区问题: 通过 这个网站可以,让你对时区有所了解:http://zh.thet ...

  3. Year 2038 problem (2038年问题)

    From Wikipedia, the free encyclopedia       Animation showing how the date would reset, represented ...

  4. [IDEA_6] IDEA 集成 Python

    0. 说明 在 IDEA 中集成 Python 1. IDEA 集成 Python 1.1 Ctrl + Alt + S 进入设置 依次选中 Settings  -->  Plugins  -- ...

  5. 【转】Java学习---HashMap和HashSet的内部工作机制

    [原文]https://www.toutiao.com/i6593863882484220430/ HashMap和HashSet的内部工作机制 HashMap 和 HashSet 内部是如何工作的? ...

  6. JSR规范

    JSR是JavaSpecification Requests的缩写,意思是Java 规范提案.是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求.任何人都 ...

  7. SDN 第二次上机作业

    SDN第二次上机作业 1.控制器floodlight所示可视化图形拓扑的截图,及主机拓扑连通性检测截图 拓扑 连通性 2.利用字符界面下发流表,使得'h1'和'h2' ping 不通 流表截图 连通性 ...

  8. Swift: Associated Types--为什么协议使用关联类型而不是泛型

    关联类型的形式为类型的引用进而进行约束提供了条件: 同时能够简化语法形式. Swift: Associated Types http://www.russbishop.net/swift-associ ...

  9. Python2.7-difflib

    difflib主要用于比较两个序列的不同,常见于字符串的比较,可以对差异生成报告.SequenceMatcher 主要用于找两者相似部分,以及两者不同的转换方法,而 Differ 更注重于比较两者的区 ...

  10. cleanCode[1]:有意义的命名

    为什么要有意义的命名: 我们都曾经说过有朝一日再回头清理那些糟糕的代码,然而最终总是弃之不顾.稍后等于永不,我们需要立即行动,写优雅的代码. 写代码的过程中,读占的比例很大,所以首先要让代码易读. 有 ...