O que é um namespace de Kubernetes?

Os namespaces são uma forma de organizar clusters em subclusters virtuais. Eles podem ser úteis quando diferentes equipes ou projetos compartilham um cluster de Kubernetes. Um cluster aceita qualquer número de namespaces, cada um logicamente separado dos outros, mas capazes de comunicar-se entre si. Os namespaces não podem ser aninhados.

Qualquer recurso no Kubernetes existe também no namespace padrão ou em um namespace criado pelo operador de cluster. Fora do namespace, há somente nós e volumes de armazenamento persistente. Esses recursos de nível inferior estão sempre visíveis para todos os namespaces do cluster.

Estado do Kubernetes

Kubernetes pronto para uso

Qual é o namespace "padrão" no Kubernetes?

O Kubernetes é fornecido com três namespaces prontos para uso. Veja a seguir:

  1. default: como o próprio nome indica, esse é o namespace referenciado por padrão em todos os comandos do Kubernetes. Por padrão, é aqui que residem todos os recursos do Kubernetes. Até que novos namespaces sejam criados, o cluster inteiro residirá em "default".
  2. kube-system: usado para componentes do Kubernetes. Esse namespace deve ser evitado.
  3. kube-public: usado para recursos públicos. Não é recomendável sua utilização por usuários.

Por que usar os namespace de Kubernetes?

Há muitos casos de uso para namespaces de Kubernetes:

  • Permitir que equipes ou projetos residam nos respectivos clusters virtuais sem a preocupação de afetar o trabalho uns dos outros.
  • Aprimorar os controles de acesso com base em funções (RBAC, pela sigla em inglês) ao limitar usuários e processos a determinados namespaces.
  • Permitir a divisão dos recursos de um cluster entre várias equipes e usuários por meio de cotas de recursos.
  • Fornecer um método fácil de separar o desenvolvimento, o teste e a implantação de aplicativos em contêineres, permitindo que todo o ciclo de vida ocorra no mesmo cluster.

Quando é necessário usar vários namespaces de Kubernetes?

Pequenas equipes ou organizações menores podem estar totalmente satisfeitas com o namespace padrão. Isso é particularmente relevante se não há necessidade de separar desenvolvedores ou usuários. No entanto, o uso de vários namespaces oferece muitos benefícios:

  • Isolamento. Equipes grandes ou em expansão podem usar namespaces para isolar seus projetos e microsserviços. As equipes podem reutilizar os mesmos nomes de recursos em diferentes espaços de trabalho sem problemas. Além disso, a execução de uma ação em itens em um único espaço de trabalho nunca afeta outros espaços de trabalho.
  • Organização. As organizações que usam um único cluster para desenvolvimento, teste e produção podem usar namespaces para colocar um ambiente de desenvolvimento e de teste em sandbox. Isso garante que o código de produção não seja afetado por alterações feitas pelos desenvolvedores ou testadores em seus próprios namespaces durante o ciclo de vida do aplicativo.
  • Permissões. Os namespaces permitem o uso do controle de acesso baseado em função (RBAC, pela sigla em inglês) do Kubernetes, para que as equipes possam definir funções que agrupam listas de permissões ou habilidades sob um único nome. Isso pode garantir que apenas usuários autorizados tenham acesso aos recursos em um namespace específico.
  • Controle de recursos. Os limites de recursos orientados por políticas podem ser definidos em namespaces por meio da definição de cotas de recursos para utilização de CPU ou memória. Isso pode garantir que cada projeto ou namespace tenha os recursos necessários para ser executado e que nenhum namespace monopolize todos os recursos disponíveis.
  • Desempenho. O uso de namespaces pode ajudar a melhorar o desempenho de um cluster específico. Se um cluster for separado em vários namespaces para diferentes projetos, a API do Kubernetes terá menos itens para pesquisar ao executar operações. Isso pode reduzir a latência e acelerar o desempenho geral de cada aplicativo em execução no cluster.

Como os pods podem se comunicar entre os namespaces de Kubernetes?

Embora os namespaces sejam separados, a comunicação entre eles é fácil. O diretório de serviços DNS do Kubernetes pode localizar facilmente qualquer serviço por nome por meio da forma expandida de endereçamento DNS:

..svc.cluster.local

A simples adição do nome do namespace ao nome do serviço fornece acesso aos serviços em qualquer namespace do cluster. Por exemplo, para acessar o serviço de folha de pagamento no namespace de desenvolvimento, você usará o endereço
payroll.development
Para acessar o serviço de folha de pagamento no namespace de produção, você usará:
payroll.production

Observe que as políticas de rede podem ser utilizadas opcionalmente para controlar o acesso entre namespaces. Por exemplo, uma política de rede pode permitir ou negar todo o tráfego de outros namespaces. As políticas de rede se aplicam apenas a conexões e não são um substituto para firewalls que executam inspeção de pacotes.

Quais são os comandos kubectl básicos relacionados ao namespace?

Qual comando localiza os namespaces de Kubernetes atuais?

Todos os namespaces no cluster podem ser exibidos com o comando:
kubectl get namespace
Isso retornará uma lista de todos os namespaces do cluster, incluindo os namespaces padrão, juntamente com os respectivos status e idade.

Qual comando cria um novo namespace de Kubernetes?

Os namespaces são criados com o comando:
kubectl create namespace
Assim como qualquer outro recurso do Kubernetes, um arquivo YAML também pode ser criado e aplicado para criar um namespace:

newspace.yaml:
kind: Namespace
apiVersion: v1
metadata:
name: newspace
labels:
name: newspacekubectl apply -f newspace.yaml

Como alternar entre os namespaces de Kubernetes?

Para endereçar namespaces depois de criados, as ações devem incluir a opção –namepsace= no comando. Como isso pode ser complicado, o namespace "default" poderá ser alterado com o comando kubectl config para definir o namespace no contexto do cluster.
Por exemplo, para mudar do namespace "default" para um namespace chamado "testing", você deve inserir:
kubectl config set-context --current --namespace=testing
Isso definirá o namespace "default" como "testing" para todos futuros comandos kubectl.

Como renomear um namespace de Kubernetes?

Não é uma prática padrão renomear um namespace de Kubernetes, portanto, escolha os namespaces (exceto "default") com cuidado.

Como excluir um namespace de Kubernetes?

Os namespaces são excluídos com o comando:
kubectl delete namespaces
Como a exclusão é uma atividade assíncrona, o namespace será exibido como "terminating" até que o namespace seja excluído.

Um aviso sobre exclusão de namespaces de Kubernetes

A exclusão de um namespace é uma ação definitiva. Tudo no namespace, incluindo todos os serviços, pods em execução e elementos, será excluído. A coleta de lixo será executada em qualquer item existente nesse namespace. Verifique se todo o conteúdo do namespace foi excluído antes de executar essa ação.

Soluções e produtos relacionados

Laboratórios: Modernização de aplicativos

Migre os apps para a nuvem em semanas.

Tanzu Kubernetes for Operations

A base para uma infraestrutura de contêineres moderna e multi-cloud.

Tanzu Application Platform

Uma melhor experiência de desenvolvedor multi-cloud no Kubernetes.