关于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

深入了解Kubernetes REST API的工作方式相关推荐

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

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

  2. Kubernetes的Service外部访问方式:NodePort和LoadBalancer

    Kubernetes的Service外部访问方式:NodePort和LoadBalancer 关注公众号 风色年代(itfantasycc) 300G微服务资料等你拿! Kubernetes的Pod的 ...

  3. 超越Android:Kotlin在后端的工作方式

    by Adam Arold 亚当·阿罗德(Adam Arold) 超越Android:Kotlin在后端的工作方式 (Going Beyond Android: how Kotlin works on ...

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

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

  5. ZooKeeper Internals -- ZooKeeper内部工作方式

    ZooKeeper Internals 介绍 原子广播 保证,属性和定义 领导者激活 活动消息 摘要 比较 法定人数 记录 开发者指南 记录在正确的级别 使用标准的slf4j成语 介绍 本文档包含有关 ...

  6. 单线程无阻塞IO模型在Node.js中的工作方式

    本文翻译自:How the single threaded non blocking IO model works in Node.js I'm not a Node programmer, but ...

  7. Hadoop 1.x:体系结构,主要组件以及HDFS和MapReduce的工作方式

    Before reading this post, please go through my previous post at "Introduction to Hadoop" t ...

  8. Android的surface的三种工作方式

    注:文章内容是基于kitkat进行的粗线条分析,做为学习过程中的小结. Surface的三种使用方式 Native层的Surface工作方式有:仅在Proxy端.Proxy和Service端协同.仅在 ...

  9. (3)riak_core系统的工作方式

    三.riak_core系统的工作方式 从原理上讲,riak_core通过一致性hash算法将数据随机均匀的分布在一个环上,对这些数据的操作可以并发的进行,因此riak_core本质上还是一个数据并行的 ...

最新文章

  1. boost::signals2模块连接扩展槽的示例程序,使用信号的 connect_extended 和 extended_slot_type
  2. movs 数据传送指令_PLC中简单好用的传送指令功能,你学会了吗?
  3. BigDecimal加减乘除运算
  4. 隐藏GridControl的“Drag a column header here to group by that column”
  5. 连接mysql数据库2013_使用VS2013 + EF6 + .NET4.5 连接Mysql数据库
  6. 前端学习(3306):函数组件usermemo和usercallback二
  7. Java中子类覆盖父类方法所必须满足的条件
  8. Arcgis javascript那些事儿(十六)——GP服务的发布与使用
  9. 【Git基础笔记】常用命令
  10. 如何获取母版页上控件的值?
  11. 面对面的办公室——纪念艾伦•图灵百年诞辰
  12. Python源文件改写。编写一个程序,读取一个Python源程序文件source.py,将文件中所有除保留字外的小写字母换成大写字母。生成后的文件要能够被Python解释器正确执行。
  13. SpringBoot 实战:加载和读取资源文件
  14. elasticsearch控制match执行过程的低级查询处理规则
  15. 盘点世界顶级五大黑客:个个都是神
  16. Delphi7微信、支付宝扫码支付源码
  17. 【UEFI】---关于BIOS,EIST和PStateCState和CPU主频变化得关系
  18. 2018哈理工院个人赛、校团队赛总结
  19. 应用服务Application Services
  20. 零基础!!最全计算机三级网络技术备考指南!!

热门文章

  1. Linux中的shell正则表达式详解
  2. 一篇搞懂HTTP协议
  3. 内部类详解————静态内部类
  4. 图 之遍历----深度优先遍历0.o
  5. mysql替换sql中rank函数_MySQL sql Rank()函数实现
  6. 做形态学方法的团队_图像分割实战-分水岭分割方法和GrabCut 算法
  7. arduino光敏+LED+数码管+蜂鸣器综合实验
  8. git获取管理员权限 windows,windows下git怎么管理权限
  9. java国际规范标准,国际化 - Java Servlet 3.1 规范
  10. java遍历数组练习(for循环、foreach)