资深专家深度剖析Kubernetes API服务器第3章(共3章)

  

  在本系列的前两部分中我们介绍了API服务器的总体流程,以及API对象如何存储到etcd中。在本文中我们将探讨如何扩展API资源。   

  

  在一开始的时候,扩展API资源的唯一方法是扩展相关API源代码,集成为你所需的资源,或者,推动一个全新的类型为新的核心对象API合入社区代码。但是,这样就会导致核心API资源类型的不断增加,直至API过载。为了避免这种API资源的无限制扩展,在      Kubernetes      中提供两种扩展核心API的方法:   

  

  1.使用自定义资源定义(CRD),最开始的时候被称为第三方资源(tpr)。通过CRD你能够简单而灵活的方式定义自己的资源对象类型,并让API服务器处理整个生命周期。   

  

  2.使用与主API Servers 并行运行的用户API 服务器(UAS)。这种方式,可能更多的设计代码开发,可能需要你投入较多的时间及精力。当然,这种方式也能够让你对API资源有更细致,全面的了解。   

  

  在本文中,我们主要对CRD相关定义以及使用进行探讨。   

  

  crd的声明及创建   

  

  在本系列文章第一部分所提到过的,每个API资源根据组群组分类,每个对象都有一个对应的版本号与HTTP路径相关联。现在如果想要实现一个CRD,首先需要的是就是命名一个新的API      组群组,这个API群组不能与已经存在的群组重复。在你自己新建的API群组中,你可以拥有任意数量的资源,并且它们可以与其他群组中的资源具有相同的名称。下面我们来列举一个实际的例子:   

  

  资深专家深度剖析Kubernetes API服务器第3章(共3章)   

  

  在之前我们有介绍过,每个版本的由API群组管理的Kubernetes资源是跟HTTP路径相关的.CRD类似于面向对象编程中一个类的定义,而实际使用的CR可以看做为它的一组实例。首先我们对例子中的一些字段作说明,第一行中的CRD  apiVersion在kube-apiserver      1.7,之后都是这样定义的。从第5行之后我们定义了spec 的相关字段。在第6行spec.group是定义了你创建的CRD的API群组(在本例子中定义为了example.com)。第7行定义了CRD对象的版本。每个资源只有一个固定版本,但在API群组中还是能有多个不同版本的资源。第8行的spec.names有两个必填项:善良,按照惯例第一个字母大写,复数,按照惯例全为小写,这个字段与最终生成的HTTP路径相关,比如在本例子中,最终的HTTP路径为https://

  

  上面的那种主要是用来描述对象的类型,而resource 资源是与HTTP路径相关的。大多数情况下这两个是匹配的;但是在某些特定情况下在相同的API  HTTP路径下可能返回不通的那种(比如Status 错误对象会返回另一种形式)。   

  

  值得注意的是resource 资源(在本例中是数据库)和组群组(本例中是example.com)必须与metadata.name 字段匹配(本例为第四行databases.example.com)。   

  

  现在我们根据上面的YAML文件来创建一个CRD:   

  

  kubectl创建- f databases-crd.yaml美元   

  

  customresourcedefinition“databases.example.com"创建   

  

  由于这个创建过程是异步进行的,所以你必须检查一下你创建的CRD的状态,确认你创建的CRD没有与其它资源冲突,并且API服务器已经调用相关处理函数完成创建。你可以在脚本或代码中通过轮询完成这个过程。最后我们能得到以下状态:   

  

  美元kubectl crd databases.example.com - o yaml   

  

  apiVersion: apiextensions.k8s.io/v1beta1   

  

  :CustomResourceDefinition   

  

  元数据:   

  

  creationTimestamp才能:2017 - 08 - 09 - t09:21:43z   

  

  ,名字:databases.example.com   

  

  resourceVersion才能:“792”;   

  

  selfLink才能:/api/apiextensions.k8s.io/v1beta1/customresourcedefinitions/databases.example.com   

  

  uid: 28日才能c94a05 - 7 - ce4 11 - e7 - 888 - c - 42010 a9a0fd5   

  

  规范:   

  

  ,集团:example.com   

  

  名字:才能   

  

  ,,:数据库   

  

  ,,,listKind: DatabaseList   

  

  ,,,复数:数据库   

  

资深专家深度剖析Kubernetes API服务器第3章(共3章)