在代码中使用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);
    }
}
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
5月前
|
Java 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
453 6
|
6月前
|
IDE Java 关系型数据库
Java 初学者学习路线(含代码示例)
本教程为Java初学者设计,涵盖基础语法、面向对象、集合、异常处理、文件操作、多线程、JDBC、Servlet及MyBatis等内容,每阶段配核心代码示例,强调动手实践,助你循序渐进掌握Java编程。
793 3
|
6月前
|
安全 Java 应用服务中间件
Spring Boot + Java 21:内存减少 60%,启动速度提高 30% — 零代码
通过调整三个JVM和Spring Boot配置开关,无需重写代码即可显著优化Java应用性能:内存减少60%,启动速度提升30%。适用于所有在JVM上运行API的生产团队,低成本实现高效能。
738 3
|
5月前
|
Java 数据处理 API
为什么你的Java代码应该多用Stream?从循环到声明式的思维转变
为什么你的Java代码应该多用Stream?从循环到声明式的思维转变
316 115
|
5月前
|
安全 Java 编译器
为什么你的Java代码需要泛型?类型安全的艺术
为什么你的Java代码需要泛型?类型安全的艺术
231 98
|
6月前
|
Java
java入门代码示例
本文介绍Java入门基础,包含Hello World、变量类型、条件判断、循环及方法定义等核心语法示例,帮助初学者快速掌握Java编程基本结构与逻辑。
518 0
|
5月前
|
安全 Java 容器
告别繁琐判空:Optional让你的Java代码更优雅
告别繁琐判空:Optional让你的Java代码更优雅
|
5月前
|
安全 Java 容器
告别空指针噩梦:Optional让Java代码更优雅
告别空指针噩梦:Optional让Java代码更优雅
464 94
|
5月前
|
Java 编译器 API
java最新版和java8的区别,用代码展示
java最新版和java8的区别,用代码展示
458 43

热门文章

最新文章