使用Java SDK操作Istio资源

通过集成对应语言的SDK Client,您可以在代码中直接操作Istio资源。本文以Java 11和SDK fabric8io/istio-client 6.0.0-RC1版本为例,介绍如何使用Java SDK操作Istio资源。

前提条件

准备工作

安装依赖

Maven配置文件pom.xml中添加如下依赖项。
<dependencies>
  <dependency>
    <groupId>io.fabric8</groupId>
    <artifactId>istio-client</artifactId>
    <version>6.0.0-RC1</version>
  </dependency>
</dependencies>

配置连接

  1. 登录ASM控制台

  2. 在左侧导航栏,选择服务网格 > 网格管理

  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理

  4. 在网格详情页面左侧导航栏单击基本信息,然后在右侧页面单击连接配置
  5. 连接配置面板,复制文件内容到$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);
    }
}

后续步骤

虚拟服务和网关规则创建完成后,您可以在浏览器中访问http://{入口网关服务的IP地址}/productpage,查看Bookinfo应用。