Opções de configuração de pods do Google Kubernetes Engine através da injeção automática do Envoy

Este guia fornece informações sobre opções e tarefas adicionais para o injetor sidecar do Envoy automático.

Adicionar proxies sidecar a cargas de trabalho existentes

Depois de instalar o injetor de sidecar nos seus clusters, os proxies sidecar são injetados automaticamente nos pods recém-criados nos espaços de nomes ativados. Se já tiver cargas de trabalho em execução antes de ativar o injetor de sidecar, tem de as reiniciar para que a injeção ocorra.

Para pods geridos por controladores de implementação, DaemonSet ou StatefulSet, pode executar o seguinte:

# Deployment
kubectl rollout restart deployment/DEPLOYMENT_NAME --namespace NAMESPACE

# DaemonSet
kubectl rollout restart daemonset/DAEMONSET_NAME --namespace NAMESPACE

# StatefulSet
kubectl rollout restart statefulset/STATEFULSET_NAME --namespace NAMESPACE

Se não usou nenhum dos controladores acima para implementar os seus pods, tem de eliminar os pods individualmente. Posteriormente, são recriados automaticamente com novos proxies sidecar.

kubectl delete pod POD_NAME -n NAMESPACE

Verifique se foi injetado um contentor de proxy sidecar em cada um dos seus pods:

kubectl get pods -n NAMESPACE

Por exemplo, com o cliente busybox criado acima, deve ver 2/2 pods em execução, um para a própria aplicação busybox e outro para o proxy sidecar Envoy injetado:

NAME                      READY   STATUS    RESTARTS   AGE
busybox-c54f578c9-c9fk4   2/2     Running   183        7d15h

Substituições de injeção

Por predefinição, a ativação de um espaço de nomes ativa a injeção de proxy sidecar para todos os pods residentes. A injeção também pode ser configurada seletivamente para diferentes âmbitos de acordo com necessidades específicas. Por exemplo, as substituições devem ser usadas para impedir a injeção de proxy sidecar para serviços gRPC sem proxy.

Tenha em atenção que as substituições de injeção só se aplicam quando o espaço de nomes está ativado e entram em vigor com a seguinte prioridade: Anotações de pods > NeverInjectSelector > AlwaysInjectSelector > Política predefinida

Ativar ou desativar a injeção para pods individuais específicos

Use a seguinte anotação de pod para ativar ou desativar a injeção para um pod específico num espaço de nomes ativado:

...
metadata:
  annotations:
    td-injection: "true" / "false"

Personalizar o comportamento de interceção de tráfego

Por predefinição, todo o tráfego de saída da sua aplicação é intercetado e redirecionado para o proxy sidecar do Envoy. Em seguida, o proxy Envoy pode processar o tráfego de acordo com as instruções recebidas do Cloud Service Mesh. Em alguns casos, pode querer modificar este comportamento para ignorar o proxy sidecar.

Use as seguintes anotações de Pod para excluir tráfego da interceção e do redirecionamento.

Exclua da interceção por intervalo de endereços IP de saída

Pode excluir o tráfego da interceção por intervalo de endereços IP.

...
metadata:
  annotations:
    cloud.google.com/excludeOutboundCIDRs: "10.0.0.1/32,169.254.169.254/32"

A anotação cloud.google.com/excludeOutboundCIDRs Pod é uma lista separada por vírgulas de intervalos de endereços IP de saída no formato CIDR. O tráfego de saída destinado a estes intervalos de endereços IP não é redirecionado para o sidecar do Envoy.

Tenha em atenção que tem de listar 169.254.169.254/32 na anotação Pod para garantir que as aplicações podem comunicar com o servidor de metadados. Se não especificar a anotação cloud.google.com/excludeOutboundCIDRs Pod, a interceção de tráfego é configurada para excluir o intervalo CIDR de saída "169.254.169.254/32".

Inclua na interceção por intervalo de endereços IP de saída

Pode incluir tráfego na interceção por intervalo de endereços IP.

...
metadata:
  annotations:
    cloud.google.com/includeOutboundCIDRs: "10.0.0.1/32,169.254.169.254/32"

A anotação cloud.google.com/includeOutboundCIDRs Pod é uma lista separada por vírgulas de intervalos de endereços IP de saída no formato CIDR. O tráfego de saída destinado a estes intervalos de endereços IP é redirecionado para o sidecar do Envoy.

O caráter universal * pode ser usado para redirecionar todo o tráfego de saída. Uma lista vazia desativa todo o tráfego de saída. A anotação tem como predefinição *.

Exclua da interceção pelo número da porta de saída

Pode excluir tráfego de interceção e redirecionamento por número de porta de saída.

...
metadata:
  annotations:
    cloud.google.com/excludeOutboundPorts: "10001, 10002"

A anotação cloud.google.com/excludeOutboundPorts Pod é uma lista separada por vírgulas de portas de saída. O tráfego de saída destinado a estas portas é excluído da interceção e do redirecionamento para o sidecar do Envoy.

Se não especificar a anotação cloud.google.com/excludeOutboundPorts, o tráfego de saída destinado a qualquer porta é intercetado e redirecionado para o sidecar do Envoy. Isto é equivalente a transmitir a anotação cloud.google.com/excludeOutboundPorts com uma lista vazia ("").

Incluir na interceção pelo número da porta de entrada

Pode incluir tráfego na interceção por número de porta de entrada.

...
metadata:
  annotations:
    cloud.google.com/includeInboundPorts: "10001, 10002"

A anotação cloud.google.com/includeInboundPorts Pod é uma lista separada por vírgulas de portas de entrada para as quais o tráfego vai ser redirecionado para o sidecar do Envoy. Pode usar o caráter universal * para configurar o redirecionamento para todas as portas. Um valor vazio desativa todo o redirecionamento de entrada. O valor é predefinido como uma string vazia ("").

Exclua da interceção pelo número da porta de entrada

Pode excluir tráfego da interceção por número de porta de entrada.

...
metadata:
  annotations:
    cloud.google.com/excludeInboundPorts: "10001, 10002"

A anotação cloud.google.com/excludeInboundPorts Pod é uma lista separada por vírgulas de portas de entrada a excluir do redirecionamento para o sidecar do Envoy. A anotação só se aplica quando todo o tráfego de entrada (*) está a ser redirecionado. O valor é predefinido como uma string vazia ("").

Ative os certificados geridos

Pode ativar certificados de carga de trabalho geridos.

...
metadata:
  annotations:
    cloud.google.com/enableManagedCerts: "true"

Quando a anotação do pod cloud.google.com/enableManagedCerts está definida como true, os certificados de carga de trabalho geridos pelo GKE assinados pelo serviço de autoridade de certificação são inseridos e montados no contentor sidecar. O valor da anotação é predefinido como false.

Configurar metadados do proxy sidecar

Para suportar funcionalidades adicionais da Cloud Service Mesh, os proxies sidecar podem herdar metadados específicos dos respetivos pods de encapsulamento. Existem duas formas de o fazer. Ambas as opções anexam metadados e partilham os metadados com o Cloud Service Mesh quando o proxy sidecar se liga ao Cloud Service Mesh. As opções são mutuamente exclusivas.

A primeira opção permite-lhe especificar pares de chave/valor de metadados individuais. Por exemplo, inclua a seguinte anotação na especificação do modelo de pod para aplicar a etiqueta "version": "dev" aos respetivos proxies sidecar injetados.

...
metadata:
  annotations:
    cloud.google.com/proxyMetadata: '{"version": "dev"}'

A segunda opção anexa todas as etiquetas do pod ao proxy sidecar injetado do pod.

...
metadata:
  annotations:
    cloud.google.com/forwardPodLabels: "true"

Se não especificar a anotação cloud.google.com/forwardPodLabels, as etiquetas Pod não são anexadas ao proxy sidecar. Tenha em atenção que as anotações cloud.google.com/proxyMetadata e cloud.google.com/forwardPodLabels são mutuamente exclusivas. Se definir ambos, cloud.google.com/forwardPodLabels tem prioridade e cloud.google.com/proxyMetadata é ignorado.

A filtragem de configurações permite que a malha de serviços na nuvem partilhe apenas um subconjunto de configurações com os proxies específicos que correspondem a esta etiqueta "version": "dev".

As implementações existentes têm de ser reiniciadas para que esta configuração entre em vigor.

Anotações de agrupamentos suportadas

O Cloud Service Mesh suporta as seguintes anotações de pods para injeção de sidecar. Embora possam funcionar anotações do injetor de sidecar adicionais, a lista seguinte representa as anotações suportadas pelo Cloud Service Mesh. Para evitar falhas ou instabilidade, não crie uma dependência noutras anotações na sua implementação de produção.

Nome da anotação Valor Descrição
td-injection Booleano, representado como uma string. Por exemplo: "true" Especifica se um sidecar do Envoy deve ou não ser injetado automaticamente na carga de trabalho.
cloud.google.com/proxyMetadata Mapa JSON de pares de chave-valor. Por exemplo: "'{"version": "dev"}'" Especifica os pares de chave/valor num mapa JSON que devem ser anexados aos metadados do Envoy.
cloud.google.com/forwardPodLabels "true" ou "false" Quando definido como "true", todas as etiquetas de Pod são anexadas aos metadados do Envoy, e a anotação "cloud.google.com/proxyMetadata" é ignorada. A predefinição é "false".
cloud.google.com/excludeOutboundPorts Lista de portas de saída separadas por vírgulas O tráfego de saída que indica que qualquer uma destas portas de destino está excluída da interceção/redirecionamento para o sidecar do Envoy. Este tráfego vai ignorar o proxy Envoy e não vai ser processado de acordo com a configuração do Cloud Service Mesh. A predefinição é uma string vazia (ou seja, "").
cloud.google.com/includeInboundPorts Lista de portas de entrada separadas por vírgulas Uma lista separada por vírgulas de portas de entrada para as quais o tráfego é redirecionado para o sidecar do Envoy. Use o caráter universal `*` para configurar o redirecionamento para todas as portas. Um valor vazio desativa todo o redirecionamento de entrada. O valor é predefinido como uma string vazia ("").
cloud.google.com/excludeInboundPorts Lista de portas de entrada separadas por vírgulas Uma lista de portas de entrada separada por vírgulas para as quais o tráfego não é redirecionado para o sidecar do Envoy. A anotação aplica-se apenas quando todo o tráfego de entrada (*) está a ser redirecionado. O valor é predefinido para uma string vazia ("").
cloud.google.com/excludeOutboundCIDRs Lista separada por vírgulas de intervalos de IP de saída no formato CIDR. O tráfego de saída que indica que qualquer um destes IPs de destino está excluído da interceção/redirecionamento para o sidecar do Envoy. Este tráfego vai ignorar o proxy Envoy e não vai ser processado de acordo com a configuração do Cloud Service Mesh. O valor predefinido é "169.254.169.254/32", que é o intervalo necessário para comunicar com o servidor de metadados. Tenha em atenção que este intervalo é obrigatório. Por isso, se especificar a anotação `excludeOutboundCIDRs`, certifique-se de que também inclui "169.254.169.254/32" além de quaisquer outros CIDRs. Certifique-se de que não existem espaços na lista separada por vírgulas.
cloud.google.com/includeOutboundCIDRs Lista separada por vírgulas de intervalos de IP de saída no formato CIDR. O tráfego de saída que indica que qualquer um destes IPs de destino está incluído na interceção/redirecionamento para o sidecar do Envoy. Este tráfego é direcionado para o proxy Envoy e é processado de acordo com a configuração do Cloud Service Mesh. O valor predefinido é "169.254.169.254/32", que é o intervalo necessário para comunicar com o servidor de metadados. Tenha em atenção que este intervalo é obrigatório. Por isso, se especificar a anotação `includeOutboundCIDRs`, certifique-se de que também inclui "169.254.169.254/32" além de outros CIDRs. Certifique-se de que não existem espaços na lista separada por vírgulas.
cloud.google.com/enableManagedCerts Booleano, representado como uma string. Por exemplo: "true" Quando definido como "true", os certificados de carga de trabalho geridos pelo GKE assinados pelo serviço de autoridade de certificação são inseridos e montados no contentor auxiliar. O valor predefinido é "false".

Desinstalar o injetor de sidecar

Desinstale o injetor sidecar com os seguintes comandos:

kubectl delete MutatingWebhookConfiguration td-mutating-webhook
kubectl label namespace default td-injection-