Como instalar o Istio

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

Visão geral

O [Istio](https://istio.io) (em inglês) é 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. Adicione o suporte do Istio aos serviços implantando um proxy sidecar do [Envoy](https://www.envoyproxy.io) (em inglês) especial em cada um dos pods 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.

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 o SDK do Cloud está instalado.

Instalar Helm

Para instalar o Istio, recomendamos o uso do Helm com um dos perfis configuráveis (links em inglês) do Istio.

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

do Istio.

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. O Istio só pode ser instalado em um cluster de usuário do GKE on-Prem, não em um cluster de administrador.
1. 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)](/kubernetes-engine/docs/role-based-access-control) para o Istio:
    kubectl create clusterrolebinding cluster-admin-binding \
      --clusterrole=cluster-admin \
      --user="$(gcloud config get-value core/account)"
    
Ainda que 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
    

Configurar namespace e certificado

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

Observação: verifique se você tem o Helm v2.*x* instalado. Atualmente, o Helm v3 não é compatível. Para conseguir o número da versão do Helm, execute: `helm version` Agora você está pronto para instalar o Istio. O Istio é instalado no namespace `istio-system` que você acabou de criar e pode gerenciar os 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. 1. 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 -
    
1. Aguarde alguns segundos para que todas as CRDs sejam confirmadas no servidor da API Kubernetes. 1. Instale o Istio com o [perfil](https://istio.io/docs/setup/kubernetes/additional-setup/config-profiles/) padrão (link em inglês). Mesmo que 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 -
    
Isso implanta os componentes principais do Istio (links em inglês): * [Istio-Pilot](https://istio.io/docs/concepts/what-is-istio/#pilot){:.external}, que é responsável para a descoberta de serviços e para configurar os proxies sidecar do Envoy em uma malha de serviço do Istio. * Os componentes do Istio-Policy e Istio-Telemetry do [Mixer](https://istio.io/docs/concepts/what-is-istio/#mixer){:.external}, que impõem políticas de uso e coletam dados de telemetria a malha de serviço. * [Istio-Ingressgateway](https://istio.io/docs/tasks/traffic-management/ingress.html){:.external}, que fornece um ponto de entrada para o tráfego de fora do cluster. * [Istio-Citadel](https://istio.io/docs/concepts/what-is-istio/#citadel){:.external}, que automatiza o gerenciamento de chaves e certificados do Istio.

Verificar a instalação do Istio

1. Implante os seguintes serviços do Kubernetes: `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. Implante os pods do Kubernetes correspondentes e coloque todos os contêineres em operaçã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 os valores de nodePort primeiro:

  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 para os gateways de istio é exibida. A resposta ao comando pode parecer desta forma:

     ...
     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. É possível 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, será possível tentar implantar um dos aplicativos de amostra fornecidos com a instalação. Neste tutorial, instalaremos o [BookInfo](https://istio.io/docs/guides/bookinfo.html) (em inglês). Este é 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. Encontre o código-fonte e todos os outros arquivos usados neste exemplo no diretório [samples/bookinfo](https://github.com/istio/istio/tree/master/samples/bookinfo) (em inglês) 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. 1. Implante o aplicativo usando `kubectl apply` e `istioctl kube-inject`. O comando `kube-inject` atualiza a implantação do BookInfo para que um arquivo secundário seja implantado em cada pod do aplicativo junto com o serviço.
    kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
    
1. Confirme se o aplicativo foi implantado corretamente executando os seguintes comandos:
kubectl get services
Saída:
    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
Saída:
    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
1. 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, tendo em vista que o configurou anteriormente. Por exemplo, se você usou 203.0.113.1 no seu 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. 1. Agora aponte seu navegador para `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 quiser tentar implantar um dos seus próprios aplicativos, basta seguir o mesmo procedimento com sua própria implantação YAML: o Istio não requer alterações no próprio 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 secundários ao implantar o aplicativo, como no nosso exemplo, ou ativar a [injeção automática de sidecars do Istio](/istio/docs/istio-on-gke/installing#enabling_sidecar_injection) para o namespace em que seu aplicativo está sendo executado.

Como desinstalar

  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.