Como instalar o Istio no GKE

Neste guia, mostramos como começar a usar o complemento Istio no GKE, incluindo opções de instalação para clusters novos e atuais. É possível instalar o complemento usando a ferramenta de linha de comando gcloud ou o Console do Google Cloud .

Saiba mais sobre o complemento Istio no GKE e se ele é adequado para você na Visão geral.

Antes de começar

Siga estas etapas para ativar a API do Kubernetes Engine:

  1. Acesse a página do Kubernetes Engine no Console do Google Cloud.
  2. Crie ou selecione um projeto.
  3. Aguarde a ativação da API e dos serviços relacionados. Isso pode levar alguns minutos.
  4. Verifique se o faturamento está ativado para seu projeto na nuvem. Saiba como confirmar se o faturamento está ativado para o projeto.

Verifique se você tem as seguintes ferramentas de linha de comando instaladas:

  • gcloud é usado para criar e excluir clusters do Kubernetes Engine, incluindo a criação e atualização de clusters com o complemento Istio no GKE. gcloud está incluído no SDK do Google Cloud. Siga as instruções para instalar e inicializá-lo com seus projetos do GCP. Se você já tem uma instalação do gcloud, verifique se ela tem pelo menos a versão 208.0.0:
    gcloud version
    Não é necessário instalar o app.gcloud para criar um novo cluster compatível com Istio, como você pode usar o Console do Google Cloud , mas ainda é útil para gerenciar clusters atuais e instalar outras ferramentas, comokubectl para começar.
  • kubectl é usado para gerenciar o Kubernetes, sistema de orquestração de cluster usado pelo GKE. É possível instalar kubectl usando gcloud:
    gcloud components install kubectl

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

Escolha uma opção de segurança

Há duas opções de segurança padrão para toda a malha, que podem ser escolhidas ao criar ou atualizar um cluster com o Istio no GKE. A escolha depende das necessidades iniciais do seu aplicativo.

  • mTLS restrito: neste modo de segurança, por padrão, o Istio aplica a criptografia mútua TLS (mTLS) a todos os serviços e componentes do plano de controle na malha, a menos que você estabeleça regras de destinação específicas. Todas as chamadas na malha serão criptografadas e os serviços não aceitam tráfego não criptografado.
  • mTLS permissivo: nesse modo de segurança, por padrão, o Istio permite que os serviços da malha aceitem tráfego criptografado e não criptografado e permite que todos os serviços enviem chamadas não criptografadas por padrão. Assim como no mTLS restrito, é possível modificar isso para serviços específicos. Use essa opção se você tiver serviços que ainda precisam aceitar tráfego não criptografado. Por exemplo, se não tiver migrado completamente seus serviços para o Istio e tiver tráfego proveniente de clientes legados fora da malha. O Istio no GKE oferece esse modo em vez de simplesmente instalar o Istio sem segurança ativada. Isso facilita a migração para o mTLS restrito mais tarde, afim de aumentar a segurança.

Descubra como atualizar os padrões de segurança e configurar ainda mais a segurança do Istio em Como atualizar padrões de segurança, abaixo.

Versões de cluster do GKE compatíveis

A versão do Istio no GKE instalada quando você cria ou atualiza um cluster com ele depende da versão do cluster. Recomendamos usar uma versão de cluster com a versão mais recente do Istio (1.4.10-gke.5). Se estiver usando uma versão mais antiga, faça upgrade do cluster assim que esta versão do Istio no GKE estiver disponível.

Para ver a lista de versões compatíveis, consulte Versões do Istio no GKE.

Como instalar o Istio no GKE

É possível instalar o Istio no GKE em clusters novos ou existentes. Em ambos os casos, o plano de controle do Istio será instalado. Para aproveitar ao máximo os recursos do Istio, é necessário injetar proxies sidecar do Envoy nos pods da malha de serviço.

Como criar um cluster com o Istio no GKE

Sugerimos a criação de pelo menos um cluster de quatro nós com o tipo de máquina de duas vCPUs ao usar esse complemento. É possível implantar o próprio Istio com a nova configuração de cluster padrão do GKE, mas isso talvez não forneça recursos suficientes para explorar os aplicativos de amostra. Observe que o complemento do Istio no GKE não é compatível com a identidade da carga de trabalho.

Para criar um cluster usando o Istio no GKE:

Console

  1. Acesse a página do Kubernetes no Console do Cloud e selecione Criar cluster.
  2. Na caixa de diálogo Cluster padrão, escolha o número preferido de nós e máquinas, considerando o tamanho mínimo recomendado para o cluster do Istio.
  3. No menu suspenso Versão principal, selecione a versão recomendada do cluster do Istio no GKE ou uma versão compatível se você não puder usá-la.
  4. Selecione Disponibilidade, rede, segurança e outros recursos para exibir outras opções de configuração, incluindo o Istio no GKE.
  5. Selecione Ativar Istio (Beta).
  6. Na lista suspensa, selecione o modo de segurança mTLS que você quer usar para seu cluster.
  7. Clique em Criar para criar o cluster.

Linha de comando

Para criar um cluster do GKE com Istio ativado e o TLS mútuo aplicado por padrão, execute este comando, substituindo CLUSTER_NAME pelo nome do cluster escolhido e CLUSTER_VERSION por uma versão compatível do cluster:

gcloud beta container clusters create CLUSTER_NAME \
    --addons=Istio --istio-config=auth=MTLS_STRICT \
    --cluster-version=CLUSTER_VERSION \
    --machine-type=n1-standard-2 \
    --num-nodes=4

Ou crie um cluster do GKE com o Istio ativado e com o mTLS no modo permissivo:

gcloud beta container clusters create CLUSTER_NAME \
    --addons=Istio --istio-config=auth=MTLS_PERMISSIVE \
    --cluster-version=CLUSTER_VERSION \
    --machine-type=n1-standard-2 \
    --num-nodes=4

Como adicionar o Istio no GKE a um cluster existente

Se quiser atualizar um cluster com o complemento, talvez seja necessário redimensionar o cluster primeiro afim de garantir que haja recursos suficientes para o Istio. Como na criação de um novo cluster, sugerimos pelo menos um cluster de quatro nós com o tipo de máquina de duas vCPUs.

Seu cluster também precisa executar uma versão compatível do mestre do cluster para usar o complemento. O complemento do Istio no GKE não é compatível com a identidade da carga de trabalho.

Para atualizar um cluster existente com o complemento Istio no GKE:

Console

  1. Acesse a página de clusters do Kubernetes no Console do Cloud e selecione aquele que você quer atualizar.
  2. Selecione Editar.
  3. Em Istio (beta), selecione Ativado para exibir Istio mTLS (beta).
  4. Na lista suspensa, selecione o modo de segurança mTLS que você quer usar para seu cluster.
  5. Clique em Salvar para atualizar seu cluster.

Linha de comando

Para adicionar o Istio com TLS mútuo aplicado por padrão a um cluster atual execute este comando, substituindo CLUSTER_NAME pelo nome do cluster:

gcloud beta container clusters update CLUSTER_NAME \
    --update-addons=Istio=ENABLED --istio-config=auth=MTLS_STRICT

Ou para adicionar o Istio com o mTLS no modo permissivo a um cluster existente:

gcloud beta container clusters update CLUSTER_NAME \
    --update-addons=Istio=ENABLED --istio-config=auth=MTLS_PERMISSIVE

O comando clusters update pode exigir outros parâmetros, dependendo da configuração real do cluster.

Se tiver um aplicativo existente no cluster, acesse a documentação do Istio e saiba como migrá-lo para que ele seja gerenciado pelo Istio.

Verificando a instalação

Para verificar se a instalação do Istio no GKE foi bem-sucedida:

  1. Se você acabou de criar (em vez de atualizar) um cluster, verifique se ele está instalado e sendo executado com uma versão do GKE 1.10.6 ou superior:
    gcloud container clusters list
    
    A resposta será semelhante a:
    NAME        LOCATION       MASTER_VERSION  MASTER_IP      MACHINE_TYPE   NODE_VERSION   NUM_NODES  STATUS
    istio-demo  us-central1-b  1.11.2-gke.15   35.239.252.38  n1-standard-2  1.11.2-gke.15  4          RUNNING
    
  2. Consiga as credenciais do novo cluster para interagir com ele com kubectl.
    gcloud container clusters get-credentials CLUSTER_NAME
    
  3. Certifique-se de que os seguintes serviços do Kubernetes sejam implantados: istio-citadel, istio-egressgateway, istio-pilot, istio-ingressgateway, istio-policy, istio-sidecar-injector e istio-telemetry (você também verá os outros serviços implantados):
    kubectl get service -n istio-system
    
    NAME                       TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                                                                                   AGE
    istio-citadel              ClusterIP      10.47.245.92    <none>        8060/TCP,9093/TCP                                                                                                         12s
    istio-egressgateway        ClusterIP      10.47.248.129   <none>        80/TCP,443/TCP                                                                                                            12s
    istio-galley               ClusterIP      10.47.248.109   <none>        443/TCP,9093/TCP                                                                                                          12s
    istio-ingressgateway       LoadBalancer   10.47.248.117   <pending>     80:31380/TCP,443:31390/TCP,31400:31400/TCP,15011:30221/TCP,8060:32445/TCP,853:30663/TCP,15030:32010/TCP,15031:32633/TCP   12s
    istio-pilot                ClusterIP      10.47.251.133   <none>        15010/TCP,15011/TCP,8080/TCP,9093/TCP                                                                                     12s
    istio-policy               ClusterIP      10.47.255.244   <none>        9091/TCP,15004/TCP,9093/TCP                                                                                               12s
    istio-sidecar-injector     ClusterIP      10.47.240.36    <none>        443/TCP                                                                                                                   12s
    istio-statsd-prom-bridge   ClusterIP      10.47.247.135   <none>        9102/TCP,9125/UDP                                                                                                         12s
    istio-telemetry            ClusterIP      10.47.242.73    <none>        9091/TCP,15004/TCP,9093/TCP,42422/TCP                                                                                     12s
    promsd                     ClusterIP      10.47.241.188   <none>        9090/TCP                                                                                                                  12s
    
  4. 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-egressgateway-*, istio-ingressgateway-* istio-sidecar-injector-* e istio-citadel-*.

    kubectl get pods -n istio-system
    
    NAME                                        READY   STATUS      RESTARTS   AGE
    istio-citadel-555d845b65-xfdmj              1/1     Running     0          2d
    istio-cleanup-secrets-8x2pl                 0/1     Completed   0          2d
    istio-egressgateway-667d854c49-9q5dl        1/1     Running     0          2d
    istio-galley-6c9cd5b8bb-4j4jk               1/1     Running     0          2d
    istio-ingressgateway-6c796c5594-f972p       1/1     Running     0          2d
    istio-pilot-77f74fc6f-rpbfj                 2/2     Running     0          2d
    istio-policy-655b87fff-4wbwq                2/2     Running     0          2d
    istio-security-post-install-tm2rm           0/1     Completed   1          2d
    istio-sidecar-injector-668c9fb4db-p6lwt     1/1     Running     0          2d
    istio-statsd-prom-bridge-5b645f6f4d-6pbgf   1/1     Running     0          2d
    istio-telemetry-d9848f498-wf6kh             2/2     Running     0          2d
    promsd-6b989699d8-l7jxt                 1/1     Running     0          2d
    

Como ativar a injeção do sidecar

Para aproveitar ao máximo os recursos do Istio, cada serviço no aplicativo precisa ter um proxy sidecar do Envoy em execução no pod. O proxy Envoy intercepta todo o tráfego de entrada e saída para o serviço e se comunica com o plano de controle do Istio. É possível injetar um proxy Envoy manualmente atualizando a configuração do Kubernetes dos pods ou usando a injeção de arquivo secundário automática baseada em webhooks do Istio.

Por padrão, a injeção automática de sidecar fica desativada para todos os namespaces. Para ativar a injeção automática, substitua NAMESPACE no seguinte comando pelo nome do namespace para os serviços do aplicativo ou por default:

kubectl label namespace NAMESPACE istio-injection=enabled

Todos os pods em execução precisam ser reiniciados para que a alteração entre em vigor, já que o sidecar é adicionado no momento da criação do pod. Para desativar a injeção automática no namespace, remova o rótulo e reinicie os pods para excluir os sidecars.

Para injetar sidecars do Envoy manualmente, consulte Como instalar o sidecar.

Como configurar seu plano de controle

Embora o Istio no GKE gerencie a maioria das configurações do plano de controle, para uso na produção, recomendamos escolher e especificar os valores apropriados ao seu caso de uso nas configurações a seguir. É possível alterá-los usando kubectl ou as ferramentas do Kubernetes de sua escolha. Essas configurações não são alteradas quando a instalação é atualizada pelo complemento.

Escalonamento horizontal

Configure um dos itens a seguir para garantir que você tenha réplicas suficientes dos componentes do plano de controle do Istio para lidar com o tráfego da sua malha. Para uso em produção, recomendamos, no mínimo, duas réplicas para istio-policy, istio-telemetry, istio-pilot e istio-sidecar-injector.

  • O escalonamento horizontal automático de pod escalona automaticamente o número de réplicas com base na utilização da CPU observada. Fornecemos valores máximos e mínimos padrão para os componentes do plano de controle de escalonamento automático, mas é possível editá-los para atender às suas necessidades. Por exemplo, veja como especificar um kubectl edit no qual você quer editar as configurações do escalonador automático para Istio-Telemetry:

    kubectl edit -n istio-system HorizontalPodAutoscalers/istio-telemetry
    
  • Se não estiver usando o escalonamento automático, poderá definir o número de réplicas de cada elemento do plano de controle (exceto o Citadel, que é sempre um singleton) para escalonamento horizontal manual. Por exemplo, veja como especificar um kubectl para o qual você quer duas instâncias do Pilot:

    kubectl scale -n istio-system --replicas=2 deployment/istio-pilot
    

Solicitações de recursos

Por padrão, as solicitações de recursos não são definidas. No entanto, para uso em produção, recomendamos defini-las com valores apropriados para garantir que os nós tenham recursos suficientes para suportar os pods. Defina solicitações de recursos para cada contêiner no pod. Caso contrário, a CPU dos HPAs mostrará unknown, e o escalonamento automático não funcionará.

Consulte o guia Opções de instalação do Istio para ver os pontos de partida recomendados para as configurações de recursos de cada componente. Por exemplo, as solicitações e os limites de recursos do Mixer estão em opções mixer.

kubectl edit -n istio-system Deployments/istio-telemetry

Orçamento de interrupção de pod

PodDisruptionBudgets: permite especificar o número mínimo de réplicas disponíveis de uma determinada implantação que um aplicativo pode tolerar e continuar trabalhando.

Configure PodDisruptionBudgets em todas as implantações que precisam permanecer disponíveis durante os upgrades do Istio no GKE. No mínimo, recomendamos fazer isso para o gateway de entrada Istio fornecido pelo complemento (istio-ingressgateway), se não tiver implantado e configurado seu próprio gateway de entrada. Caso contrário, o tráfego externo pode não conseguir alcançar seu aplicativo durante o upgrade.

As configurações de orçamento de interrupção de pod devem ser definidas com as configurações de escalonamento horizontal, conforme descrito acima. O número de réplicas ou de réplicas mínimas do escalonador automático precisa ser maior que o orçamento mínimo de interrupção do pod, porque o processo de upgrade do Istio no GKE torna as réplicas individuais indisponíveis enquanto são atualizadas. Isso garante que a configuração minAvailable em PodDisruptionBudget não seja violada durante os upgrades e que o ele funcione conforme esperado.

Como personalizar sua instalação

Embora o Istio no GKE forneça um comportamento padrão razoável para muitos casos de uso, é possível personalizar a instalação de várias maneiras, incluindo a configuração de ferramentas de telemetria e a adição de gateways. Nesta seção, você verá como fazer personalizações compatíveis.

Como atualizar padrões de segurança

Alternar o modo de segurança mTLS padrão do Istio em um cluster em execução de Restrito para Permissivo (ou vice-versa) usa o mesmo comando que adiciona o Istio a um cluster:

Console

  1. Acesse a página de clusters do Kubernetes no Console do Cloud e selecione aquele que você quer atualizar.
  2. Selecione Editar.
  3. Em Istio (beta), selecione Ativado para exibir Istio mTLS (beta).
  4. Na lista suspensa, selecione o modo de segurança mTLS que você quer usar para seu cluster.
  5. Clique em Salvar para atualizar seu cluster.

Linha de comando

Se quiser alterar seu cluster para usar o Istio com o TLS mútuo aplicado por padrão, execute este comando, substituindo CLUSTER_NAME pelo nome do cluster:

$ gcloud beta container clusters update CLUSTER_NAME \
    --update-addons=Istio=ENABLED --istio-config=auth=MTLS_STRICT

Ou altere o cluster para mTLS no modo permissivo:

$ gcloud beta container clusters update CLUSTER_NAME \
    --update-addons=Istio=ENABLED --istio-config=auth=MTLS_PERMISSIVE

Lembre-se de que, se você ativar o mTLS restrito enquanto ainda tiver serviços que precisem enviar ou receber tráfego não criptografado, seu aplicativo poderá ser interrompido! Saiba mais sobre a migração para o mTLS restrito em Migração de TLS mútuo. Também é possível selecionar políticas de autenticação mais específicas para o destino. As políticas de autenticação específicas para o destino sempre substituirão uma configuração mTLS padrão global, mesmo se você trocar de Restrito para Permissivo ou vice-versa.

Descubra mais sobre a configuração e o trabalho com a segurança do Istio, incluindo a configuração da autorização baseada em papéis, no site do Istio.

Rastreamento e geração de registros

Por padrão, uma malha instalada com o Istio no GKE pode enviar dados de geração de registros e métricas para o Cloud Logging e o Cloud Monitoring, desde que você tenha ativado os recursos relevantes para o projeto e cluster. As versões do Istio no GKE anteriores à 1.1.7 também enviam dados de rastreamento por padrão. Saiba mais sobre isso na seção Suporte ao pacote de operações do Google Cloud.

O rastreamento e a geração de registros podem gerar custos extras, especialmente com um grande volume de dados provenientes da malha. Se quiser desativar esse recurso sem desativar as APIs do pacote de operações do Google Cloud para seu projeto como um todo, atualize a configuração do Istio no GKE da seguinte maneira.

Para desativar o Cloud Logging no Istio no GKE

  1. Abra a regra stackdriver-log para edição:

    kubectl edit -n istio-system rule stackdriver-log
    
  2. Substitua a condição match (context.protocol == "http" || context.protocol == "grpc") && (context.reporter.kind | "inbound" == "inbound") por "false".

  3. Salve e feche a regra.

  4. Abra a regra stackdriver-log-tcp.

    kubectl edit -n istio-system rule stackdriver-log-tcp
    
  5. Substitua a condição match (context.protocol == "tcp") && (context.reporter.kind | "inbound" == "inbound") por "false".

  6. Salve e feche a regra.

Para desativar o rastreamento do pacote de operações do Google Cloud no Istio no GKE

Se você tiver o Istio na versão 1.1.3-gke.0 ou anterior ou se tiver ativado manualmente o rastreamento do pacote de operações do Google Cloud, poderá desativá-lo da seguinte maneira:

  1. Abra a regra stackdriver-tracing-rule para edição:

    kubectl edit -n istio-system rule stackdriver-tracing-rule
    
  2. Substitua a condição match context.protocol == "http" || context.protocol == "grpc" por "false".

  3. Salve e feche a regra.

Para ativar o rastreamento do pacote de operações do Google Cloud no Istio no GKE

Se você estiver usando a versão 1.1.7 ou posterior e quiser ativar o rastreamento do pacote de operações do Google Cloud:

  1. Verifique se a API Cloud Trace está ativada no projeto do Google Cloud.

  2. Abra a regra stackdriver-tracing-rule para edição:

    kubectl edit -n istio-system rule stackdriver-tracing-rule
    
  3. Substitua a condição match "false" por context.protocol == "http" || context.protocol == "grpc".

  4. Salve e feche a regra.

Como adicionar gateways

Um gateway de entrada é fornecido como parte da instalação do Istio no GKE. O gateway de entrada padrão é adequado para implantações em que os recursos instalados (RBAC, serviço, implantação) não precisam de muita personalização. É possível adicionar campos à configuração do gateway do Istio e modificar as seguintes configurações do plano de controle:

  • Escalonamento horizontal
  • Solicitações de recursos
  • Orçamentos de interrupção do pod

Quando você faz upgrade do GKE, o complemento Istio on GKE e todos os recursos instalados por ele, incluindo o gateway de entrada padrão, são atualizados automaticamente. Não altere outros valores na configuração do gateway de entrada padrão porque as alterações serão revertidas para os valores padrão durante o upgrade automático.

Para cenários mais complexos em que a personalização é necessária, é preciso criar um novo gateway de entrada. Se você adicionar um gateway de entrada ou saída, eles estarão sob seu controle e não serão modificados durante o upgrade automático.

Um gateway de saída do Istio não é instalado por padrão na versão 1.1 e posteriores. Para adicionar um gateway de entrada ou saída:

  1. Conceda permissões de administrador de cluster ao usuário atual:

    1. Defina sua conta de usuário como a atual.

      gcloud auth login
    2. Conceda permissões de administrador de cluster ao usuário atual.

      kubectl create clusterrolebinding cluster-admin-binding \
      --clusterrole=cluster-admin \
      --user="$(gcloud config get-value core/account)"
      
  2. Siga as etapas em Como adicionar gateways para adicionar o gateway.

Como acessar serviços externos

Todo o tráfego de saída de um pod ativado para o Istio é redirecionado para o proxy de sidecar. Por padrão, o Istio configura o proxy sidecar para transmitir solicitações de serviços desconhecidos, mas é possível configurar um controle mais rigoroso. Embora você possa criar ServiceEntries afim de autorizar solicitações de saída para destinos permitidos, é ainda possível, por razões de segurança, adicionar um gateway de saída, conforme descrito na postagem do blog Controle seguro do tráfego de saída no Istio.

A seguir

  • Instale e explore o exemplo do Bookinfo para ver o que o Istio pode fazer. Para ter o app de amostra e a ferramenta istioctl, vá para a página Versão do Istio e faça download do arquivo de instalação correspondente ao sistema operacional em que você está executando os comandos. Em seguida, siga as instruções para implantar e testar o aplicativo (não é necessário implantar o Istio) no Tutorial como instalar o Istio do GKE.
  • Saiba mais sobre o Istio na documentação de código aberto.
  • Se precisar remover o complemento do Istio de um cluster, consulte Como desinstalar o Istio no GKE.