Você está visualizando a documentação de uma versão anterior do GKE On-Prem. Veja a documentação mais recente.

Como instalar o Istio

Nesta página, explicamos como instalar o Istio no cluster local do GKE on- Prem.

Visão geral

O Istio é um framework de código aberto para conectar, monitorar e proteger microsserviços, incluindo serviços em execução no GKE On-Prem. Ele permite que você crie uma rede 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 implantando um proxy sidecar especial do Envoy a cada um dos pods do aplicativo. O proxy do 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.

Este guia mostra como instalar e configurar o Istio no GKE On-Prem e implantar um aplicativo de demonstração de vários serviços habilitado para o Istio.

Antes de começar

Verifique se você instalou o SDK do Cloud.

Instalar Helm

Para instalar o Istio, recomendamos o uso do Helm com um dos perfis configuráveis do Istio.

Se você ainda não instalou o Helm, siga as instruções no README do Helm para instalar o binário helm na máquina em que as credenciais de cluster estão localizadas.

Permissões e credenciais

  1. Verifique se você tem credenciais kubectl para o cluster de usuário do GKE On-Prem em que quer instalar o Istio. Observe que o Istio só pode ser instalado em um cluster de usuário do GKE on-Prem, não em um cluster de administrador.

  2. Conceda permissões de administrador de cluster ao usuário atual. Você precisa dessas permissões para criar as regras necessárias de controle de acesso baseado em papéis (RBAC, na sigla em inglês) para o Istio:

    kubectl create clusterrolebinding cluster-admin-binding \
      --clusterrole=cluster-admin \
      --user="$(gcloud config get-value core/account)"
    

    Embora seja possível executar o aplicativo de demonstração sem conceder permissões de administrador de cluster, as permissões são necessárias para acessar dados de telemetria e outros recursos do Istio.

Fazer o download do Istio

Para o GKE On-Prem, recomendamos o uso da versão 1.1.13 do Istio.

Siga estas etapas na mesma máquina em que você tem as credenciais de cluster. Ou seja, na máquina de administração de clusters.

  1. Faça o download e expanda o pacote 1.1.13 do Istio no diretório atual usando o seguinte comando:

    curl -L https://github.com/istio/istio/releases/download/1.1.13/istio-1.1.13-linux.tar.gz | tar xz
    

    O diretório de instalação contém:

    • arquivos .yaml de instalação para Kubernetes em install/;
    • aplicativos de amostra em samples/;
    • o binário do cliente istioctl no diretório bin/. istioctl é usado ao injetar manualmente o Envoy como um proxy sidecar e para criar regras de roteamento e políticas;
    • o arquivo de configuração istio.VERSION.
  2. Altere para o diretório raiz da instalação e adicione istioctl ao PATH:

    cd  istio-1.1.13
    export PATH=$PATH:${PWD}/bin
    

Namespace e certificado de configuração

Ainda na máquina de administração de cluster, faça o seguinte para configurar o namespace istio-system para os componentes do plano de controle:

kubectl create namespace istio-system

Em seguida, copie o certificado raiz necessário no istio-system para o Citadel. Isso é necessário para clusters do GKE On-Prem:

kubectl get secret istio-ca-secret --namespace=kube-system --export -o yaml | kubectl apply --validate=false --namespace=istio-system -f -

Instalar o Istio

Agora está tudo pronto para instalar o Istio. O Istio é instalado no namespace istio-system que você acabou de criar e pode gerenciar microsserviços de todos os outros namespaces. A instalação inclui os principais componentes, ferramentas e amostras do Istio.

  1. Verifique se você está no diretório raiz da instalação do Istio.

  2. Instale as definições de recursos personalizados do Istio (CRDs, na sigla em inglês):

    helm template install/kubernetes/helm/istio-init \
      --name istio-init --namespace istio-system | kubectl apply -f -
    
  3. Aguarde alguns segundos para que todas as CRDs sejam confirmadas no servidor da API Kubernetes.

  4. Instale o Istio com o perfil padrão. Embora seja possível escolher outro perfil, recomendamos o perfil padrão para implantações de produção.

    helm template install/kubernetes/helm/istio \
      --name istio --namespace istio-system | kubectl apply -f -
    

    Implante os componentes principais do Istio:

    • Istio-Pilot, responsável pela descoberta do serviço e pela configuração dos proxies do arquivo secundário do Envoy em uma malha de serviço do Istio.
    • Os componentes do Mixer Istio-Policy e Istio-Telemetry, que reforçam as políticas de uso e reúnem dados de telemetria na malha de serviço.
    • Istio-Ingressgateway, que fornece um ponto de entrada para o tráfego de fora do cluster.
    • Istio-Citadel, que automatiza o gerenciamento de chaves e certificados para o Istio.

Verificar a instalação do Istio

  1. Certifique-se de que os seguintes serviços do Kubernetes sejam implantados: istio-citadel, istio-pilot, istio-ingressgateway, istio-policy e istio-telemetry. Você também verá os outros serviços implantados.

    kubectl get service -n istio-system
    
    Saída:
    NAME                       TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                               AGE
    ...
    istio-citadel              ClusterIP      10.19.253.95            8060/TCP,9093/TCP                                                     37s
    istio-galley               ClusterIP      10.19.245.2             443/TCP,15014/TCP,9901/TCP                                            37s
    istio-ingressgateway       LoadBalancer   10.19.247.233        80:31380/TCP,443:31390/TCP,31400:31400/TCP                            40s
    istio-pilot                ClusterIP      10.19.243.14            15003/TCP,15005/TCP,15007/TCP,15010/TCP,15011/TCP,8080/TCP,9093/TCP   38s
    istio-policy               ClusterIP      10.19.254.117           9091/TCP,15004/TCP,9093/TCP                                           39s
    istio-sidecar-injector     ClusterIP      10.19.248.228           443/TCP                                                               37s
    istio-statsd-prom-bridge   ClusterIP      10.19.252.35            9102/TCP,9125/UDP                                                     39s
    istio-telemetry            ClusterIP      10.19.250.11            9091/TCP,15004/TCP,9093/TCP,42422/TCP                                 39s
    ...
  2. Certifique-se de que os pods do Kubernetes correspondentes foram implantados e que todos os contêineres estejam em execução: istio-pilot-*, istio-policy-*, istio-telemetry-*, istio-ingressgateway-* e istio-citadel-*.

    kubectl get pods -n istio-system
    
    Saída:
    NAME                                        READY     STATUS      RESTARTS   AGE
    istio-citadel-54f4678f86-4549b              1/1       Running     0          12m
    istio-cleanup-secrets-5pl77                 0/1       Completed   0          12m
    istio-galley-7bd8b5f88f-nhwlc               1/1       Running     0          12m
    istio-ingressgateway-665699c874-l62rg       1/1       Running     0          12m
    istio-pilot-68cbbcd65d-l5298                2/2       Running     0          12m
    istio-policy-7c5b5bb744-k6vm9               2/2       Running     0          12m
    istio-security-post-install-g9l9p           0/1       Completed   3          12m
    istio-sidecar-injector-85ccf84984-2hpfm     1/1       Running     0          12m
    istio-telemetry-5b6c57fffc-9j4dc            2/2       Running     0          12m
    istio-tracing-77f9f94b98-jv8vh              1/1       Running     0          12m
    prometheus-7456f56c96-7hrk5                 1/1       Running     0          12m
    ...

Configurar um endereço IP externo

A instalação padrão do Istio pressupõe que um endereço IP externo é alocado automaticamente para serviços LoadBalancer. Isso não é verdade nos clusters do GKE On-Prem. Por isso, você precisa alocar um endereço IP manualmente para o recurso Gateway de entrada do Istio.

Para configurar um endereço IP externo, siga uma das seções abaixo, dependendo do modo de balanceamento de carga do cluster:

Modo de balanceamento de carga integrado

  1. Abra a configuração do serviço istio-ingressgateway:

    kubectl edit svc -n istio-system istio-ingressgateway
    

    A configuração do serviço istio-ingressgateway é aberta no editor de texto padrão do shell.

  2. No arquivo, adicione a seguinte linha no bloco de especificação (spec):

    loadBalancerIP: <your static external IP address>
    

    Exemplo:

    spec:
     loadBalancerIP: 203.0.113.1
    
  3. Salve o arquivo.

Modo de balanceamento de carga manual

Para expor um serviço do tipo NodePort com um VIP no balanceador de carga selecionado, você precisa descobrir primeiro os valores de nodePort:

  1. Veja a configuração do serviço istio-ingressgateway no shell:

    kubectl get svc -n istio-system istio-ingressgateway -o yaml
    

    Cada uma das portas dos gateways do Istio será exibida. A resposta ao comando pode parecer com a seguinte:

     ...
     ports:

    • name: status-port nodePort: 30391 port: 15020 protocol: TCP targetPort: 15020
    • name: http2 nodePort: 31380 port: 80 protocol: TCP targetPort: 80
    • name: https nodePort: 31390 port: 443 protocol: TCP targetPort: 443
    • name: tcp nodePort: 31400 port: 31400 protocol: TCP targetPort: 31400
    • name: https-kiali nodePort: 31073 port: 15029 protocol: TCP targetPort: 15029
    • name: https-prometheus nodePort: 30253 port: 15030 protocol: TCP targetPort: 15030
    • name: https-grafana nodePort: 30050 port: 15031 protocol: TCP targetPort: 15031
    • name: https-tracing nodePort: 31204 port: 15032 protocol: TCP targetPort: 15032
    • name: tls nodePort: 30158 port: 15443 protocol: TCP targetPort: 15443 ...
  2. Exponha essas portas pelo balanceador de carga.

    Por exemplo, a porta de serviço chamada http2 tem port 80 e nodePort 31380. Suponha que os endereços de nó do cluster de usuário sejam 192.168.0.10, 192.168.0.11 e 192.168.0.12, e o VIP do balanceador de carga seja 203.0.113.1.

    Configure o balanceador de carga para que o tráfego enviado para 203.0.113.1:80 seja encaminhado para 192.168.0.10:31380, 192.168.0.11:31380 ou 192.168.0.12:31380. Você pode selecionar as portas de serviço que quer expor nesse VIP.

Implantar o aplicativo de amostra

Depois que o Istio estiver instalado e todos os componentes estiverem em execução, você poderá tentar implantar um dos aplicativos de amostra fornecidos com a instalação. Neste tutorial, instalaremos o BookInfo. Trata-se de um aplicativo simples de simulação de uma livraria, composto por quatro serviços que oferecem uma página de produto da Web, detalhes do livro, análises (com várias versões do serviço de análise) e classificações, tudo gerenciado com o Istio. Você pode encontrar o código-fonte e todos os outros arquivos usados neste exemplo no diretório samples/bookinfo da instalação do Istio.

Siga as etapas abaixo para implantar os serviços do aplicativo BookInfo em um ambiente ativado para o Istio, com os proxies de arquivo secundário do Envoy injetados junto com cada serviço para fornecer a funcionalidade do Istio.

  1. Verifique se você ainda está na raiz do diretório de instalação do Istio na máquina de administração de clusters.

  2. Implante o aplicativo usando kubectl apply e istioctl kube-inject. O comando kube-inject atualiza a implantação do BookInfo para que um arquivo sidecar seja implantado em cada pod de aplicativo junto com o serviço.

    kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
    
  3. Confirme se o aplicativo foi implantado corretamente executando os seguintes comandos:

    kubectl get services
    Resposta:
    NAME                       CLUSTER-IP   EXTERNAL-IP   PORT(S)              AGE
    details                    10.0.0.31    <none>        9080/TCP             6m
    kubernetes                 10.0.0.1     <none>        443/TCP              7d
    productpage                10.0.0.120   <none>        9080/TCP             6m
    ratings                    10.0.0.15    <none>        9080/TCP             6m
    reviews                    10.0.0.170   <none>        9080/TCP             6m

    e

    kubectl get pods
    Resposta:
    NAME                                        READY     STATUS    RESTARTS   AGE
    details-v1-1520924117-48z17                 2/2       Running   0          6m
    productpage-v1-560495357-jk1lz              2/2       Running   0          6m
    ratings-v1-734492171-rnr5l                  2/2       Running   0          6m
    reviews-v1-874083890-f0qf0                  2/2       Running   0          6m
    reviews-v2-1343845940-b34q5                 2/2       Running   0          6m
    reviews-v3-1813607990-8ch52                 2/2       Running   0          6m
  4. Finalmente, defina o roteamento do gateway de entrada para o aplicativo:

    kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
    

Validar a implantação do aplicativo

Agora que ele está implantado, vamos dar uma olhada no aplicativo BookInfo em ação. Você já sabe o endereço IP externo do gateway de entrada porque o configurou anteriormente. Por exemplo, se você usou 203.0.113.1 como o IP externo:

export GATEWAY_URL=203.0.113.1

Como testar o aplicativo

  1. Verifique se o aplicativo BookInfo está sendo executado com curl:

    curl -I http://${GATEWAY_URL}/productpage
    

    Se a resposta mostrar 200, significa que o aplicativo está funcionando corretamente com o Istio.

  2. No navegador, acesse http://$GATEWAY_URL/productpage para visualizar a página da Web do BookInfo. Se você atualizar a página várias vezes, verá diferentes versões de análises exibidas na página do produto, apresentadas em estilo round robin (estrelas vermelhas, estrelas pretas, sem estrelas), já que ainda não usamos o Istio para controlar o roteamento de versões.

Como implantar seu próprio aplicativo

Se você quiser tentar implantar um dos seus próprios aplicativos, siga o mesmo procedimento com sua própria implantação YAML. O Istio não exige mudanças no aplicativo. Observe que o aplicativo precisa usar o protocolo HTTP/1.1 ou HTTP/2.0 para todo o tráfego HTTP, porque o proxy Envoy não é compatível com HTTP/1.0. Ele depende de cabeçalhos que não estão presentes no HTTP/1.0 para o roteamento.

É possível usar kube-inject para adicionar os arquivos sidecar ao implantar o aplicativo, como no nosso exemplo, ou ativar a injeção automática de arquivos secundários do Istio para o namespace em que o aplicativo está em execução.

Desinstalando

  1. Use o seguinte comando para desinstalar os componentes do Istio:

    helm template install/kubernetes/helm/istio --name istio --namespace istio-system | kubectl delete -f -
    
  2. Em seguida, exclua o namespace istio-system:

    kubectl delete namespace istio-system
    

A seguir

Saiba mais sobre o Istio no site do Istio e na documentação do Istio do Google Cloud Platform.