在代码中使用SDK操作Istio资源二(Java篇)

简介: 如何在代码中使用SDK操作Istio资源

定制资源(Custom Resource)是对 Kubernetes API 的扩展。Istio在k8s原生资源的基础上增加了Virtual Service,Gateway等资源。通常我们操作这些资源时,都是在命令行通过 kubectl 进行。如果想在代码中直接操作相关资源时,该怎么办呢?

其实通过集成对应语言的Istio Client,我们可以通过对应语言的代码中直接操作Istio定制资源。

本文介绍如何使用JAVA语言的SDK isito-client在ASM中创建istio资源。

前提条件

首先当然需要准备好kubernetes集群并安装好Istio。本文中代码基于JAVA 11与fabric8io/istio-client 6.0.0-RC1版本编写。

安装依赖

在maven配置文件 pom.xml中添加如下依赖项

<dependencies><dependency><groupId>io.fabric8</groupId><artifactId>istio-client</artifactId><version>6.0.0-RC1</version></dependency></dependencies>

配置连接

我们需要获取集群的 kubeconfig 文件,这个文件通常位于 Kubernetes 集群的 master 节点服务器的 $HOME/.kube/config 路径(注意,kubeconfig是类型名而不是文件名)。并复制到计算机 $HOME/.kube/config路径下。SDK在连接时将会默认使用系统kube config文件,如需指定使用特定的kube config文件,请参考创建网关规则部分代码。

生成配置文件

将下列虚拟服务和网关规则对应配置分别保存成 virtualService.yamlgateway.yaml并放入项目静态资源文件夹中。对于maven项目,默认是 src/main/resources文件夹。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:  name: bookinfo
spec:  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
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:  name: bookinfo-gateway
spec:  selector:    istio: ingressgateway # use istio default controller  servers:  - port:      number: 80      name: http
      protocol: HTTP
    hosts:    - "*"

创建虚拟服务

在使用JAVA istio-client创建istio资源时,可以选择使用yaml文件创建、也可以选择使用链式调用的方式创建。以下将分别示例创建虚拟服务的两种方式。

使用yaml文件创建

以下代码将在default命名空间创建 virtualService.yaml指定的虚拟服务。

importjava.io.FileReader;
importjava.io.IOException;
importio.fabric8.istio.api.networking.v1beta1.VirtualService;
importio.fabric8.istio.client.DefaultIstioClient;
importio.fabric8.istio.client.IstioClient;
importio.fabric8.kubernetes.client.Config;
importio.fabric8.kubernetes.client.utils.IOHelpers;
publicclassVirtualServiceExample {
publicstaticvoidmain( String[] args ) {
IstioClientistioClient=newDefaultIstioClient();
finalStringNAMESPACE="default"; // 创建资源的命名空间VirtualServicevirtualService=istioClient.v1beta1().virtualServices().load(
VirtualServiceExample.class.getResourceAsStream("/virtualService.yaml")
            ).get();
istioClient.v1beta1().virtualServices().inNamespace(NAMESPACE).resource(virtualService).create();
printAllVirtualServices(istioClient);
istioClient.close();
    }
// 打印网格中所有的VirtualServicestaticvoidprintAllVirtualServices(IstioClientistioClient) {
istioClient.v1beta1().virtualServices().list().getItems().forEach(System.out::println);
    }
}

使用链式调用创建

如果不想使用yaml配置文件定义资源,istio-client也提供了链式调用的能力,以纯代码的方式创建istio资源。以下代码和使用yaml文件的方法等价。

importio.fabric8.istio.api.networking.v1beta1.VirtualServiceBuilder;
importio.fabric8.istio.client.DefaultIstioClient;
importio.fabric8.istio.client.IstioClient;
publicclassVirtualServiceChainingExample {
publicstaticvoidmain(String[] args) {
IstioClientistioClient=newDefaultIstioClient();
finalStringNAMESPACE="default";
istioClient.v1beta1().virtualServices().inNamespace(NAMESPACE).resource(
newVirtualServiceBuilder()
            .withNewMetadata()
            .withName("bookinfo")
            .endMetadata()
            .withNewSpec()
                .addToHosts("*")
                .addToGateways("bookinfo-gateway")
                .addNewHttp()
                    .addNewMatch().withNewUri().withNewStringMatchExactType("/productpage").endUri().endMatch()
                    .addNewMatch().withNewUri().withNewStringMatchPrefixType("/static").endUri().endMatch()
                    .addNewMatch().withNewUri().withNewStringMatchExactType("/login").endUri().endMatch()
                    .addNewMatch().withNewUri().withNewStringMatchExactType("/logout").endUri().endMatch()
                    .addNewMatch().withNewUri().withNewStringMatchPrefixType("/api/v1/products").endUri().endMatch()
                    .addNewRoute()
                        .withNewDestination()
                            .withHost("productpage")
                            .withNewPort()
                                .withNumber(9080)
                            .endPort()
                        .endDestination()
                    .endRoute()
                .endHttp()
            .endSpec()
            .build()
            ).create();
printAllVirtualServices(istioClient);
istioClient.close();
    }
// 打印网格中所有的VirtualServicestaticvoidprintAllVirtualServices(IstioClientistioClient) {
istioClient.v1beta1().virtualServices().list().getItems().forEach(System.out::println);
    }
}

创建网关规则

以下代码根据指定的kube config文件创建连接后,在default命名空间创建 gateway.yaml指定的网关规则。此处直接采用使用YAML文件的方式创建,不再赘述使用链式调用的方式。

importjava.io.FileReader;
importjava.io.IOException;
importio.fabric8.istio.api.networking.v1beta1.Gateway;
importio.fabric8.istio.client.DefaultIstioClient;
importio.fabric8.istio.client.IstioClient;
importio.fabric8.kubernetes.client.Config;
importio.fabric8.kubernetes.client.utils.IOHelpers;
publicclassGateWayExample {
publicstaticvoidmain(String[] args) throwsIOException {
// 读取kube config连接配置文件StringkubeconfigContents=null;
FileReaderreader=newFileReader("{path to kube config file}"); // 将{}内容替换成kube config实际路径kubeconfigContents=IOHelpers.readFully(reader);
Configconfig=Config.fromKubeconfig(null, kubeconfigContents, null);
IstioClientistioClient=newDefaultIstioClient(config);
finalStringNAMESPACE="default"; // 创建资源的命名空间Gatewaygateway=istioClient.v1beta1().gateways().load(
GateWayExample.class.getResourceAsStream("/gateway.yaml")
        ).get();
istioClient.v1beta1().gateways().inNamespace(NAMESPACE).resource(gateway).create();
printAllGateways(istioClient);
istioClient.close();
    }
// 打印网格中所有的GatewaystaticvoidprintAllGateways(IstioClientistioClient) {
istioClient.v1beta1().gateways().list().getItems().forEach(System.out::println);
    }
}
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
13天前
|
Java 测试技术 应用服务中间件
常见 Java 代码缺陷及规避方式(下)
常见 Java 代码缺陷及规避方式(下)
39 0
|
14天前
|
Java
Java中ReentrantLock释放锁代码解析
Java中ReentrantLock释放锁代码解析
25 8
|
17天前
|
前端开发 小程序 Java
uniapp上传图片 前端以及java后端代码实现
uniapp上传图片 前端以及java后端代码实现
32 0
|
19天前
|
设计模式 存储 Java
23种设计模式,享元模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享技术有效地支持大量细粒度对象的重用。这个模式在处理大量对象时非常有用,特别是当这些对象中的许多实例实际上可以共享相同的状态时,从而可以减少内存占用,提高程序效率
35 4
|
1天前
|
Web App开发 数据采集 Java
《手把手教你》系列技巧篇(三十)-java+ selenium自动化测试- Actions的相关操作下篇(详解教程)
【4月更文挑战第22天】本文介绍了在测试过程中可能会用到的两个功能:Actions类中的拖拽操作和划取字段操作。拖拽操作包括基本讲解、项目实战、代码设计和参考代码,涉及到鼠标按住元素并将其拖动到另一个元素上或指定位置。划取字段操作则介绍了如何在一段文字中随机选取一部分,包括项目实战、代码设计和参考代码。此外,文章还提到了滑动验证的实现,并提供了相关的代码示例。
10 2
|
12天前
|
Java
代码的魔法师:Java反射工厂模式详解
代码的魔法师:Java反射工厂模式详解
26 0
|
13天前
|
监控 安全 Java
常见 Java 代码缺陷及规避方式(中)
常见 Java 代码缺陷及规避方式(中)
26 1
|
15天前
|
设计模式 算法 Java
23种设计模式,模板方法模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。
15 0
|
16天前
|
设计模式 Java
23种设计模式,状态模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】状态模式是一种行为设计模式,允许一个对象在其内部状态改变时改变它的行为,这个对象看起来似乎修改了它的类。
29 4
|
16天前
|
算法 安全 Java
java代码 实现AES_CMAC 算法测试
该代码实现了一个AES-CMAC算法的简单测试,使用Bouncy Castle作为安全提供者。静态变量K定义了固定密钥。`Aes_Cmac`函数接受密钥和消息,返回AES-CMAC生成的MAC值。在`main`方法中,程序对给定的消息进行AES-CMAC加密,然后模拟接收ECU的加密结果并进行比较。如果两者匹配,输出&quot;验证成功&quot;,否则输出&quot;验证失败&quot;。辅助方法包括将字节转为16进制字符串和将16进制字符串转为字节。

热门文章

最新文章