通過整合對應語言的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);
}
}