Como criar e manipular namespaces no kubernetes
- Rodrigo Saito
- há 1 dia
- 4 min de leitura
Tudo bem, pessoal?
Voce sabe para que são utilizados os namespaces no kubernetes? Sevem para que sejam separados logicamente recursos do k8s.

É um mecanismo para isolar grupos de recursos dentro de um cluster. Os nomes dos recursos precisam ser exclusivos dentro do seu namespace.
Não é qualquer objeto que pode ser colocado dentro de um namespace.
Podem ser colocado vários que oferecem isolamento lógico:
1 - Workloads (Cargas de Trabalho)
Pods: A menor unidade executável.
Deployments: Gerenciam réplicas de Pods (comum para aplicações stateless).
StatefulSets: Gerenciam aplicações com estado (stateful).
DaemonSets: Garantem que um Pod rode em todos os nodes.
Jobs e CronJobs: Executam tarefas únicas ou agendadas.
2 - Rede e Serviço (Networking)
Services (SVC): Definem uma forma de expor e balancear a carga entre Pods.
Ingress: Gerencia o acesso externo aos serviços.
NetworkPolicies: Regras de firewall para controlar tráfego entre Pods.
3 - Configuração e Secrets (Config)
ConfigMaps: Armazenam dados de configuração (não sensíveis).
Secrets: Armazenam dados sensíveis (senhas, chaves).
4 - Armazenamento (Storage)
PersistentVolumeClaims (PVC): Solicitação de armazenamento pelos usuários.
Nota: O PersistentVolume (PV) em si é escopo de cluster, mas o PVC é namespace-scoped
5 - Controle de Acesso e Recursos (RBAC/Quotas)
Roles: Define permissões dentro de um namespace.
RoleBindings: Vincula regras a usuários dentro de um namespace.
ResourceQuotas: Limita o total de recursos (CPU, Memória, Pods) do namespace.
LimitRanges: Define limites padrão de recursos por Pod/Container.
O que NÃO está dentro de um Namespace? (Cluster-wide objects)
Estes são recursos de cluster-scoped (abrangem todo o cluster):
Nodes
Namespaces (um namespace não fica dentro de outro)
PersistentVolumes (PV)
StorageClassesClusterRoles e ClusterRoleBindings
CustomResourceDefinitions (CRDs)
Dica: Para listar todos os recursos que pertencem a um namespace no seu cluster, use:
kubectl api-resources --namespaced=true.
Para os exemplos abaixo, o minikube de estar iniciado (minikube start)
Para listar os namespaces existentes, digite:
kubectl get namespacesou
kubectl get ns
Por padrão, todos os objetos criados são colocado no namespace default
O K8s use o namespace kube-node-lease para fazer diversas verificações internas, como por exemplo, buscas por falhas,
kube-public é reservado para uso do cluster. Caso objetos tenham que ter acesso a todos os cluster, é colocado em public.
kube-system tem vários recursos criados para funcionamento do cluster.
Vamos verificar se tem algum pod criado em um especifico namespace
kubectl get pods -n default
Veja nos outros namespaces se terão algum outro objeto. Veja que teremos somente no namespace system:
kubectl get pods -n kube-node-lease
kubectl get pods -n kube-public
kubectl get pods -n kube-system
Criação de namespace
Vamos fazer a criacao de um namespace
kubectl create namespace frontend --save-config
Execute novamente o comando para ver os namespaces:
kubectl get namespaces
Abra o arquivo do my-tomcat-pod.yaml que contém o seguinte código:
apiVersion: v1
kind: Pod
metadata:
name: tomcat-pod
labels:
apps: app-java
spec:
containers:
- name: container-tomcat
image: tomcat
Aplique o arquivo my-tomcat-pod.yaml, colocando em um namespace, com o seguinte comando:
kubectl apply -f my-tomcat-pod.yaml --namespace=frontend
Verifique se ele foi criado com o comando:
kubectl get pods
Perceba que mesmo tendo criado, ele não é listado. Isso porque agora ele não está no namespace default.
Veja novamente no namespace frontend
kubectl get pods -n frontend
Alteração do Current Context namespace
Faz com que determinado namespace seja o padrão a ser criados objetos, e não o default do k8s.
Vamos fazer com que o namespace frontend agora seja o padrão para criação de novos objetos:
kubectl config set-context --current --namespace=frontend
Agora, novos objetos serão criado nesse namespace
Para testar essa nova configuração, crie um novo pod de forma imperativa:
kubectl run my-pod-apache --image httpd
Veja agora em que namespace essa pod foi criada:
kubectl get podsVeja que ele não está no namespace default:

Comprove que não está no namespace default:
kubectl get pods -n defaultou
kubectl get pods -n frontend
Vamos retornar a configuração padrão de criação de objetos no namespace default:
kubectl config set-context --current --namespace=default
Deletar um pod dentro de um namespace
Liste os pods que estão criados no específico namespace:
kubectl get pods -n frontend
Para deletar um pod dentro de um especifico namespace, é necessário especificar o comando:
kubectl delete pods my-pod-apache --namespace=frontend
Exclusão de um namespace
Quando um namespace é excluído no K8s, todos os recursos dentro desse namespace também são excluídos.
Isso inclui pods, serviços, deployments, configmaps, secrets e outros objetos criados dentro desse escopo.
É essencial saber disso para gerenciar namespaces.
Para saber quais são os namespaces existentes, digite:
kubectl get ns
Vamos fazer a deleção desse namespace (frontend)
kubectl delete namespace frontend
Para verificar novamente os namespaces existentes, digite:
kubectl get ns
Criaçção de namespaces em um arquivo manifest (.yaml)
É totalmente possível fazer a criação de namespace dentro de uma arquivo manifesto.
Crie um arquivo em Downloads, chamado my-backend-namespace.yaml, com o seguinte conteúdo:
apiVersion: v1
kind: Namespace
metadata:
name: backend-ns
labels:
apps: backend-appsAplique o arquivo criado:
kubectl apply -f my-backend-namespace.yaml
Veja se ele foi criado:
kubectl get ns
Veja que não temos nenhum componente dentro dele?
kubectl get pods -n backend-ns
Abra o arquivo my-redis-pod.yaml que tenha o seguinte conteúdo:
apiVersion: v1
kind: Pod
metadata:
name: redis-pod
labels:
apps: backend
spec:
containers:
- name: container-redis
image: redis
Aplique o arquivo, já colocando ele dentro do namespace backend-ns
kubectl apply -f my-redis-pod.yaml --namespace=backend-ns
Verifique se ele foi colocado no namespace corretamente:
kubectl get pods -n backend-ns
Agora, faça a deleção desse pod que acabamos de criar:
kubectl delete pods redis-pod -n backend-ns
Podemos agora deletar o namespace backend-ns:
kubectl delete ns backend-ns
Veja todos os namespaces
kubectl get ns
Outra e a melhor opção de criar um objerto dentro de um namespace é dentro do arquivo de manifesto voce já especificar qual o namespace o componente deve ser crriado:
Dentro do arquivo my-redis-pod.yaml, modifique o arquivo para:
d
apiVersion: v1
kind: Pod
metadata:
name: redis-pod
namespace: backend-ns
labels:
apps: backend
spec:
containers:
- name: container-redis
image: redis
Crie novamente o namespace, aplicando arquivo myu-backend-namespace.yaml:
kubectl apply -f my-backend-namespace.yaml
Aplique o arquivo my-redis-pod.yaml:
kubectl apply -f my-redis-pod.yaml
Cheque novamente em que namespace o redis está criado:
kubectl get pods -nm backend-ns
Faça a deleção do namespace com todos os seus objetos que estão dentro:
kubectl delete ns backend-ns
Gostou do nosso blog?
Muito obrigado!
Até a próxima!


Comentários