Revisões do plano de controle do Cloud Service Mesh

Esta página descreve como as revisões do plano de controle funcionam e o valor para usá-las para upgrades seguros de malha de serviço (e reversões).

Princípios básicos da instalação da malha de serviço

De modo geral, a instalação do Cloud Service Mesh consiste em duas fases principais:

  1. Primeiro, use a ferramenta asmcli para instalar um plano de controle no cluster. O plano de controle consiste em um conjunto de serviços do sistema responsáveis por gerenciar a configuração da malha.

  2. Em seguida, você implanta um proxy sidecar especial em todo o ambiente, que intercepta a comunicação de rede de e para cada carga de trabalho. Os proxies se comunicam com o plano de controle para conseguir a configuração deles. Isso permite que você direcione e controle o tráfego (tráfego do plano de dados) na sua malha sem fazer nenhuma alteração nas cargas de trabalho.

    Para implantar os proxies, use um processo chamado injeção automática de arquivo secundário (injeção automática) para executar um proxy como um contêiner de arquivo secundário em cada um dos pods de carga de trabalho. Você não precisa modificar os manifestos do Kubernetes usados para implantar suas cargas de trabalho, mas é necessário adicionar um rótulo aos namespaces e reiniciar os pods.

Use revisões para fazer o upgrade da malha de maneira segura

A capacidade de controlar o tráfego é um dos principais benefícios do uso de uma malha de serviço. Por exemplo, é possível alterar gradualmente o tráfego para uma nova versão de um aplicativo quando implantá-lo pela primeira vez na produção. Se você detectar problemas durante o upgrade, será possível reverter o tráfego para a versão original, oferecendo um meio de reversão simples e de baixo de risco. Esse procedimento é conhecido como versão canário e reduz drasticamente o risco associado a novas implantações.

Usando revisões do plano de controle em um upgrade canário, você instala um plano de controle novo e separado e a configuração junto com o plano de controle atual. O instalador atribui uma string chamada de revisão para identificar o novo plano de controle. Inicialmente, os proxies sidecar continuam a receber a configuração da versão anterior do plano de controle. Associe gradualmente as cargas de trabalho ao novo plano de controle ao rotular os namespaces com a nova revisão do plano de controle. Depois de rotular um namespace ou pods com a nova revisão, você reinicia os pods de carga de trabalho para que novos arquivos secundários sejam injetados automaticamente e eles recebam a configuração do novo plano de controle. Se houver problemas, é possível reverter o processo associando as cargas de trabalho ao plano de controle original.

Como funciona a injeção automática?

A injeção automática usa um recurso do Kubernetes chamado controle de admissão. Um webhook de admissão mutável é registrado para observar os pods recém-criados. O webhook é configurado com um seletor de namespace para que ele corresponda apenas aos pods que estão sendo implantados em namespaces com um rótulo específico. Quando um pod corresponde, o webhook consulta um serviço de injeção fornecido pelo plano de controle para conseguir uma nova configuração modificada para o pod, que contém os contêineres e volumes necessários para executar o arquivo secundário.

injetor de arquivo secundário

  1. A configuração de um webhook é criada durante a instalação. O webhook é registrado no servidor da API Kubernetes.
  2. O servidor da API Kubernetes observa implantações de pod em namespaces que correspondem ao webhook namespaceSelector.
  3. Um namespace é rotulado para que seja correspondido por namespaceSelector.
  4. Os pods implantados no namespace acionam o webhook.
  5. O serviço inject fornecido pelo plano de controle modifica as especificações do pod para injetar automaticamente o arquivo secundário.

O que é uma revisão?

O rótulo usado para injeção automática é como qualquer outro rótulo do Kubernetes definido pelo usuário. Um rótulo é essencialmente um par de chave-valor que pode ser usado para dar suporte ao conceito de rotular. Os rótulos são amplamente usados para inclusão de tag e revisões. Por exemplo, tags do Git, tags do Docker e revisões do Knative.

O processo atual de instalação do Cloud Service Mesh permite rotular o plano de controle instalado com uma string de revisão. O instalador rotula todos os objetos do plano de controle com a revisão. A chave no par de chave-valor é istio.io/rev. Para planos de controle no cluster, o Serviço e a Implantação istiod normalmente têm um rótulo de revisão semelhante a istio.io/rev=asm-1233-2, em que asm-1233-2 identifica a versão do Cloud Service Mesh. A revisão se torna parte do nome do serviço, por exemplo, istiod-asm-1233-2.istio-system.

Para ativar a injeção automática, adicione um rótulo de revisão aos namespaces que corresponda ao rótulo de revisão no plano de controle. Por exemplo, um plano de controle com revisão istio.io/rev=asm-1233-2 seleciona pods em namespaces com o rótulo istio.io/rev=asm-1233-2 e injeta arquivos secundários.

O processo de upgrade canário

Os rótulos de revisão permitem executar upgrades canário e reversões do plano de controle no cluster.

upgrade canário

As etapas a seguir descrevem como o processo funciona:

  1. Comece com uma instalação do Cloud Service Mesh ou do Istio de código aberto. Não importa se os namespaces estão usando um rótulo de revisão ou o rótulo istio-injection=enabled.
  2. Use uma string de revisão ao instalar a nova versão do plano de controle. Devido à string de revisão, o novo plano de controle é instalado com a versão atual. A nova instalação inclui uma nova configuração de webhook com um namespaceSelector configurado para observar namespaces com esse rótulo de revisão específico.
  3. Você migra proxies sidecar para o novo plano de controle removendo o rótulo antigo do namespace, adicionando o novo rótulo de revisão e reiniciando os pods. Se você usa revisões com o Cloud Service Mesh, interrompa o uso do rótulo istio-injection=enabled. Um plano de controle com uma revisão não seleciona pods em namespaces com um rótulo istio-injection, mesmo que haja um rótulo de revisão. O webhook do novo plano de controle injeta arquivos secundários nos pods.
  4. Teste cuidadosamente as cargas de trabalho associadas ao plano de controle atualizado e continue implantando ou revertendo para o plano de controle original.

Depois de associar os pods ao novo plano de controle, o plano de controle e o webhook atuais continuarão instalados. O webhook antigo não afeta os pods nos namespaces que foram migrados para o novo plano de controle. É possível reverter os pods em um namespace para o plano de controle original removendo o novo rótulo de revisão, adicionando novamente o rótulo original e reiniciando os pods. Quando tiver certeza de que o upgrade foi concluído, remova o plano de controle antigo.

Uma análise mais detalhada da configuração do webhook

Para entender melhor o webhook de mutação para injeção automática de sidecar, inspecione a configuração por conta própria. Use o comando a seguir:

kubectl -n istio-system get mutatingwebhookconfiguration -l app=sidecar-injector -o yaml

Você verá uma configuração separada para cada plano de controle instalado. Um seletor de namespace para um plano de controle baseado em revisão tem esta aparência:

 namespaceSelector:
    matchExpressions:
    - key: istio-injection
      operator: DoesNotExist
    - key: istio.io/rev
      operator: In
      values:
      - asm-1233-2

O seletor pode variar de acordo com a versão do Cloud Service Mesh ou do Istio em execução. Esse seletor corresponde a namespaces com um rótulo de revisão específico, desde que não tenham um rótulo istio-injection.

Quando um pod é implantado em um namespace correspondente ao seletor, a especificação do pod é enviada ao serviço injetor para mutação. O serviço injetor a ser chamado é especificado da seguinte maneira:

     service:
        name: istiod-asm-1233-2
        namespace: istio-system
        path: /inject
        port: 443

O serviço é exposto pelo plano de controle na porta 443 no caminho do URL inject.

A seção rules especifica que o webhook precisa ser aplicado à criação do pod:

   rules:
    - apiGroups:
      - ""
      apiVersions:
      - v1
      operations:
      - CREATE
      resources:
      - pods
      scope: '*'