java对象转jsonobject_【技术分享】Java 操作 Kubernetes CRD资源的研究和应用

e30f7b98b69fb5476222332ae472aa44.gif

  8061c225024079346fe2933b2747195e.png

徐冬冬

合肥科技研发中心

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路径来创建一些自定义的类型资源。 63ee4feceda47ab1965353bec8525ad1.gif

02

CRD的定义和自定义资源对象

2.1、CRD定义

与其他资源对象一样,对CRD的定义也使用YAML配置进行声明,以我行目前CPAAS平台ACP 2.9测试环境中自定义资源users.auth.alauda.io为例,CRD定义中的关键字段如下: 6bcf1be286a835f0b40ea07dab7cc7d2.png(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 206df131736b873851e47885a1242071.png然后,用户就可以像操作Kubernetes内置的资源对象(如Pod、RC、Service)一样去操作CRD资源对象了,包括查看、更新、删除和watch等操作。查看CRD资源对象:

 # kubectl get user

也可以通过NAME进行查询某一个crd资源的详细描述:# kubectl describe user/xxxxxxxxxx 63ee4feceda47ab1965353bec8525ad1.gif

03

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。 79f6da96889f4e952c84bba1970571ca.png编写工具类KubernetesCrdOp.java,即对ACP平台CRD资源的增删改查的统一入口,下图为该类的基本定义。其中ApiClient表示K8S CRD资源访问客户端组件,ApiKeyAuth为K8S API访问的token鉴权对象,CustomObjectsApi为CRD资源访问对象。 c4e7606d4691b26cc7fe8436bc3c041b.png 以创建集群范围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对象返回上层。 c2d892ba8b2f6672386b72ddfd07550e.png aa6c4168f8ba33f189a83acab19bb3ba.png 63ee4feceda47ab1965353bec8525ad1.gif

以上简要分析了创建CRD资源的相关java文件,而其他的关于删除、修改、查询等功能均在KubernetesCrdOp.java工具类中给出,该类是基于io.kubernetes/cilent-java进行的调用和扩展,有兴趣的话,建议大家结合内部源码研究。

63ee4feceda47ab1965353bec8525ad1.gif

(本文来源:公众号“I生活T精彩”)

c57996837960015e42978dcd1eae2d74.png

你“在看”我吗0581d945f4c69e6c6c22a8c55b8787ac.gif

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值