Em aplicações com muitos microsserviços ou diversas regras de roteamento, um único VirtualService pode se tornar extenso e difícil de manter. Para resolver isso, o Service Mesh (ASM) oferece um mecanismo de delegate que permite dividir as regras de roteamento entre vários recursos VirtualService. Essa abordagem reduz os riscos associados a alterações nas configurações de roteamento. Este tópico usa a aplicação Bookinfo como exemplo para demonstrar como definir regras de roteamento utilizando múltiplos VirtualServices.
Pré-requisitos
Um cluster foi adicionado a uma instância do ASM e a versão da instância do ASM é 1.8.6.4 ou posterior.
Um gateway de entrada está implantado. Para mais informações, consulte Criar um gateway de entrada.
Uma aplicação foi implantada no cluster associado à instância do ASM. Para mais informações, consulte Implantar uma aplicação em uma instância do ASM.
Informações de fundo
No Service Mesh (ASM), utiliza-se um VirtualService para definir as regras que controlam o roteamento de tráfego para os serviços. Na prática, manter um único VirtualService grande pode ser desafiador. Cada atualização de roteamento exige a modificação desse recurso, o que frequentemente causa conflitos de atualização, redundância e alto acoplamento nas configurações. Qualquer erro nessas regras pode afetar os serviços no cluster do plano de dados e até mesmo interromper todo o acesso aos serviços.
O ASM estende o recurso VirtualService com um mecanismo de delegate para desacoplar as regras de roteamento. É possível dividir um VirtualService em um primário e um ou mais secundários. O VirtualService primário define as regras gerais, enquanto os secundários definem regras detalhadas para partes específicas da aplicação. Normalmente, um administrador central gerencia o VirtualService primário, e os proprietários individuais gerenciam os secundários. Essa separação de responsabilidades reduz significativamente o risco de alterações nas regras de roteamento e melhora a eficiência de implantações e atualizações independentes de serviços.
Observações
O ASM não suporta Delegates aninhados. O parâmetro Delegate só pode ser definido em um VirtualService primário. Por exemplo, se o parâmetro Delegate estiver configurado tanto no VirtualService primário quanto no secundário, nenhum dos dois terá efeito.
O
HTTPMatchRequestem um VirtualService secundário deve ser um subconjunto da condição correspondente no VirtualService primário. Caso contrário, ocorrerá um conflito e oHTTPRoutenão entrará em vigor.Especifique o campo
delegateapenas quando os camposrouteeredirectna rota HTTP do VirtualService primário estiverem vazios. O campohostsde um VirtualService secundário deve estar vazio. As regras de roteamento do VirtualService secundário são mescladas com as do VirtualService primário.
Etapa 1: Configure o Gateway
Faça login no console do ASM.
No painel de navegação à esquerda, escolha .
Na página Mesh Management, localize a instância do ASM que deseja configurar. Clique no nome da instância do ASM ou clique em Manage na coluna Actions.
Na página de detalhes da instância do ASM, escolha no painel de navegação à esquerda. Na página exibida, clique em Create from YAML.
-
Selecione um Namespaces, cole o seguinte conteúdo YAML no editor e clique em Create. Este tópico usa o namespace
defaultcomo exemplo.apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: bookinfo-gateway spec: selector: istio: ingressgateway # use istio default controller servers: - port: number: 80 name: http protocol: HTTP hosts: - "*"Defina
numbercomo80para que o serviço Bookinfo possa receber conexões HTTP de entrada ou saída na porta 80.
Etapa 2: Configure o VirtualService primário
Faça login no console do ASM.
No painel de navegação à esquerda, escolha .
Na página Mesh Management, localize a instância do ASM que deseja configurar. Clique no nome da instância do ASM ou clique em Manage na coluna Actions.
Na página de detalhes da instância do ASM, escolha no painel de navegação à esquerda. Na página exibida, clique em Create from YAML.
-
Selecione um Namespaces, cole o seguinte conteúdo YAML no editor e clique em Create. Este tópico usa o namespace
defaultcomo exemplo.O código a seguir cria
delegates para vs-1 e vs-2, onde vs-1 exige que as solicitações contenham/logpara acessar o serviço Bookinfo, e vs-2 exige que as solicitações contenham/para acessar o serviço Bookinfo.apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: bookinfo namespace: default spec: gateways: - bookinfo-gateway hosts: - '*' http: - delegate: name: vs-1 namespace: ns1 match: - uri: prefix: /log - delegate: name: vs-2 namespace: ns1 match: - uri: prefix: /Parâmetros no campo
delegate:name: O nome do delegate.
namespace: O namespace do delegate.
Etapa 3: Configure o VirtualService filho
Faça login no console do ASM.
No painel de navegação à esquerda, escolha .
Na página Mesh Management, localize a instância do ASM que deseja configurar. Clique no nome da instância do ASM ou clique em Manage na coluna Actions.
Na página de detalhes da instância do ASM, escolha no painel de navegação à esquerda. Na página exibida, clique em Create from YAML.
-
Selecione um Namespaces, cole o seguinte conteúdo no editor e clique em Create.
Este tópico usa o namespace
ns1como exemplo. Para mais informações sobre como criar um namespace, consulte Gerenciar namespaces globais.apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: vs-1 namespace: ns1 spec: http: - match: - uri: exact: /login - uri: exact: /logout route: - destination: host: productpage.default.svc.cluster.local port: number: 9080metadata: Deve corresponder ao parâmetro delegate do VirtualService primário para estabelecer o vínculo. Neste exemplo, os metadados correspondem ao parâmetro delegate de vs-1, vinculando-o a esse delegate.
match: Especifica as condições de filtro para solicitações. Neste exemplo,
uriestá definido comoexact: /logineexact: /logout. Isso permite fazer login e logout no serviço Bookinfo.
-
Novamente, selecione o
ns1Namespaces, cole o seguinte conteúdo YAML no editor e clique em Create.apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: vs-2 namespace: ns1 spec: http: - match: - uri: exact: /productpage - uri: prefix: /static - uri: prefix: /api/v1/products route: - destination: host: productpage.default.svc.cluster.local port: number: 9080metadata: O valor deve corresponder ao parâmetro delegate do VirtualService primário para estabelecer o vínculo. Neste exemplo, o valor corresponde ao parâmetro delegate de vs-2, vinculando-o a esse delegate.
match: Especifica as condições de filtro para uma solicitação. Neste exemplo, a solicitação deve conter /productpage, /static ou /api/v1/products.
Verifique os resultados
-
No navegador, acesse http://<endereço IP do gateway de entrada>/productpage.
A página a seguir será exibida. Isso indica que a solicitação ao serviço Bookinfo contendo o parâmetro
/productpagefoi bem-sucedida e que o VirtualService para vs-2 está configurado corretamente. Para obter informações sobre como conseguir o endereço do gateway do ASM, consulte Obter o endereço IP do gateway de entrada. A página carrega a aplicação BookInfo Sample e exibe a página do produto para o livro The Comedy of Errors. A seção Book Details à esquerda lista campos como Type, Pages, Publisher, Language e ISBN. A seção Book Reviews à direita exibe várias avaliações de usuários e classificações por estrelas. Isso confirma que a aplicação de service mesh está acessível pelo gateway do ASM. -
Clique em Sign in no canto superior direito da página. Na caixa de diálogo exibida, insira um nome de usuário e senha para entrar no serviço Bookinfo.
A página será atualizada para o estado autenticado. Isso confirma que o VirtualService
vs-1está configurado corretamente. Após o login, seu nome de usuário (por exemplo,jason) e um link sign out aparecem no canto superior direito, confirmando um login bem-sucedido.