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.
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 Chave | Abreviação |
---|---|
frontend | fte |
backend | bke |
monitoring | mntg |
apigateway | apigw |
É isso. Nos vemos no próximos posts.