O Istio (em inglês) é uma biblioteca de código aberto para conectar, monitorar e proteger microsserviços. Ele permite que você crie uma rede, ou malha, de serviços implantados com balanceamento de carga, autenticação de serviço a serviço, monitoramento e muito mais, sem exigir nenhuma alteração no código. Você adiciona a compatibilidade do Istio aos serviços por meio da implantação de um proxy de arquivo secundário Envoy (em inglês) especial a cada um dos pods do seu app. O proxy Envoy intercepta toda a comunicação de rede entre microsserviços e é configurado e gerenciado com o uso da funcionalidade de plano de controle do Istio.
Atualmente, o plano de controle do Istio só pode ser instalado em implementações do Kubernetes, como o Google Kubernetes Engine (GKE), mas o recurso de expansão de malha dele possibilita adicionar à malha de serviço os serviços executados em plataformas que não são do Kubernetes, como os executados em VMs do Compute Engine. Isso permite que você controle serviços de máquina virtual (VM, na sigla em inglês) e do Kubernetes como uma única malha. Neste tutorial, você verá como configurar o Istio para usar a expansão da malha e como configurar instâncias de VM do Compute Engine para que possam ser adicionadas a uma malha do Istio. O ideal é que você já tenha uma instalação do Istio no GKE.
Para mais informações sobre o Istio e como ele funciona, consulte istio.io (em inglês). Caso esteja interessado em descobrir como funciona a configuração de expansão de malha usada neste tutorial, consulte este artigo. No entanto, esta não é uma informação necessária para concluir o tutorial.
Objetivos
- Atualizar um Istio existente na instalação do GKE para usar a expansão da malha.
- Configurar instâncias de VM do Compute Engine para participar de uma malha de serviço do Istio.
- Executar um serviço de malha do Istio em uma instância de VM do Compute Engine.
Custos
Neste tutorial, usamos componentes faturáveis do Google Cloud Platform, incluindo o Compute Engine.
Usuários novos do GCP podem estar qualificados para uma avaliação gratuita.Antes de começar
- Você precisa ter o Istio instalado no GKE. Para mais informações, consulte Como instalar o Istio em um cluster do GKE.
- É preciso ter o aplicativo de amostra BookInfo instalado e ativo, também conforme descrito em Como instalar o Istio em um cluster do GKE, além de ter
istioctl
emPATH
. - É preciso ter cota suficiente no serviço de back-end e no endereço IP para executar quatro balanceadores de carga internos (um balanceador de carga e um endereço IP cada) e o serviço de entrada do BookInfo (um balanceador de carga e um endereço IP) mencionado no tutorial anterior.
Verifique se o contexto
kubectl
está definido como o cluster do Istio.kubectl config current-context # Display the current-context kubectl config use-context [CLUSTER_NAME] # set the default context to [CLUSTER_NAME]
Definir padrões para a ferramenta de linha de comando gcloud
Para poupar tempo, em vez de digitar o ID do projeto e as opções de zona do Compute Engine na ferramenta de linha de comando gcloud
, defina os padrões:
gcloud config set project [PROJECT_ID] gcloud config set compute/zone [COMPUTE_ENGINE_ZONE]
Como configurar a malha para expansão
O primeiro passo ao adicionar serviços que não são do Google Kubernetes Engine a uma malha do Istio é configurar a própria instalação do Istio e gerar os arquivos de configuração que permitirão que ela seja usada pelas instâncias de VM do Compute Engine. O download do Istio inclui um script para ajudar com essa tarefa no GKE. Ele é encontrado em /install/tools/setupMeshEx.sh. Siga as etapas abaixo na máquina em que estão localizados o diretório de instalação do Istio e as credenciais do cluster. Trata-se da sua máquina de administração de clusters.
Use a implantação
mesh-expansion
fornecida para configurar balanceadores de carga internos para Pilot, Mixer, autoridade de certificação Istio (links em inglês) e o servidor Cloud DNS do GKE. Isso garante que esses serviços possam ser acessados pelas instâncias de VM.kubectl apply -f install/kubernetes/mesh-expansion.yaml
Confirme se os serviços estão funcionando e se todos os ILBs têm valores
EXTERNAL-IP
(talvez seja preciso aguardar um minuto):$ kubectl -n istio-system get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ca-ilb LoadBalancer 10.47.245.69 10.150.0.9 8060:32174/TCP 3m istio-egress ClusterIP 10.47.252.251 <none> 80/TCP 7m istio-ingress LoadBalancer 10.47.254.41 35.197.249.113 80:31822/TCP,443:30637/TCP 7m istio-mixer ClusterIP 10.47.244.179 <none> 9091/TCP,9093/TCP,9094/TCP,9102/TCP,9125/UDP,42422/TCP 8m istio-pilot ClusterIP 10.47.241.19 <none> 8080/TCP,443/TCP 7m istio-pilot-ilb LoadBalancer 10.47.243.136 10.150.0.6 8080:30064/TCP 3m mixer-ilb LoadBalancer 10.47.242.213 10.150.0.8 9091:31278/TCP 3m
No diretório de instalação do Istio, use o script de ajuda para gerar a configuração
cluster.env
do Istio que será implantada nas instâncias de VM. Especifique o nome do cluster. Esse arquivo contém os intervalos de endereços IP do cluster a serem interceptados.install/tools/setupMeshEx.sh generateClusterEnv [CLUSTER_NAME]
Isso cria um arquivo com uma única linha como esta:
$ cat cluster.env ISTIO_SERVICE_CIDR=10.63.240.0/20
Agora, use o mesmo script para gerar o arquivo de configuração do Cloud DNS que será utilizado nas instâncias de VM. Isso permitirá que os apps na VM do Compute Engine resolvam nomes de serviço do cluster usando dnsmasq (em inglês), que será interceptado pelo arquivo secundário e encaminhado.
install/tools/setupMeshEx.sh generateDnsmasq
Exemplo de arquivo gerado:
$ cat kubedns server=/svc.cluster.local/10.150.0.7 address=/istio-mixer/10.150.0.8 address=/istio-pilot/10.150.0.6 address=/istio-ca/10.150.0.9 address=/istio-mixer.istio-system/10.150.0.8 address=/istio-pilot.istio-system/10.150.0.6 address=/istio-ca.istio-system/10.150.0.9
Como configurar uma VM de expansão de malha
Depois de configurar a malha e gerar os arquivos de configuração relevantes, o próximo passo é configurar as instâncias de VM do Compute Engine que participarão da malha, inclusive copiando os arquivos gerados nas VMs. Para a finalidade deste tutorial, use o script setupMeshEx.sh
fornecido para copiar arquivos e configurar a máquina. No entanto, ao adicionar suas próprias VMs a um app de malha real, siga as etapas manualmente para integrá-las aos fluxos de trabalho e ao provisionamento. Para etapas detalhadas, consulte o guia Expansão de malha do Istio e veja o script que setupMeshEx.sh
executa em cada VM em /install/tools/setupIstioVM.sh (links em inglês).
Primeiro, verifique se você tem uma VM do Compute Engine para usar como máquina de expansão de malha no mesmo projeto e na mesma rede que a instalação do Istio. Se você não tiver, crie uma:
gcloud compute instances create istio-vm
O Istio pode administrar serviços em vários namespaces do GKE. Neste exemplo, você colocará o serviço de VM (mesmo que não esteja no GKE) no namespace
vm
, porque é onde as regras de roteamento BookInfo fornecidas o procuram. O uso de diferentes namespaces como esse ajuda a manter os serviços de VM separados dos serviços regulares do GKE. Para usar um namespace não padrão para uma máquina de expansão de malha, é preciso especificar isso antes de executar os scripts de instalação. No diretório de instalação do Istio na máquina de administração de clusters, defina primeiro a variávelSERVICE_NAMESPACE
:export SERVICE_NAMESPACE=vm
Em seguida, crie o namespace:
kubectl create namespace $SERVICE_NAMESPACE
Ainda na máquina de administração de clusters, execute o comando a seguir com o script de instalação
setupMeshEx.sh
. Essa ação tem as seguintes consequências:- copia os arquivos gerados e o script de configuração da VM na VM;
- define e verifica as configurações do Cloud DNS para que a VM possa se conectar a componentes do Istio;
- copia as chaves secretas de autenticação do Istio na VM;
- instala arquivos Debian do Istio na VM, inclusive o proxy de arquivo secundário do Istio.
install/tools/setupMeshEx.sh machineSetup istio-vm
Conecte-se por SSH à VM do Compute Engine usando a ferramenta de linha de comando
gcloud
ou qualquer uma das outras opções da página do console Detalhes da instância de VM, que você encontrará vinculada à página Instâncias de VM:gcloud compute ssh istio-vm
Na VM do Compute Engine, verifique se a máquina configurada consegue acessar os serviços executados no cluster do GKE. Por exemplo, se você estiver executando o exemplo do BookInfo mencionado em Como instalar o Istio no GKE no cluster do Kubernetes Engine, conseguirá acessar o serviço
productpage
comcurl
na VM, conforme mostrado neste exemplo:$ curl -v -w "\n" http://productpage.default.svc.cluster.local:9080/api/v1/products/0/ratings * Trying 10.63.251.156... * Connected to productpage.default.svc.cluster.local (10.63.251.156) port 9080 (#0) > GET /api/v1/products/0/ratings HTTP/1.1 > Host: productpage.default.svc.cluster.local:9080 > User-Agent: curl/7.47.0 > Accept: / > < HTTP/1.1 200 OK < content-type: application/json < content-length: 54 < server: envoy < date: Sun, 15 Oct 2017 00:04:49 GMT < x-envoy-upstream-service-time: 17 <
- Connection #0 to host productpage.default.svc.cluster.local left intact {"ratings": {"Reviewer2": 4, "Reviewer1": 5}, "id": 0}
Novamente na VM, verifique se os processos do Istio estão sendo executados:
$ sudo systemctl status istio-auth-node-agent istio-auth-node-agent.service - istio-auth-node-agent: The Istio auth node agent Loaded: loaded (/lib/systemd/system/istio-auth-node-agent.service; disabled; vendor preset: enabled) Active: active (running) since Fri 2017-10-13 21:32:29 UTC; 9s ago Docs: http://istio.io/ Main PID: 6941 (node_agent) Tasks: 5 Memory: 5.9M CPU: 92ms CGroup: /system.slice/istio-auth-node-agent.service └─6941 /usr/local/istio/bin/node_agent --logtostderr Oct 13 21:32:29 demo-vm-1 systemd[1]: Started istio-auth-node-agent: The Istio auth node agent. Oct 13 21:32:29 demo-vm-1 node_agent[6941]: I1013 21:32:29.469314 6941 main.go:66] Starting Node Agent Oct 13 21:32:29 demo-vm-1 node_agent[6941]: I1013 21:32:29.469365 6941 nodeagent.go:96] Node Agent starts successfully. Oct 13 21:32:29 demo-vm-1 node_agent[6941]: I1013 21:32:29.483324 6941 nodeagent.go:112] Sending CSR (retrial #0) ... Oct 13 21:32:29 demo-vm-1 node_agent[6941]: I1013 21:32:29.862575 6941 nodeagent.go:128] CSR is approved successfully. Will renew cert in 29m59.137732603s
Observe o uso de default
no URL da página do produto, já que o exemplo do BookInfo foi criado no namespace padrão no tutorial anterior. Se você optar por usar um namespace diferente, substitua-o aqui.
Como executar um serviço em uma máquina de expansão de malha
No exemplo a seguir, veja como executar um serviço em uma máquina de expansão de malha. Neste exemplo, você usará a VM configurada na última seção para estender o exemplo do BookInfo mencionado em Como instalar o Istio no GKE com um banco de dados de avaliações do MySQL em execução em uma VM do Compute Engine.
Verifique se
istio-vm
foi configurado como uma VM de expansão de malha para o cluster em que o BookInfo está sendo executado, conforme descrito acima.Instale um servidor MySQL na VM do Compute Engine:
sudo apt-get update && sudo apt-get install --no-install-recommends -y mariadb-server
Para a finalidade deste tutorial (não faça isso em situações reais), configure o servidor MySQL para que o usuário "root" tenha a senha "password":
sudo mysql -e "grant all privileges on *.* to 'root'@'localhost' identified by 'password'; flush privileges"
Em seguida, use o esquema mysqldb-init.sql (em inglês) fornecido para configurar o banco de dados de avaliações do BookInfo.
curl https://raw.githubusercontent.com/istio/istio/master/samples/bookinfo/src/mysql/mysqldb-init.sql| mysql -u root --password=password -h 127.0.0.1
Depois, registre o novo serviço na instalação do Istio usando
istioctl
. Primeiramente, consiga o endereço IP interno principal da VM na página Detalhes da instância de VM do console ou usehostname --ip-address
. Em seguida, na máquina de administração de clusters, execute o comando a seguir, substituindo o endereço IP apropriado:$ istioctl register -n vm mysqldb 10.150.0.5 3306 I1014 22:54:12.176972 18162 register.go:44] Registering for service 'mysqldb' ip '10.150.0.5', ports list [{3306 mysql}]
Ainda na máquina de administração de clusters, atualize a implantação do BookInfo com uma versão do serviço de avaliações que usa o banco de dados MySQL e o roteamento para enviar tráfego para ele.
$ kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/kube/bookinfo-ratings-v2-mysql-vm.yaml) deployment "ratings-v2-mysql-vm" created
$ kubectl get pods -lapp=ratings NAME READY STATUS RESTARTS AGE ratings-v1-3016823457-mqbfx 2/2 Running 0 24m ratings-v2-mysql-vm-1319199664-9jxkp 2/2 Running 0 19s
$ istioctl create -f samples/bookinfo/kube/route-rule-ratings-mysql-vm.yaml Created config route-rule/default/ratings-test-v2-mysql-vm at revision 4398 Created config route-rule/default/reviews-test-ratings-v2-vm at revision 4399
Por fim, de volta à VM do Compute Engine, configure o arquivo secundário do proxy do Istio de
istio-vm
para interceptar o tráfego na porta relevante (3306 no nosso exemplo, conforme especificado ao registrar o serviço). Isso é configurado em/var/lib/istio/envoy/sidecar.env
adicionando-se as três linhas a seguir ao arquivo.$ sudo vi /var/lib/istio/envoy/sidecar.env ... ISTIO_INBOUND_PORTS=3306 ISTIO_SERVICE=mysqldb ISTIO_NAMESPACE=vm
É necessário reiniciar o arquivo secundário após a alteração da configuração.
sudo systemctl restart istio
Depois que você tiver feito tudo isso, o serviço de avaliações do aplicativo BookInfo usa o novo banco de dados de expansão de malha. Tente alterar os valores no banco de dados de avaliações na VM e veja como eles aparecem nas páginas do produto do app BookInfo.
$ mysql -u root -h 127.0.0.1 --password=password test -e "select * from ratings" +----------+--------+ | ReviewID | Rating | +----------+--------+ | 1 | 5 | | 2 | 4 | +----------+--------+ # Change to 1 star: $ mysql -u root --password=password test -e "update ratings set rating=1 where reviewid=1"
Como funciona
Quando o app na instância de VM faz uma solicitação a outro serviço na malha, ele usa o Cloud DNS para resolver o nome, retornando o IP do serviço (ou IP do cluster, o VIP atribuído ao serviço). Na configuração especial de VM da expansão de malha do Istio, o app de VM usa dnsmasq
para resolver o nome, que redireciona todos os endereços .cluster.local
para o GKE. A configuração de dnsmasq
também adiciona 127.0.0.1
a resolv.conf
e, se necessário, configura o DHCP para inserir 127.0.0.1
após cada DHCP resolvido.
Quando o app realmente faz a solicitação, a configuração de VM do Istio usa ipnames
para redirecionar a solicitação pelo proxy Envoy. O proxy então se conecta ao serviço Istio-Pilot (em inglês) para conseguir a lista de endpoints e encaminha a solicitação para o endpoint da malha apropriado depois de aplicar as regras.
Limpeza
Para evitar cobranças dos recursos usados neste tutorial na conta do Google Cloud Platform:
Se você não quiser continuar explorando o app BookInfo em A seguir, siga estas instruções:
Exclua os diversos balanceadores de carga internos usados pelo exemplo:
kubectl -n istio-system delete service --all kubectl -n kube-system delete service dns-ilb
Aguarde até que todos os balanceadores de carga sejam excluídos observando a saída deste comando:
gcloud compute forwarding-rules list
Exclua o cluster do contêiner:
gcloud container clusters delete [CLUSTER_NAME]
Exclua a VM do banco de dados:
gcloud compute instances delete istio-vm
A seguir
O site Istio (em inglês) contém mais guias e amostras com exemplos de uso totalmente funcionais do Istio. Isso inclui o seguinte:
Roteamento inteligente (em inglês). Neste exemplo, você verá como usar os diversos recursos de gerenciamento de tráfego do Istio com o BookInfo, inclusive as regras de roteamento usadas na última seção deste tutorial.
Telemetria detalhada (em inglês). Neste exemplo, você verá como conseguir métricas, registros e traces uniformes em todos os serviços do BookInfo usando o Istio Mixer e o proxy de arquivo secundário do Istio.