top of page

Como criar e manipular namespaces no kubernetes

  • Foto do escritor: Rodrigo Saito
    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 namespaces

ou

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 pods

Veja que ele não está no namespace default:


Comprove que não está no namespace default:

kubectl get pods -n default

ou

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-apps

Aplique 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


Nunca perca um post. Assine agora!

Caso queira receber noticias sobre o blog, assine!

© 2022 por datalib

  • Ícone do Facebook Cinza
  • Ícone do Linkedin Cinza
bottom of page