K8s em Exemplos: Namespaces

Namespaces particionam um cluster em sub-clusters virtuais. Eles fornecem escopo para nomes e são a base para resource quotas e políticas RBAC.

namespace.yaml

Um Namespace é um recurso core do Kubernetes (API v1).

apiVersion: v1
kind: Namespace

O name deve ser único no cluster. Use apenas minúsculas, números e hífens.

metadata:
  name: my-app

Labels ajudam a organizar e selecionar namespaces. Padrões comuns: environment, team, cost-center.

  labels:
    environment: production
    team: platform
terminal

Namespaces built-in: default (seus recursos se não especificado), kube-system (control plane), kube-public (legível por todos).

$ kubectl get namespaces
NAME              STATUS   AGE
default           Active   45d
kube-system       Active   45d
kube-public       Active   45d
kube-node-lease   Active   45d
terminal

Crie um namespace imperativamente com kubectl create.

$ kubectl create namespace my-app
namespace/my-app created
terminal

Defina um namespace padrão para seu contexto atual para evitar digitar -n my-app repetidamente.

$ kubectl config set-context --current --namespace=my-app
Context "my-cluster" modified.
terminal

Verifique sua configuração de namespace atual.

$ kubectl config view --minify | grep namespace
    namespace: my-app
pod.yaml

Dentro do mesmo namespace, referencie services apenas pelo nome. O DNS do Kubernetes resolve automaticamente.

env:
  - name: API_URL
    value: "http://api:8080"

Referências cross-namespace usam o formato service.namespace.svc.

  - name: REDIS_URL
    value: "redis://redis.cache.svc:6379"

O FQDN completo inclui .cluster.local. Geralmente só necessário para casos especiais.

  - name: DB_HOST
    value: "postgres.db.svc.cluster.local"
resourcequota.yaml

ResourceQuotas limitam o consumo total de recursos por namespace. Previne que um time consuma todos os recursos do cluster.

apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-quota
  namespace: my-app

spec.hard define os limites. Restrinja CPU, memória, storage e contagem de objetos.

spec:
  hard:
    requests.cpu: "10"
    requests.memory: 20Gi
    limits.cpu: "20"
    limits.memory: 40Gi
    pods: "50"
limitrange.yaml

LimitRanges definem limits e max/min padrão de recursos por container.

apiVersion: v1
kind: LimitRange
metadata:
  name: default-limits
spec:
  limits:

default define limits quando não especificados.

    - default:
        cpu: "500m"
        memory: "512Mi"

defaultRequest define requests.

      defaultRequest:
        cpu: "100m"
        memory: "128Mi"
      type: Container
terminal

Alguns recursos são de escopo de cluster: Nodes, PersistentVolumes, ClusterRoles, Namespaces.

$ kubectl api-resources --namespaced=false
NAME                  SHORTNAMES   APIVERSION   NAMESPACED
nodes                 no           v1           false
persistentvolumes     pv           v1           false
clusterroles                       rbac/v1      false
namespaces            ns           v1           false
terminal

A maioria dos recursos de workload são namespaced: Pods, Services, Deployments, ConfigMaps.

$ kubectl api-resources --namespaced=true
NAME                  SHORTNAMES   APIVERSION   NAMESPACED
pods                  po           v1           true
services              svc          v1           true
deployments           deploy       apps/v1      true
configmaps            cm           v1           true
terminal

Aplique recursos a um namespace específico com -n.

$ kubectl apply -f deploy.yaml -n my-app
deployment.apps/my-app created
terminal

Visualize pods em todos os namespaces com -A.

$ kubectl get pods -A
NAMESPACE     NAME                       READY   STATUS
kube-system   coredns-5d78c9869d-abc     1/1     Running
kube-system   etcd-master                1/1     Running
my-app        my-app-6d4f8b7c9-xyz       1/1     Running
terminal

Aviso: deletar um namespace deleta TODOS os recursos dentro dele. Sem desfazer.

$ kubectl delete namespace my-app
namespace "my-app" deleted

Índice | GitHub | Use as setas do teclado para navegar |