Como usar o Istio com o Google Compute Engine

O Istio é uma biblioteca de código aberto para conectar, monitorar e proteger microsserviços. Ele permite que você crie uma rede de serviços implantados com balanceamento de carga, autenticação serviço a serviço, monitoramento e muito mais, sem que seja necessária qualquer alteração no código. Você agrega o suporte do Istio a serviços por meio da implantação de um proxy de arquivo secundário Envoy especial em cada pod do aplicativo. 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, mas seu recurso de expansão de malha 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 VM 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 VMs 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 Kubernetes Engine.

Saiba mais sobre o Istio e seu funcionamento acessando o site: istio.io. 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 Kubernetes Engine para usar a expansão da malha
  • Configurar VMs do Compute Engine para participar de uma malha de serviço do Istio
  • Executar um serviço de malha do Istio em uma VM do Compute Engine

Custos

Neste tutorial, há componentes do Cloud Platform passíveis de cobrança, incluindo o Google Compute Engine.

Novos usuários do Cloud Platform podem se qualificar para uma avaliação gratuita.

Antes de começar

  • Você precisa ter o Istio instalado no Kubernetes Engine. Descubra como fazer isso e quais são a configuração e os requisitos relevantes em Como instalar o Istio no Google Kubernetes Engine.
  • É preciso ter o aplicativo de amostra BookInfo instalado e ativo, também conforme descrito em Como instalar o Istio no Google Kubernetes Engine, além de ter istioctl em PATH.
  • Você precisa 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 não perder tempo digitando o código 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 us-central1-b

Como configurar a malha para expansão

O primeiro passo ao adicionar serviços que não são do Kubernetes 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 VMs do Compute Engine. O download do Istio inclui um script para ajudar com essa tarefa no Kubernetes Engine. Ele pode ser 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: essa é a máquina de administração de clusters.

  1. Use a implantação de mesh-expansion fornecida para configurar Balanceadores de carga internos para o Pilot, o Mixer, a autoridade de certificação do Istio e o servidor DNS do Kubernetes. Isso garantirá que esses serviços possam ser acessados pelas VMs.

    kubectl apply -f install/kubernetes/mesh-expansion.yaml
    
  2. Antes de prosseguir para a próxima etapa, 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 VMs. 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 de DNS que será utilizado nas VMs. Isso permitirá que os aplicativos na VM do Compute Engine resolvam nomes de serviço do cluster usando dnsmasq, 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 VMs do Compute Engine que participarão da malha, inclusive copiando os arquivos gerados nas VMs. Para a finalidade deste tutorial, você pode usar o script setupMeshEx.sh fornecido para copiar arquivos e configurar a máquina. No entanto, ao adicionar suas próprias VMs a um aplicativo de malha real, siga as etapas manualmente para integrá-las aos fluxos de trabalho e ao provisionamento. Você encontra as etapas detalhadas no guia Expansão da malha do Istio e pode consultar o script que o setupMeshEx.sh executa em cada VM em /install/tools/setupIstioVM.sh.

  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. Caso você não tenha VMs, crie uma:

    gcloud compute instances create istio-vm
    
  2. O Istio pode administrar serviços em vários namespaces do Kubernetes. Neste exemplo, você colocará o serviço de VM, mesmo que ele não esteja no Kubernetes, no namespace vm, porque as regras de roteamento BookInfo fornecidas buscarão esse serviço nele. O uso de diferentes namespaces como esse ajuda a manter os serviços de VM separados dos serviços regulares do Kubernetes. 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. Esta ação terá as seguintes consequências:

    • Os arquivos gerados e o script de instalação da VM serão copiados na VM.
    • As configurações de DNS serão definidas e verificadas para que a VM possa se conectar a componentes do Istio.
    • As chaves secretas de autenticação do Istio serão copiadas na VM.
    • Os arquivos Debian do Istio serão instalados 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 o gcloud ou qualquer uma das outras opções da página do console Detalhes da instância de VM, que você encontrará vinculada na página Instâncias de VMs:

    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 Kubernetes Engine. Por exemplo, se você estiver executando o exemplo do BookInfo mencionado em Como instalar o Istio no Google Kubernetes Engine 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

Agora, vamos ver o que você precisa para executar um serviço em uma máquina de expansão de malha. Neste exemplo, você estenderá o exemplo do BookInfo mencionado em Como instalar o Istio no Google Kubernetes Engine com um banco de dados de avaliações do MySQL executado em uma VM do Compute Engine, usando a VM que você configurou na última seção.

  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 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 ao adicionar 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 deverá usar 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 aplicativo 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 aplicativo na VM quer fazer uma solicitação a outro serviço na malha, ele precisa resolver o nome usando o DNS, 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 aplicativo de VM usa dnsmasq para resolver o nome, que redireciona todos os endereços .cluster.local para o Kubernetes. A configuração de dnsmasq também adiciona 127.0.0.1 a resolv.conf e, se necessário, configura o DHCP para inserir isso após cada DHCP resolvido.

Quando o aplicativo 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 para conseguir a lista de pontos de extremidade e encaminha a solicitação para o ponto de extremidade da malha apropriado depois de aplicar as regras.

Como fazer a limpeza

Para evitar cobranças dos recursos usados neste tutorial na conta do Google Cloud Platform:

Se você não quiser continuar explorando o aplicativo BookInfo em Próximas etapas, 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
    

Próximas etapas

O site Istio contém mais guias e amostras com exemplos de uso totalmente funcionais do Istio. São eles:

  • Roteamento inteligente: 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: 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