Geração de registros de vários locatários no GKE

Nesta página, você aprende a configurar o registro de vários locatários em clusters do Google Kubernetes Engine (GKE).

É comum que várias equipes compartilhem um único cluster do GKE. O compartilhamento de um cluster oferece várias vantagens, incluindo a descoberta de serviços mais fácil, a segurança simplificada e significa que os administradores de cluster têm menos clusters para manter. No entanto, as equipes de aplicativos individuais geralmente têm seus próprios projetos separados. Essa estrutura, com um cluster principal do GKE, mas namespaces separados para cada equipe de aplicativo, é chamada de multilocação. O projeto da equipe de aplicativo é chamado de locatário.

Com o Google Cloud, os administradores do cluster do GKE podem criar um sistema em que os registros do cluster permaneçam no projeto principal do GKE. Esses registros são distribuídos para projetos de locatário. Para configurar os registros dessa maneira, utilize o roteador de registros do Cloud Logging. O Roteador de registros oferece a você o controle sobre como os registros fluem dentro do seu projeto do Google Cloud e como os registros fluem para outros projetos do Google Cloud.

Para criar registros específicos de locatário, o administrador do cluster cria um coletor para exportar entradas de registro para um bucket de registros criado no projeto do locatário. Outra opção é criar uma regra de exclusão para evitar que os registros de locatário sejam armazenados no projeto principal do GKE.

No diagrama a seguir, você tem uma visão geral de uma arquitetura de registro de vários locatários usando buckets de registro:

Arquitetura multilocatária do GKE

Essa arquitetura inclui o seguinte:

  1. Um bucket de registros criado em cada projeto de locatário.
  2. Um coletor de registros criado para cada namespace de locatário.
  3. Uma conta de serviço criada automaticamente para cada coletor de registro.
  4. Regras de exclusão para, opcionalmente, impedir a duplicação de registros no projeto principal do GKE.

Nas seções a seguir, orientamos você sobre como criar essa arquitetura.

Pré-requisitos

Como configurar a geração de registros de vários locatários

É possível configurar a geração de registros multilocatários usando a ferramenta de linha de comando gcloud ou o Console do Google Cloud.

gcloud

Para implementar a geração de registros multilocatário para clusters do GKE, conclua as etapas a seguir:

  1. Defina variáveis:

    export TENANT_NAMESPACE="TENANT_NAMESPACE"
    export MAIN_PROJECT="MAIN_PROJECT_ID"
    export TENANT_PROJECT="TENANT_PROJECT_ID"
    

    Substitua:

    • TENANT_NAMESPACE: o nome do namespace do projeto de locatário
    • MAIN_PROJECT_ID: o ID do projeto principal
    • TENANT_PROJECT_ID: o ID do projeto de locatário
  2. Crie um namespace no cluster de vários locatários:

    kubectl create namespace $TENANT_NAMESPACE
    
  3. Crie o bucket de registros (Beta) no projeto de locatário:

    gcloud logging buckets create gke-$TENANT_NAMESPACE-log-bucket \
        --project=$TENANT_PROJECT \
        --location=global \
        --description="Log bucket for $TENANT_NAMESPACE namespace from $MAIN_PROJECT"
    

    Para mais informações sobre esses campos, consulte a documentação da API gcloud logging buckets create.

  4. Crie um coletor de registro no projeto principal do GKE:

    gcloud logging sinks create gke-$TENANT_NAMESPACE-sink \
    logging.googleapis.com/projects/$TENANT_PROJECT/locations/global/buckets/gke-$TENANT_NAMESPACE-log-bucket \
        --project=$MAIN_PROJECT \
        --log-filter=resource.labels.namespace_name="$TENANT_NAMESPACE" \
        --description="Log sink to $TENANT_PROJECT for $TENANT_NAMESPACE namespace"
    

    Esse comando cria um coletor de registros que envia todos os registros relacionados ao namespace $TENANT_NAMESPACE para o bucket de registro criado na etapa anterior.

    Às vezes, pode ser necessário usar um --log-filter mais restritivo. Por exemplo, se o cluster e o locatário tiverem o mesmo namespace, será possível adicionar um filtro de cluster.

    Para mais informações sobre esses campos, consulte a documentação da API gcloud logging sinks create.

  5. Receba a conta de serviço do coletor no projeto principal e atribua-a a uma variável. Essa conta de serviço será necessária para conceder permissões na próxima etapa.

    export SERVICE_ACCOUNT=$(gcloud logging sinks describe gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT \
        --format='value(writerIdentity)')
    
  6. Conceda o papel logging.bucketWriter à conta de serviço usada pelo coletor. O projeto principal precisa dessa permissão para gravar no bucket no projeto de locatário.

     gcloud projects add-iam-policy-binding $TENANT_PROJECT \
         --member=$SERVICE_ACCOUNT --role='roles/logging.bucketWriter' \
         --condition="expression=resource.name.endsWith(\"locations/global/buckets/gke-$TENANT_NAMESPACE-log-bucket\"),title=Log bucket writer for $TENANT_NAMESPACE,description=Grants logging.bucketWriter role to service account $SERVICE_ACCOUNT used by gke-$TENANT_NAMESPACE-sink"
    

    Para mais informações sobre esses campos, consulte a documentação da API gcloud projects add-iam-policy-binding.

  7. Opcionalmente, crie uma regra de exclusão no bucket _Default. Isso impede que os registros de locatário também sejam gravados no bucket principal. Se você omitir esse comando, terá registros duplicados no bucket _Default do projeto principal e no bucket de locatário.

    gcloud logging sinks update _Default --project=$MAIN_PROJECT \
        --add-exclusion="name=gke-$TENANT_NAMESPACE-default-exclusion,description=\"Exclusion rule on the _Default bucket for $TENANT_NAMESPACE\",filter=resource.labels.namespace_name=\"$TENANT_NAMESPACE\""
    

    Para mais informações sobre esses campos, consulte a documentação da API gcloud logging sinks update.

Console

Para implementar a geração de registros multilocatário para o GKE, conclua as seguintes etapas:

  1. Crie um bucket de registro (Beta) no projeto de locatário:

    1. Acesse o menu Armazenamento de registros:

      Acessar o armazenamento de registros

    2. Clique no menu suspenso do projeto na página superior e selecione o projeto de locatário.

    3. Clique em Criar bucket de registros.

    4. Insira um Nome e uma Descrição para o bucket.

    5. No menu suspenso Selecionar região de bucket de registros, selecione uma região.

    6. Clique em Create bucket. O novo bucket aparecerá na lista Bucket de registros.

  2. Crie o coletor de registros no projeto principal do GKE:

    1. Clique na lista suspensa do projeto na página superior e selecione o projeto principal do GKE.
    2. No menu à esquerda, selecione Roteador de registros. Você será direcionado para a página "Roteador de registros".
    3. Clique em Criar coletor. A janela Selecionar coletor será exibida.
    4. Na janela Selecionar coletor, selecione bucket do Cloud Logging.
    5. Insira um Nome e uma Descrição para seu coletor e clique em Avançar.
    6. Na lista suspensa Selecionar serviço de coletor, selecione Outro projeto.
    7. No campo Destino do coletor, adicione o seguinte destino: logging.googleapis.com/projects/MAIN_PROJECT_ID/locations/LOG_BUCKET_REGION/buckets/BUCKET_NAME

      Substitua:

      • MAIN_PROJECT_ID: o ID do projeto principal
      • LOG_BUCKET_REGION: a região onde você criou o bucket de registro
      • BUCKET_NAME: o nome do bucket de registro criado na seção anterior
    8. Clique em Next.

    9. No Filtro de inclusão da versão, adicione o seguinte filtro: resource.labels.namespace_name="TENANT_NAMESPACE". Substitua TENANT_NAMESPACE pelo nome do namespace do projeto de locatário.

      Às vezes, pode ser necessário usar um filtro de inclusão mais restritivo. Por exemplo, se o cluster e o locatário tiverem o mesmo namespace, será possível adicionar um filtro de cluster.

    10. Clique em Criar coletor. O novo coletor aparecerá na lista Coletores de roteamento de registros.

  3. Receba a conta de serviço do coletor no projeto principal. Essa conta de serviço será necessária para conceder permissões na próxima etapa.

    1. Na página "Roteador de registros", localize o coletor de registros do projeto principal.
    2. Ao lado desse coletor, clique em Mais e selecione Ver detalhes do coletor.
    3. Copie o valor ao lado de Writer Identity: serviceAccount:.
  4. Conceda o papel Gravador de bucket de registro à conta de serviço usada pelo coletor do locatário. O projeto principal precisa dessa permissão para gravar no bucket no projeto de locatário.

    1. No Console do Cloud, acesse a página IAM.

      Acessar IAM

    2. Clique em Add.

    3. No campo Novos membros, adicione a conta de serviço do coletor.

    4. Na lista suspensa Selecionar um papel, selecione Logging e escolha Gravador de bucket de registros.

    5. Clique em Save.

  5. Opcionalmente, crie uma regra de exclusão no bucket _Default. Isso impede que os registros de locatário também sejam gravados no bucket principal. Se você omitir esse comando, terá registros duplicados no bucket _Default do projeto principal e no bucket de locatário.

    1. No Console do Cloud, acesse a página Roteador de registros.

      Acessar o roteador de registros

    2. Ao lado do bucket _Default, clique em Mais e selecione Editar coletor.

    3. Na seção Escolher os registros para filtrar o coletor, clique em Adicionar exclusão.

    4. Adicione um Nome do filtro.

    5. Na caixa Criar um filtro de exclusão, adicione resource.labels.namespace_name=\"TENANT_NAMESPACE"\.

    6. Clique em Atualizar coletor.

Como verificar registros de locatário

Depois de começar a utilizar cargas de trabalho que usam TENANT_NAMESPACE, é possível verificar se o projeto de locatário está recebendo registros específicos do locatário:

  1. No projeto de locatário, acesse a página Visualizador de registros no Console do Cloud.

    Acessar o "Visualizador de registros"

  2. Clique em Refinar escopo.

  3. Selecione Escopo por armazenamento e escolha o bucket do locatário:

    gke-TENANT_NAMESPACE-log-bucket
    

Limpeza

Você pode remover os objetos criados para a geração de registros de vários locatários usando gcloud ou o Console do Cloud.

gcloud

Para remover os objetos criados para a geração de registros de vários locatários, conclua as etapas a seguir:

  1. Defina variáveis para simplificar os seguintes comandos:

    export TENANT_NAMESPACE="TENANT_NAMESPACE"
    export MAIN_PROJECT="MAIN_PROJECT_ID"
    export TENANT_PROJECT="TENANT_PROJECT_ID"
    

    Substitua:

    • TENANT_NAMESPACE: o nome do namespace do projeto de locatário
    • MAIN-PROJECT-ID: o ID do projeto principal
    • TENANT-PROJECT-ID: o ID do projeto de locatário
  2. Se você criou uma regra de exclusão no projeto principal, remova-a:

    gcloud logging sinks update _Default \
       --project=$MAIN_PROJECT \
       --remove-exclusions=gke-$TENANT_NAMESPACE-default-exclusion
    
  3. Remova o papel bucketWriter da conta de serviço:

    export SERVICE_ACCOUNT=$(gcloud logging sinks describe gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT | \
        --format='value(writerIdentity)'
    
    gcloud projects remove-iam-policy-binding $TENANT_PROJECT \
        --member=$SERVICE_ACCOUNT \
        --role='roles/logging.bucketWriter' \
        --all
    
  4. Exclua o coletor de registros:

    gcloud logging sinks delete gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT
    
  5. Exclua o bucket de registros:

    gcloud logging buckets delete gke-$TENANT_NAMESPACE-log-bucket \
        --project=$TENANT_PROJECT \
        --location=global
    
  6. Exclua o namespace:

    kubectl delete namespace $TENANT_NAMESPACE
    

Console

  1. Se você criou uma regra de exclusão no projeto principal, remova-a:

    1. No Console do Cloud, acesse a página Roteador de registros.

      Acessar o roteador de registros

    2. Ao lado do bucket _Default, clique em Mais

    3. Selecione Editar coletor.

    4. Ao lado da regra de exclusão que você criou, clique em Excluir.

    5. Clique em Atualizar coletor.

  2. No projeto principal, remova a conta de serviço:

    1. No Console do Cloud, acesse a página IAM.

      Acessar IAM

    2. Selecione a conta de serviço do coletor.

    3. Clique em Remover.

    4. Na janela de confirmação, clique em Confirmar.

  3. No projeto de locatário, exclua o coletor de registro:

    1. Clique no menu suspenso do projeto na página superior e selecione o projeto do locatário do GKE.
    2. No menu do Logging, selecione Roteador de registros.

      Acessar o roteador de registros

    3. No coletor que você quer excluir, clique em Mais .

    4. Selecione Excluir coletor.

    5. No painel de confirmação, clique em Excluir.

  4. No projeto principal, exclua o bucket de registro (Beta):

    1. Clique na lista suspensa do projeto na página superior e selecione o projeto principal do GKE.
    2. No menu do Logging, selecione Armazenamento de registros.

      Acessar o armazenamento de registros

    3. No bucket que você quer excluir, clique em Mais .

    4. Selecione Excluir bucket.

    5. No painel de confirmação, clique em Excluir.

Limitações

A geração de registros de vários locatários tem as seguintes limitações:

  • A cota para o número de coletores de registros por projeto é 200. Se precisar de mais de 200 locatários, solicite um aumento da cota abrindo um caso de suporte.
  • Há um limite absoluto de 50 regras de exclusão por bucket de registro. Se você pretende ter mais de 50 locatários, a abordagem da regra de exclusão para o bucket _Default precisa ser revisada. Como alternativa, você pode:

    • Crie uma única regra de exclusão que filtre todos os namespaces não padrão ou de sistema usando este comando:

      gcloud logging sinks update _Default \
      --project=$MAIN_PROJECT \
      --add-exclusion="name=gke-all-tenant-default-exclusion,description=\"Exclusion rule on the _Default bucket for all tenants\",filter=resource.labels.namespace_name !~ \"kube\" AND resource.labels.namespace_name !~ \"system\ AND resource.labels.namespace_name != \"Default\""
      
    • Registros duplicados entre o projeto de locatário e o projeto principal não criando a regra de exclusão.

A seguir