プログラミング言語用 SDK を統合した後、コード内で Istio リソースを管理できます。このトピックでは、バージョン fabric8io/istio-client 6.0.0-RC1 の Java 用 Service Mesh (ASM) SDK を使用して、Java 11 で Istio リソースを管理する方法について説明します。
前提条件
ASM インスタンスが作成されていること。詳細については、「ASM インスタンスの作成」をご参照ください。
コンテナサービス 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 インスタンスの名前をクリックするか、[アクション] をクリックします。
ASM インスタンスの詳細ページで、左側のナビゲーションペインの [基本情報] をクリックします。[基本情報] ページで、[接続] をクリックします。
[接続] パネルで、システム kubeconfig ファイルの内容をマシンの $HOME/.kube/config ディレクトリにコピーします。
説明デフォルトでは、システム kubeconfig ファイルを使用して接続が設定されます。特定の kubeconfig ファイルを使用する方法の詳細については、このトピックの「Istio ゲートウェイの作成」セクションをご参照ください。
構成ファイルの生成
ASM SDK を使用してコード内で Istio リソースを管理する で作成された virtualService.yaml ファイルと gateway.yaml ファイルをプロジェクトの静的リソースフォルダに保存します。
デフォルトでは、静的リソースフォルダは Maven プロジェクトの src/main/resources ディレクトリにあります。
仮想サービスの作成
istio-client を使用して Java で Istio リソースを作成する場合、YAML ファイルまたはメソッドチェーンを使用できます。仮想サービスを作成するには、次のいずれかの方法を使用できます。
方法 1: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();
}
// ASM インスタンス内のすべての仮想サービスを表示します。
static void printAllVirtualServices(IstioClient istioClient) {
istioClient.v1beta1().virtualServices().list().getItems().forEach(System.out::println);
}
}方法 2:メソッドチェーンを使用して仮想サービスを作成する
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();
}
// ASM インスタンス内のすべての仮想サービスを表示します。
static void printAllVirtualServices(IstioClient istioClient) {
istioClient.v1beta1().virtualServices().list().getItems().forEach(System.out::println);
}
}Istio ゲートウェイの作成
特定の kubeconfig ファイルを使用して接続を設定した後、gateway.yaml ファイルを使用して、デフォルトの名前空間に Istio ゲートウェイを作成できます。この例では、YAML ファイルを使用して Istio ゲートウェイを作成します。メソッドチェーンの使用方法の詳細については、このトピックの「方法 2:メソッドチェーンを使用して仮想サービスを作成する」セクションをご参照ください。
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("{kube 構成ファイルへのパス}"); // {} の内容を使用する 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();
}
// ASM インスタンス内のすべてのゲートウェイを表示します。
static void printAllGateways(IstioClient istioClient) {
istioClient.v1beta1().gateways().list().getItems().forEach(System.out::println);
}
}次のステップ
仮想サービスと Istio ゲートウェイを作成した後、ブラウザで http://{イングレスゲートウェイサービスの IP アドレス}/productpage にアクセスして、Bookinfo アプリケーションにアクセスできます。