徐冬冬
合肥科技研发中心
01
Kubernetes CustomResource Definition(CRD)概述
Kubernetes是一个开源的用于管理云平台中多个主机上容器化应用的管理架构。它是由多种不同类型的资源组成,在Kubernetes中一切都可视为资源。到Kubernetes 1.7 之后增加了对用户自定义资源(CustomResourceDefinition 简称CRD)二次开发能力来扩展 Kubernetes API,无需改变代码即可通过 CRD 向 Kubernetes API 中增加新资源类型,大大提高了 Kubernetes 的扩展能力。
在Kubernetes中,所有对象都被抽象定义为某种资源对象,同时系统会为其设置一个API入口(API Endpoint),对资源对象的操作(如新增、删除、修改、查看等)都需要通过Master的核心组件API Server调用资源对象的API来完成。当创建一个新的CRD时,Kubernetes API服务器将指定的每个版本创建一个新的RESTful资源路径,可以根据该API路径来创建一些自定义的类型资源。02
CRD的定义和自定义资源对象
2.1、CRD定义
与其他资源对象一样,对CRD的定义也使用YAML配置进行声明,以我行目前CPAAS平台ACP 2.9测试环境中自定义资源users.auth.alauda.io为例,CRD定义中的关键字段如下: (1)Group: 设置API所属的组,将其映射为API URL中“/apis/”的下一级目录。(2)Scope: 该API生效的范围,可选项为Namespaced(由Namespace限定)和Cluster(在集群范围全局生效,不局限于任何Namespace),默认值为Namespaced。(3)versions:设置此CRD支持的版本,可以设置多个版本,用列表形式表示。每个版本都可以设置下列参数。
name:版本的名称,例如v1、v1alpha3等。
served:是否启用,在被设置为true时表示启用。
storage:是否进行存储,只能有一个版本被设置为true。
(4)names:CRD的名称,包括单数、复数、kind、所属组等名称的定义,可以设置如下参数。kind:CRD的资源类型名称,要求以驼峰式命名规范进行命名(单词的首字母都大写)。
listKind:CRD列表,默认被设置为List格式。
singular:单数形式的名称,要求全部小写。
plural:复数形式的名称,要求全部小写。
shortNames:缩写形式的名称,要求全部小写。
categories:CRD所属的资源组列表。
使用kubectl create命令完成CRD的创建:
# kubectl create -f users.yaml
在CRD创建成功后,由于本例的scope设置了Namespace限定,所以可以通过API Endpoint“/apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions/users.auth.alauda.io”管理该CRD资源。用户接下来就可以基于该CRD的定义创建相应的自定义资源对象了。2.2、CRD自定义对象
基于CRD的定义,用户可以像创建Kubernetes系统内置的资源对象(如Pod)一样创建CRD资源对象。在下面的例子中,user-762662.yaml定义了一个类型为User的资源对象。除了需要设置该CRD资源对象的名称,还需要在spec段设置相应的参数。在spec中可以设置的字段是由CRD开发者自定义的,需要根据CRD开发者提供的手册进行配置。这些参数通常包含特定的业务含义,由CRD控制器进行处理。使用kubectl create命令完成CRD资源对象的创建,通过使用yaml文件: # kubectl create -f user-762662.yaml 然后,用户就可以像操作Kubernetes内置的资源对象(如Pod、RC、Service)一样去操作CRD资源对象了,包括查看、更新、删除和watch等操作。查看CRD资源对象:# kubectl get user
也可以通过NAME进行查询某一个crd资源的详细描述:# kubectl describe user/xxxxxxxxxx03
java访问kubernetes CRD
基于官方kubernetes-client/java类库,可以实现通过java完成对kubenetes原生资源对象(pod、node、namespace、servcie、deployment)和自定义资源对象(如:cluster)的增删改查或事件监听(watch)。kubernetes-client/java,根据官方k8s-openapi随之更新,一致性和更新频率高。
ACP平台自定义资源user的scope是cluster,在访问user资源的编码过程是根据集群范围CRD资源对象进行开发。本文代码基于SSM框架开发,在pom.xml中引入官方jar包io.kubernetes/cilent-java,版本号为3.0.0。 编写工具类KubernetesCrdOp.java,即对ACP平台CRD资源的增删改查的统一入口,下图为该类的基本定义。其中ApiClient表示K8S CRD资源访问客户端组件,ApiKeyAuth为K8S API访问的token鉴权对象,CustomObjectsApi为CRD资源访问对象。 以创建集群范围CRD资源对象为例,需要输入的字段包括group、version、plural、body,调用apiInstance.createClusterCustomObject,根据返回信息确定是否添加成功。通过底层源码分析,通过输入的参数组装API的http地址http://xxx.xxx.xxx.xxx/apis/auth.alauda.io/v1/users/。其中group为auth.alauda.io,version为v1,plural为users,body为API的HTTP-POST请求的body体。http请求参数格式Content-Type为application/json,验证信息Authorization即K8S平台的鉴权token存入到Header中,并发送post请求。再根据返回信息的状态码Status code判断是否创建成功,并将结果转为JsonObject对象返回上层。以上简要分析了创建CRD资源的相关java文件,而其他的关于删除、修改、查询等功能均在KubernetesCrdOp.java工具类中给出,该类是基于io.kubernetes/cilent-java进行的调用和扩展,有兴趣的话,建议大家结合内部源码研究。
(本文来源:公众号“I生活T精彩”)
你“在看”我吗