Java操作Istio(kubernetes-client)

Java操作Istio(kubernetes-client)

2023年6月30日发(作者:)

Java操作Istio(kubernetes-client)istio由于他对服务代码的完全不侵⼊性,以及kubernetes类云平台的普及 实⽤性越来越强。但istio⾄今也没有合适的dashboard,并且不同公司不同的业务场景导致使⽤istio做的事情也不相同.有偏向灰度发布的场景也有偏向对流量分布的场景。免不得需要使⽤业务代码操作istio的流量规则等配置。这⾥提供⼀个快速可⾏的操作⽅案⽂章⽬录实现⽅式kubernetes-client扩展1. 创建项⽬,拉取项⽬包 8 kubernetes-client 4.9.1 可以看到kubernetes-client包含了client包以及model相关包。这⾥我们可以将对istio的操作需求分为两步提供对istio的操作⽀持提供对istio资源对象的链式拼装能⼒其中的步骤1,实现相对简单。完成配置后我们可以通过kubernetes-client原⽣⽀持的操作⽅式对istio的资源进操作增删改查的操作。实现代码后效果如下步骤2完成后可以通过Builder类快速对资源对象完成拼装。实现代码后效果如下接下来分别进⾏说明提供对istio资源的操作⽀持增加资源对象模型类增加资源对象Operations类创建客户端连接类增加资源对象模型类模型创建,模型创建时需要注意⼏个点,⾸先VirtualServic最外层需要实现HashMetadata接⼝。内层需要实现KubernetesResource接⼝(如VirtualServiceSpec)这⾥需要额外注意⼀下,资源的kind是VirtualService。 apiVersion是/v1alpha3资源对象创建完成后还需要额外创建两个对象分别是List对象与Doneable对象List对象是批量获取时返回的对象类型(如().deployments().innamespace().list()),注意kind和apiversion的调整,编写时可以参考kubernetes原⽣对象的类来编写(如DeploymentList)。Doneable对象中提供的done⽅法会在触发replace时使⽤(最开始这⾥忘记写了,后来需要对vs规则做修改时报错,⽆法修改导致原因就是这⾥),编写时同理可以参考原⽣类对应的类来编写增加资源对象Operations类完成了基础数据模型编写后,需要开始调整client相关的类让集群客户端能够对我们新资源进⾏⽀持。这⼀⽀持⾸先就要提供Operations类,这个类主要⽤来提供请求调⽤时地址拼装的相关参数。为了拼装这些参数⾸先我们要了解istio⽣成规则时真实的请求地址是什么。进⼊kubernetes master节点执⾏apply命令,补充-v=10|grephttp这样我们就了解了istio规则真实请求的api地址,那么我们将这个真实地址通过Operations来拼装出来apiGoupName、piGroupVersion、pural三个字段的对应关系如下所⽰,这样我们就可以定义Operations⾥的参数了。(Operations类如上所⽰,编写时依然可以参考原⽣资源)这⾥字段的对应关系可以看下kubernetes-client中请求拼装的⽅法 —》tUrl()⽅法。这⾥拼装请求地址时使⽤的⽅法创建客户端连接类前置⼯作到这⾥就告⼀段落,开始对接客户端。下来⼏个类都是与客户端直接关联的适配器或者链接类1. 基础客户端接⼝,接⼝⽤于对接上⼀步我们完成的Operations类,这⾥注意需要继承Client接⼝2. Istio客户端类,实现了基础客户端接⼝,可以看到这⾥通过Operations的构造⽅法反悔了Operations控制器3. 集群客户端适配器,创建客户端后需要将这个适配器注⼊到扩展适配器列表中4. 集群操作客户端接⼝,这⾥我们继承kubernetesClient,保持对原⽣资源的⽀持5. 集群操作客户端实现类,这⾥⼀定要注意进⾏er操作,将第三部定义的适配器注⼊到扩展适配列表中,不然客户端反射操作时会抛出异常。让集群客户端初始化时就进⾏这个注⼊过程就好。完成这些我们第⼀步的操作就完成了。提供对istio资源对象的链式拼装能⼒这⼀步进⾏的内容并不难,只是⼯作相对繁琐、重复、容易遗漏。需要格外注意,不然链路调⽤时会出现莫名其妙的问题定位较难。进⾏这⼀步时可以使⽤原⽣对象进⾏参考来编写。⾸先我们先明确⼀下,fabric中对资源对象定义了四种附属对象,分别⽤于不同的场景BuilderFluentFluentImplNested如下但不是每个资源对象只有这四个类,是每⼀层对象有这些类,以VS举例apiVersion: /v1alpha3kind: VirtualServicemetadata: name: bookinfospec: hosts: - "*" gateways: - bookinfo-gateway http: - match: - uri: exact: /productpage - uri: prefix: /static - uri: exact: /login - uri: exact: /logout - uri: prefix: /api/v1/products route: - destination: host: productpage port: number: 9080我们创建对象模型时需要根据规则的层级去包装对象⽐如Virtualservice中包含Spec对象,Spec对象中包含Hosts对象包含Http对象,每⼀层我们需要为其定义这些附属对象。这些才是⼯作量,这⾥初步算了⼀下单VS的对象差不多就有40多个(如果打算编写的话,建议从Gateway资源开始做,结构简单)接下来我们对每⼀种对象进⾏说明BuilderBuilder类是将链路调⽤对象与资源对象转化的对象,需要继承其对应的FluentImpl类箭头指向的地⽅都是通过FluentImpl类中的⽅法对资源对象或Builder对象进⾏赋值的过程,Builder实际上最⼤的作⽤就是通过FluentImpl属性值向资源对象进⾏赋予。Fluent接⼝Fluent接⼝需要为对应资源模块⾥所有的字段提供对齐操作的⽅法,根据每⼀个字段是数组是集合,是基础对象还是⾃定义对象进⾏不同的处理,这⾥做举例说明但不⼀定说全,可以参考原⽣对象的Fluent做参考。关于跳转,我们进⾏对象的链式拼装时需要向下级跳转,完成下级拼装后再会跳的过程如下,这⼀过程是需要通过⾃定义Nested内部类来实现的关于资源类型1. 数组: 建议提供以下⽅法,如果是⾃定义资源对象需要包含中间部分引⼊Nested内部类向下级跳转的⽅法 List getRoutes(); SpecHttpRoute buildRoutes(int index); List buildRoutes(); A withRoutes(List items); A items); Boolean hasRoutes();

SpecHttpRouteNested addNewRoutes(); SpecHttpRouteNested setNewRouteLike(SpecHttpRoute item); SpecHttpRouteNested setNewRouteLike(int i , SpecHttpRoute item); SpecHttpRouteNested editFirstRoutes(); SpecHttpRouteNested editLastRoutes(); SpecHttpRouteNested editRoutes(int i);

A addNewRoutes(SpecHttpRoute specHttp); A setToRoutes(int index, SpecHttpRoute item); A addToRoutes(int index, SpecHttpRoute item); A items); A addAllToRoutes(Collection items); A items); A removeAllFromRoutes(Collection items);2. ⾃定义资源类型,⾃定义资源对象需要包含中间部分引⼊Nested内部类向下级跳转的⽅法 SpecHttpRewrite buildRewrite(); A withRewrite(SpecHttpRewrite item); Boolean hasRewrite(); tpRewriteNested withNewRewrite(); tpRewriteNested withNewRewriteLike(SpecHttpRewrite item); tpRewriteNested editRewrite(); tpRewriteNested editOrNewRewrite(); tpRewriteNested editOrNewRewriteLike(SpecHttpRewrite item);3. 普通资源类型 String getExact(); A withExact(String item);(ps:这个类有点长就分两个图来截了。)需要注意的是关于Nested内部接⼝的定义,继承Nested,下级Fluent对象泛型为当前Nested。public interface SpecHttpRouteNested extends , SpecHttpRouteFluent> { public N and(); public N endRoute(); }FluentImpl实现Fluent接⼝定义实现类,需要注意红线部分,以及箭头部分,Fluent中包含当前资源对象⾥的所有属性,但⾃定义类型的属性在FluentImpl中必须改成对应的Builder,每个⽅法的实现⽅式都相对简单,可以⾃⼰编写或者参考Deployment的即可关于NestedImpl:在FluentImpl中需要对Fluent中定义的Nested进⾏实现。需要注意的点已经标注了红线与箭头NestedImpl需要继承对应下级的FluentImpl,需要实现同级Fluent的Nested包含了and和end⽅法,实际end⽅法就是在调⽤and⽅法。实现的能⼒是根据下级中赋予的属性⽣成对应的Builder,赋予本级对应的Builder属性中。具体每⼀个类都可以参考原有的资源对象来编写,这⾥只做简述。这样完成了代码后能够实现如下的资源拼装能⼒。END这样可以完成对istio的操作客户端。并且可以完全复⽤kubernetes-client中的客户端以及其他原⽣资源对象的操作⽅法。开发量不⼤⽽且也不复杂,只是刚开始看的时候会被多个相似的类弄乱,理清类间的调⽤逻辑其实并不复杂。这样的操作并不只针对istio的资源,如果公司⾃研了⼀些CRD,也可以使⽤这种⽅式进⾏封装提供操作客户端。ps:再多说⼀句,istio赋予规则时需要开启⾃动注⼊,这⾥并不建议对命名空间开启⾃动注⼊。毕竟sidecar对资源占⽤不⼩是不争的事实。建议通过annotation注解对指定的deployment开启,尽可能节省资源(但这毕竟是业务层相关的逻辑了,按需取舍吧)注⼊间的覆盖逻辑如下

发布者:admin,转转请注明出处:http://www.yc00.com/web/1688057114a72405.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信