Como usar o Istio com o Google Compute Engine

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 em PATH.
  • É 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.

  1. 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
    
  2. 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
  3. 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
  4. 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).

  1. 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
    
  2. 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ável SERVICE_NAMESPACE:

    export SERVICE_NAMESPACE=vm
    

    Em seguida, crie o namespace:

    kubectl create namespace $SERVICE_NAMESPACE
    
  3. 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
  4. 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
    
  5. 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 com curl 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}
  6. 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.

  7. 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

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.

  1. 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.

  2. Instale um servidor MySQL na VM do Compute Engine:

    sudo apt-get update && sudo apt-get install --no-install-recommends -y mariadb-server
    
  3. 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"
    
  4. 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
    
  5. 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 use hostname --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}]
  6. 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
  7. 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
    
  8. 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"
    

    Avaliações atualizadas na IU

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:

  1. 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
    
  2. Aguarde até que todos os balanceadores de carga sejam excluídos observando a saída deste comando:

    gcloud compute forwarding-rules list
    
  3. Exclua o cluster do contêiner:

    gcloud container clusters delete [CLUSTER_NAME]
    
  4. 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.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Documentação do Compute Engine