在代码中使用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
相关文章
|
7月前
|
Java API 开发工具
【Azure Developer】Java代码实现获取Azure 资源的指标数据却报错 "invalid time interval input"
在使用 Java 调用虚拟机 API 获取指标数据时,因本地时区设置非 UTC,导致时间格式解析错误。解决方法是在代码中手动指定时区为 UTC,使用 `ZoneOffset.ofHours(0)` 并结合 `withOffsetSameInstant` 方法进行时区转换,从而避免因时区差异引发的时间格式问题。
361 4
|
6月前
|
Java API 开发工具
百宝箱开放平台 ✖️ Java SDK
百宝箱提供Java SDK,支持开发者集成其开放能力。需先发布应用,准备Java 8+及Maven环境,通过添加依赖安装SDK,并初始化客户端调用对话型或生成型智能体,实现会话管理、消息查询与文件上传等功能。
1521 0
百宝箱开放平台 ✖️ Java SDK
|
10月前
|
消息中间件 机器学习/深度学习 Java
java 最新技术驱动的智能教育在线实验室设备管理与实验资源优化实操指南
这是一份基于最新技术的智能教育在线实验室设备管理与实验资源优化的实操指南,涵盖系统搭建、核心功能实现及优化策略。采用Flink实时处理、Kafka消息队列、Elasticsearch搜索分析和Redis缓存等技术栈,结合强化学习动态优化资源调度。指南详细描述了开发环境准备、基础组件部署、数据采集与处理、模型训练、API服务集成及性能调优步骤,支持高并发设备接入与低延迟处理,满足教育机构数字化转型需求。代码已提供下载链接,助力快速构建智能化实验室管理系统。
255 44
|
存储 人工智能 开发工具
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
只需要通过向AI助理提问的方式输入您的需求,即可瞬间获得核心流程代码及参数,缩短学习路径、提升开发效率。
1846 5
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
|
Java 程序员
JAVA程序员的进阶之路:掌握URL与URLConnection,轻松玩转网络资源!
在Java编程中,网络资源的获取与处理至关重要。本文介绍了如何使用URL与URLConnection高效、准确地获取网络资源。首先,通过`java.net.URL`类定位网络资源;其次,利用`URLConnection`类实现资源的读取与写入。文章还提供了最佳实践,包括异常处理、连接池、超时设置和请求头与响应头的合理配置,帮助Java程序员提升技能,应对复杂网络编程场景。
325 9
|
11月前
|
API 开发工具 网络架构
【Azure Service Bus】使用Python SDK创建Service Bus Namespace资源(中国区)
本文介绍了如何使用Python SDK创建Azure Service Bus Namespace资源。首先,通过Microsoft Entra ID注册应用获取Client ID、Client Secret和Tenant ID,完成中国区Azure认证。接着,初始化ServiceBusManagementClient对象,并调用`begin_create_or_update`方法创建资源。
275 29
|
Java
Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
【10月更文挑战第14天】Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
356 2
|
10月前
|
存储 Java API
MinIO Java SDK 7.1.4 升级到 8.5.17 需要注意什么
现在我需要你帮我分析对比这个两个sdk在对外的接口设计上是否有不兼容的变更
981 5