Ao gerenciar recursos do Istio, como VirtualServices e Gateways, em vários clusters, a aplicação manual de arquivos YAML via kubectl torna-se repetitiva e propensa a erros. O SDK fabric8io/istio-client permite criar, consultar, atualizar e excluir recursos do Istio diretamente no código Java, possibilitando a automação dessas operações em seus pipelines de implantação.
Este guia aborda a criação de um VirtualService e um Gateway no Alibaba Cloud Service Mesh (ASM) usando istio-client 6.0.0-RC1 com Java 11.
Início rápido
O exemplo a seguir cria um VirtualService no namespace default carregando um arquivo YAML. A conexão com o plano de controle do ASM ocorre por meio do kubeconfig padrão localizado em $HOME/.kube/config.
import io.fabric8.istio.api.networking.v1beta1.VirtualService;
import io.fabric8.istio.client.DefaultIstioClient;
import io.fabric8.istio.client.IstioClient;
public class QuickStartExample {
public static void main(String[] args) {
try {
IstioClient istioClient = new DefaultIstioClient();
VirtualService vs = istioClient.v1beta1().virtualServices()
.load(QuickStartExample.class.getResourceAsStream("/virtualService.yaml"))
.get();
istioClient.v1beta1().virtualServices()
.inNamespace("default")
.resource(vs)
.create();
System.out.println("VirtualService created successfully.");
istioClient.close();
} catch (Exception e) {
System.err.println("Failed to create VirtualService: " + e.getMessage());
System.exit(1);
}
}
}
Para obter os arquivos YAML utilizados nestes exemplos, consulte Usar o SDK do ASM para gerenciar recursos do Istio em código.
Pré-requisitos
Antes de começar, verifique se você possui:
Uma instância do ASM. Para mais informações, consulte Criar uma instância do ASM
Um cluster do Container Service for Kubernetes (ACK) adicionado à sua instância do ASM. Para mais informações, consulte Adicionar um cluster a uma instância do ASM
A aplicação de exemplo Bookinfo implantada no cluster ACK. Para mais informações, consulte Implantar uma aplicação em uma instância do ASM
Um serviço de gateway de entrada implantado no cluster ACK. Para mais informações, consulte Criar um serviço de gateway de entrada
Configure seu projeto
Adicione a dependência do SDK
Adicione a dependência istio-client ao seu arquivo Maven pom.xml:
<dependencies>
<dependency>
<groupId>io.fabric8</groupId>
<artifactId>istio-client</artifactId>
<version>6.0.0-RC1</version>
</dependency>
</dependencies>
Conecte-se à instância do ASM
O SDK istio-client lê seu kubeconfig para estabelecer conexão com o plano de controle do ASM. Copie o kubeconfig do console do ASM para sua máquina local:
Faça login no console do ASM.
No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.
Na página Mesh Management, localize sua instância do ASM e clique no nome dela ou clique em Manage na coluna Actions.
No painel de navegação à esquerda, clique em Base Information. Na página Basic Information, clique em Connection.
No painel Connection, copie o conteúdo do kubeconfig do sistema para
$HOME/.kube/configna sua máquina.
Por padrão, o SDK lê automaticamente o arquivo $HOME/.kube/config. Para utilizar um arquivo kubeconfig diferente, consulte Conectar com um kubeconfig personalizado.
Prepare os arquivos de configuração YAML
Salve os arquivos virtualService.yaml e gateway.yaml, disponíveis em Usar o SDK do ASM para gerenciar recursos do Istio em código, na pasta de recursos estáticos do Maven (src/main/resources) do seu projeto.
Crie um VirtualService
É possível criar recursos do Istio carregando um arquivo YAML ou construindo o recurso programaticamente com encadeamento de métodos.
Carregue a partir de um arquivo YAML
O exemplo abaixo carrega o arquivo virtualService.yaml da pasta de recursos do projeto e cria o VirtualService no namespace default:
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) {
try {
IstioClient istioClient = new DefaultIstioClient();
final String NAMESPACE = "default"; // Target namespace for the resource
VirtualService virtualService = istioClient.v1beta1().virtualServices().load(
VirtualServiceExample.class.getResourceAsStream("/virtualService.yaml")
).get();
istioClient.v1beta1().virtualServices().inNamespace(NAMESPACE).resource(virtualService).create();
printAllVirtualServices(istioClient);
istioClient.close();
} catch (Exception e) {
System.err.println("Failed to create VirtualService: " + e.getMessage());
System.exit(1);
}
}
// List all virtual services in the ASM instance
static void printAllVirtualServices(IstioClient istioClient) {
istioClient.v1beta1().virtualServices().list().getItems().forEach(System.out::println);
}
}
Construa com encadeamento de métodos
Utilize o VirtualServiceBuilder para construir o recurso via código em vez de carregar um YAML. O exemplo a seguir cria um VirtualService para o Bookinfo que roteia o tráfego do bookinfo-gateway para o serviço productpage na porta 9080.
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) {
try {
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();
} catch (Exception e) {
System.err.println("Failed to create VirtualService: " + e.getMessage());
System.exit(1);
}
}
// List all virtual services in the ASM instance
static void printAllVirtualServices(IstioClient istioClient) {
istioClient.v1beta1().virtualServices().list().getItems().forEach(System.out::println);
}
}
Mapeamento entre Builder e YAML
Os métodos do builder correspondem diretamente aos campos YAML do VirtualService. A tabela a seguir apresenta o mapeamento para os campos mais comuns:
|
Método do Builder |
Equivalente YAML |
Descrição |
|
|
|
Nome do recurso |
|
|
|
Hosts de destino para o tráfego |
|
|
|
Gateway a ser vinculado |
|
|
|
Correspondência exata de URI |
|
|
|
Correspondência de prefixo de URI |
|
|
|
Destino da rota |
Para a especificação completa do VirtualService, consulte a referência da API VirtualService do Istio.
Crie um Gateway
O exemplo a seguir cria um Gateway no namespace default a partir do arquivo gateway.yaml. Ele também demonstra como se conectar usando um arquivo kubeconfig personalizado em vez do padrão $HOME/.kube/config:
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) {
try {
// Read a custom kubeconfig file
String kubeconfigContents = null;
FileReader reader = new FileReader("<path-to-kubeconfig>"); // Replace with the actual path
kubeconfigContents = IOHelpers.readFully(reader);
Config config = Config.fromKubeconfig(null, kubeconfigContents, null);
IstioClient istioClient = new DefaultIstioClient(config);
final String NAMESPACE = "default"; // Target namespace for the resource
Gateway gateway = istioClient.v1beta1().gateways().load(
GateWayExample.class.getResourceAsStream("/gateway.yaml")
).get();
istioClient.v1beta1().gateways().inNamespace(NAMESPACE).resource(gateway).create();
printAllGateways(istioClient);
istioClient.close();
} catch (Exception e) {
System.err.println("Failed to create Gateway: " + e.getMessage());
System.exit(1);
}
}
// List all gateways in the ASM instance
static void printAllGateways(IstioClient istioClient) {
istioClient.v1beta1().gateways().list().getItems().forEach(System.out::println);
}
}
Substitua o placeholder a seguir pelo seu valor real:
|
Placeholder |
Descrição |
Exemplo |
|
|
Caminho absoluto para o seu arquivo kubeconfig |
|
Operações comuns do SDK
Além da criação de recursos, o SDK istio-client suporta uma ampla gama de operações. A tabela a seguir lista as operações mais comuns para VirtualService. O mesmo padrão se aplica a Gateway e outros tipos de recursos do Istio.
|
Operação |
Código |
|
Criar |
|
|
Obter por nome |
|
|
Listar todos |
|
|
Atualizar |
|
|
Excluir |
|
Verifique o resultado
Após criar o VirtualService e o Gateway, abra um navegador e acesse http://<ingress-gateway-ip>/productpage para acessar a aplicação Bookinfo. Substitua <ingress-gateway-ip> pelo endereço IP do seu serviço de gateway de entrada.
Referências
Usar o SDK do ASM para gerenciar recursos do Istio em código -- source para
virtualService.yamlegateway.yamlExtensão Istio do fabric8io/kubernetes-client -- lista completa de tipos de recursos e operações suportadas do Istio
Referência da API de rede do Istio -- Especificações das APIs VirtualService e Gateway