通过集成对应语言的SDK Client,您可以在代码中直接操作Istio资源。本文以Java 11和SDK fabric8io/istio-client 6.0.0-RC1版本为例,介绍如何使用Java SDK操作Istio资源。
前提条件
- 已创建ASM实例。具体操作,请参见创建ASM实例。
- 已添加ACK集群到ASM实例。具体操作,请参见添加集群到ASM实例。
- 已部署Bookinfo应用示例到ASM实例的ACK集群中。具体操作,请参见在ASM实例关联的集群中部署应用。
- 已在ASM实例的ACK集群中部署入口网关。具体操作,请参见创建入口网关。
准备工作
安装依赖
在Maven配置文件pom.xml中添加如下依赖项。
<dependencies>
<dependency>
<groupId>io.fabric8</groupId>
<artifactId>istio-client</artifactId>
<version>6.0.0-RC1</version>
</dependency>
</dependencies>
配置连接
登录ASM控制台。
在左侧导航栏,选择 。
在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。
- 在网格详情页面左侧导航栏单击基本信息,然后在右侧页面单击连接配置。
- 在连接配置面板,复制文件内容到$HOME/.kube/config路径下。说明 连接默认使用系统Kube Config文件,如需指定使用特定的Kube Config文件,请参考创建网关规则。
生成配置文件
将在代码中使用SDK操作Istio资源页面创建的virtualService.yaml和gateway.yaml文件保存到项目静态资源文件夹中。
说明 对于Maven项目,默认为src/main/resources文件夹。
创建虚拟服务
使用JAVA istio-client创建Istio资源时,您可以选择使用YAML文件或链式调用的方式。创建虚拟服务的具体操作步骤如下:
方式一:使用YAML文件创建虚拟服务
import java.io.FileReader;
import java.io.IOException;
import io.fabric8.istio.api.networking.v1beta1.VirtualService;
import io.fabric8.istio.client.DefaultIstioClient;
import io.fabric8.istio.client.IstioClient;
import io.fabric8.kubernetes.client.Config;
import io.fabric8.kubernetes.client.utils.IOHelpers;
public class VirtualServiceExample {
public static void main( String[] args ) {
IstioClient istioClient = new DefaultIstioClient();
final String NAMESPACE = "default"; // 创建资源的命名空间。
VirtualService virtualService = istioClient.v1beta1().virtualServices().load(
VirtualServiceExample.class.getResourceAsStream("/virtualService.yaml")
).get();
istioClient.v1beta1().virtualServices().inNamespace(NAMESPACE).resource(virtualService).create();
printAllVirtualServices(istioClient);
istioClient.close();
}
// 打印网格中所有的VirtualService。
static void printAllVirtualServices(IstioClient istioClient) {
istioClient.v1beta1().virtualServices().list().getItems().forEach(System.out::println);
}
}
方式二:使用链式调用创建虚拟服务
istio-client提供了链式调用的能力,支持以纯代码的方式创建虚拟服务。
import io.fabric8.istio.api.networking.v1beta1.VirtualServiceBuilder;
import io.fabric8.istio.client.DefaultIstioClient;
import io.fabric8.istio.client.IstioClient;
public class VirtualServiceChainingExample {
public static void main(String[] args) {
IstioClient istioClient = new DefaultIstioClient();
final String NAMESPACE = "default";
istioClient.v1beta1().virtualServices().inNamespace(NAMESPACE).resource(
new VirtualServiceBuilder()
.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();
}
// 打印网格中所有的VirtualService。
static void printAllVirtualServices(IstioClient istioClient) {
istioClient.v1beta1().virtualServices().list().getItems().forEach(System.out::println);
}
}
创建网关规则
使用指定的Kube Config文件配置连接后,您可以在default命名空间创建gateway.yaml指定的网关规则。下文以使用YAML文件创建网关规则为例,链式调用请参考方式二:使用链式调用创建。
import java.io.FileReader;
import java.io.IOException;
import io.fabric8.istio.api.networking.v1beta1.Gateway;
import io.fabric8.istio.client.DefaultIstioClient;
import io.fabric8.istio.client.IstioClient;
import io.fabric8.kubernetes.client.Config;
import io.fabric8.kubernetes.client.utils.IOHelpers;
public class GateWayExample {
public static void main(String[] args) throws IOException {
// 读取Kube Config连接配置文件。
String kubeconfigContents = null;
FileReader reader = new FileReader("{path to kube config file}"); // 将{}内容替换成Kube Config实际路径。
kubeconfigContents = IOHelpers.readFully(reader);
Config config = Config.fromKubeconfig(null, kubeconfigContents, null);
IstioClient istioClient = new DefaultIstioClient(config);
final String NAMESPACE = "default"; // 创建资源的命名空间。
Gateway gateway = istioClient.v1beta1().gateways().load(
GateWayExample.class.getResourceAsStream("/gateway.yaml")
).get();
istioClient.v1beta1().gateways().inNamespace(NAMESPACE).resource(gateway).create();
printAllGateways(istioClient);
istioClient.close();
}
// 打印网格中所有的Gateway。
static void printAllGateways(IstioClient istioClient) {
istioClient.v1beta1().gateways().list().getItems().forEach(System.out::println);
}
}