Nomeando Namespaces no Kubernetes – Modelo 4 camadas

O K8s (sigla para Kubernetes) tem um modelo de divisão lógica para as aplicações chamado de Namespaces. Contudo, não existe um modelo oficial de como nomear, categorizar e/ou organizar essas Namespaces. Nesse post, vamos conversar sobre um ótimo modelo, bem funcional e que facilita em muito o dia a dia de quem utiliza o K8s.

O que são Namespaces?

Vou apenas dar um pincelada superficial no que ela é, mais informações leia a documentação oficial: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/

Namespaces é uma forma de você organizar, configurar, e definir regras para as aplicações dentro do seu cluster de K8s. Isso permite que, quem esteja dentro de uma determinada Namespace tenha um determinado “comportamento”, por isso, é importante dividir seus aplicações em varias Namespaces.

No K8s, aplicações são convertidas em Pods, leia mais em: https://kubernetes.io/docs/concepts/workloads/pods/

Pods de aplicações diferentes tem comportamentos diferentes, e por isso, precisam de configurações diferentes e consequentemente, Namespaces diferentes.

Modelo 4 camadas

Agora que já entendemos o que são as Namespaces, vamos apresentar o modelo.

Inicialmente, precisamos saber que as camadas (em inglês Layers) são divididos com os números de 1 a 4, estes são utilizados como informativo tanto na ordem crescente (do L1 até o L4), quanto na ordem decrescente (do L4 para o L1). Nos vamos começar de forma decrescente por ser mais fácil o entendimento.

Exemplo de utilização do modelo de 4 camadas

L4 – Camada de base

Nessa camadas, deve estar as Namespaces que contenham Pods (“aplicações”) que formem a base da nossa pirâmide.

Recomenda-se seguir os requisitos:

  • Não conter dependências com outros Pods da mesma camada.
  • Não conter dependências com outros Pods de outras camadas.
  • Evitar prover um acesso externo direto ao Pod ou Service.
  • Se for necessário existir acesso externo, criar um segundo acesso para este Pod ou Service.

Exemplo de conteúdo dessa camada:

  • Banco de Dados
  • Ferramentas de monitoração
  • Softwares de Email
  • Softwares de Mensageiras

L3 – Camada de serviços

Subindo o primeiro nível das camadas, está a nossa camada onde se encontram as Namespaces para os Pods que fornecem “serviços” para as próximas.

Recomenda-se seguir os requisitos:

  • Pode conter dependências com outros Pods da mesma camada.
  • Pode conter dependências com outros Pods da camada L4.
  • Não prover um acesso externo direto ao seu Pod ou Service.

Exemplo de conteúdo dessa camada:

  • Serviços de configurações de aplicações
  • Barramentos de serviços
  • Aplicações que fazem “proxy” para serviços de terceiros.

L2 – Camada de processamento

Esta é a camada onde fica a maior parte do conteúdo do seu K8s, pois quase sempre, as suas aplicações iram se encontrar nessa camadas.

Recomenda-se seguir os requisitos:

  • Pode conter dependências com outros Pods da mesma camada.
  • Pode conter dependências com outros Pods da camada L3 e L4.
  • Não prover um acesso externo direto ao seu Pod ou Service.

Exemplo de conteúdo dessa camada:

  • Aplicações Backend
  • Aplicações de processamento em lote
  • Aplicações com os consumidores de mensagens

L1 – Camada de entrada

Aqui ficam as Namespaces que contem os Pods responsáveis em fazerem a “entrada” no seu K8s.

Recomenda-se seguir os requisitos:

  • Não pode conter dependências com outros Pods da mesma camada.
  • Não pode conter dependências com outros Pods da camada L4.
  • Pode conter dependências com outros Pods da camada L2, L3.
  • Prover um acesso externo direto ao seu Pod ou Service.

Exemplo de conteúdo dessa camada:

  • Api Gateway
  • Servidor Web (Frontend)

Nomeando as Namespaces (Nomenclatura)

Além do indicador de qual Layer (camada) essa Namespace faz parte, é interessante também fazer o uso de uma categorização do conteúdo em execução dentro da Namespaces.

O modelo apresenta a seguinte sintaxe:

l[numero da camada]-[palavra chave de categorização]-[identificador]-[sub identificador]

Onde:

  • numero da camada – representa o numero da camada
  • palavra chave de categorização – representa a forma de categorizar essa Namespace
  • identificador – representa uma forma de separar as Namespaces da mesma camada. Pode ser o nome do projeto, ou a divisão da empresa, um nome de produto.
  • sub identificador – representa uma forma de você conseguir fracionar o seu identificador principal. Exemplo: Se o identificador é a área da empresa, o sub pode ser os projetos desta área.

Como exemplo:

  • l2-backend-ecommerce
  • l1-frontend-catalogo-geral
  • l1-frontend-catalogo-verao
  • l4-monitoring-grafana
  • l4-db-mysql-ecommerce
  • l4-db-mysql-catalogo

Se você for uma pessoa com TOC e não consegue deixar a Namespace sem o sub identificador. Uma resolução é colocar a palavra default, exemplo: l4-db-mysql-default

Lembrando que a Namespace é utilizada para compor o a entrada de DNS interna do K8s, por isso, utilize somente letras em minúsculo, números e – (traço). Não utilizar letras em maiúsculo, espaço, ponto (.) ou caracteres especiais. Mais informações: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#dns-subdomain-names

Fique atento também ao limite de caracteres, se você acredita que ira ter Namespaces com nomes longos troque as palavras chaves por abreviações.

Exemplos de possíveis palavras chaves:

Palavra ChaveAbreviação
frontendfte
backendbke
monitoringmntg
apigatewayapigw

É isso. Nos vemos no próximos posts.