言語固有の SDK クライアントをアプリケーションに統合することで、コード内で直接 Istio リソースを管理できます。このトピックでは、Java 11 と fabric8io/istio-client 6.0.0-RC1 SDK を使用して、プログラムで Istio リソースを作成および管理する方法を説明します。
前提条件
-
Service Mesh (ASM) インスタンスが作成されていること。詳細については、「ASM インスタンスの作成」をご参照ください。
-
Container Service for Kubernetes (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 コンソール にログオンします。
左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、構成する ASM インスタンスを見つけます。[管理] 列で ASM インスタンスの名前をクリックするか、[アクション] をクリックします。
-
インスタンス詳細ページの左側メニューで 基本情報 をクリックし、ページの右側にある 接続設定 をクリックします。
-
接続設定 パネルで、ファイルの内容を $HOME/.kube/config にコピーします。
デフォルトでは、接続にシステム kubeconfig ファイルが使用されます。これは、コード例の new DefaultIstioClient() に対応します。特定の kubeconfig ファイルを使用するには、ゲートウェイルールの作成で示されているように、Config.fromKubeconfig でクライアントを初期化します。
設定ファイルの生成
プログラムによる Istio リソースの管理のページで作成した virtualService.yaml と gateway.yaml ファイルをプロジェクトの静的リソースフォルダーに保存します。
Maven プロジェクトの場合、デフォルトのフォルダーは src/main/resources です。
VirtualService の作成
Java istio-client を使用して Istio リソースを作成する場合、2 つのアプローチから選択できます。どちらのアプローチも、あらゆる Istio リソースタイプに適用できます。
-
YAML ファイル —
.yamlファイルからリソース定義を読み込みます。 この方法は、リソース定義をコードから分離して保持したり、既存のマニフェストを再利用したりする場合に使用します。 -
メソッドチェーン: コード内でリソースを完全にビルドします。このアプローチは、プログラムでリソースを構築する場合に使用します。以下の例では、それぞれのアプローチで VirtualService を作成します。
方法1:YAML ファイルを使用した VirtualService の作成
次の例では、virtualService.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);
}
}
printAllVirtualServices メソッドは、メッシュ内のすべての仮想サービスを出力します。作成した仮想サービスが出力に表示されることを確認してください。
方法2:メソッドチェーンを使用した VirtualService の作成
istio-client はメソッドチェーンをサポートしており、コード内で完全に VirtualService を作成できます。
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);
}
}
printAllVirtualServices メソッドは、メッシュ内のすべての仮想サービスを出力します。bookinfo 仮想サービスが出力に表示されることを確認してください。
Gateway の作成
この例では、「接続の構成」で説明されているように、特定の kubeconfig ファイルを使用して接続し、デフォルトの名前空間に gateway.yaml で定義されている Gateway を作成します。この例では YAML ファイルから Gateway を作成しますが、「方法2:メソッドチェーンを使用した VirtualService の作成」に、同等のメソッドチェーンによるアプローチが示されています。
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 {
// kubeconfig 接続設定ファイルを読み取ります。
String kubeconfigContents = null;
FileReader reader = new FileReader("{path to kube config file}"); // {} 内のコンテンツを kubeconfig ファイルへの実際のパスに置き換えます。
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);
}
}
printAllGateways メソッドは、メッシュ内のすべてのゲートウェイを出力します。作成したゲートウェイルールが出力に表示されることを確認してください。
Bookinfo アプリケーションへのアクセス
VirtualService と Gateway を作成した後、ブラウザで http://{イングレスゲートウェイサービスの IP アドレス}/productpage を開き、Bookinfo アプリケーションを表示します。