Namespace

En Kubernetes, un namespace es una forma de organizar y agrupar recursos dentro de un clúster. Actúa como un “espacio de nombres” lógico que permite dividir el clúster en secciones más pequeñas, lo que facilita la gestión y la organización de los recursos. Los namespaces son especialmente útiles en escenarios donde hay múltiples equipos o proyectos trabajando en el mismo clúster, ya que permite:

  1. Aislar recursos: Los recursos (pods, servicios, configuraciones, etc.) creados en un namespace no afectan ni interactúan directamente con los recursos de otro namespace, lo que proporciona un nivel de aislamiento.

  2. Evitar conflictos: Al usar namespaces, puedes tener objetos con el mismo nombre (por ejemplo, un pod llamado frontend) en diferentes namespaces sin que entren en conflicto entre sí.

  3. Control de acceso: Puedes aplicar políticas de seguridad y acceso específicas por namespace, lo que facilita el control de quién puede interactuar con ciertos recursos.

  4. Cuotas de recursos: Los administradores pueden asignar cuotas de recursos (CPU, memoria, etc.) a cada namespace, ayudando a evitar que un proyecto o equipo consuma todos los recursos del clúster.

Por defecto, Kubernetes tiene algunos namespaces predefinidos, como:

  • default: Donde se crean los recursos si no se especifica un namespace.
  • kube-system: Usado por los recursos internos del sistema de Kubernetes.
  • kube-public: Un namespace de acceso público, aunque no se usa comúnmente.
  • kube-node-lease: Gestiona el arrendamiento de nodos.

Esencialmente, los namespaces permiten una mejor organización y administración en clústeres Kubernetes más grandes o multiusuario.

Como ver los namespaces

kubectl get namespace

Como ver los objetos de un namespace

kubectl get pods -n kube-system
kubectl get pods -n kube-public

Crear y borrar namespace

Modo imperativo

kubectl create namespace n1

Modo declarativo

apiVersion: v1
kind: Namespace
metadata:
  name: n1
  labels:
     tipo: desarrollo

Luego kubectl apply -f namespace.yml

Elimiar namespace

kubectl delete namespace n1

Crear objetos en un namespace

Usaremos como ejemplo un objeto que levante elasticsearch:

apiVersion: apps/v1 # i se Usa apps/v1beta2 para versiones anteriores a 1.9.0
kind: Deployment
metadata:
  name: elastic
  labels:
    tipo: "desarrollo"
spec:
  selector:   #permite seleccionar un conjunto de objetos que cumplan las condicione
    matchLabels:
      app: elastic
  replicas: 2 # indica al controlador que ejecute 2 pods
  strategy:
     type: RollingUpdate
  minReadySeconds: 2
  template:   # Plantilla que define los containers
    metadata:
      labels:
        app: elastic
    spec:
      containers:
      - name: elastic
        image: elasticsearch:7.6.0
        ports:
        - containerPort: 9200

Ahora enlazamos ese Deployment con el namespace asi :

kubectl apply -f deploy_elastic.yml --namespace=n1

Establecer namespace por defecto

Vamos a cd ~.kube y en el archivo config en uno de los context veremos namespace podemos modificarlo ahi.

Podemos hacerlo en caliente tambien, kubectl config view para ver la config en caso de que no tengamos el fichero a mano.

Para modificarlo hacemos :

kubectl config set-context --current --namespace=dev1

Ahora si hacemos kubectl get pods ya no tenemos que indicar el namespace.

Poner CPU y memoria a los namespace

Creamos limit.yml

apiVersion: v1
kind: LimitRange
metadata:
  name: recursos
spec:
  limits:
  - default:
      memory: 512Mi
      cpu: 1
    defaultRequest:
      memory: 256Mi
      cpu: 0.5
    max:
      memory: 1Gi
      cpu: 4
    min:
      memory: 128Mi
      cpu: 0.5
    type: Container
  • default: Si un contenedor no especifica ningún límite, se le aplicarán estos valores (512Mi de memoria y 1 CPU).
  • defaultRequest: Si un contenedor no especifica solicitudes, Kubernetes asumirá que el contenedor necesita estos recursos (256Mi de memoria y 0.5 CPU).
  • max: Un contenedor no puede pedir más de 1Gi de memoria y 4 CPUs.
  • min: Un contenedor no puede pedir menos de 128Mi de memoria y 0.5 CPU.

Si a continuacion hacemos kubectl apply -f limits.yaml y hacemos un describe del namespace veremos el limite de recursos.

Name:         default
Labels:       kubernetes.io/metadata.name=default
Annotations:  <none>
Status:       Active

No resource quota.

Resource Limits
 Type       Resource  Min    Max  Default Request  Default Limit  Max Limit/Request Ratio
 ----       --------  ---    ---  ---------------  -------------  -----------------------
 Container  memory    128Mi  1Gi  256Mi            512Mi          -
 Container  cpu       500m   4    500m             1              -

Tene en cuenta que el limit se aplica sobre el namespace en el cual estas parado al menos que uses -n tu-name-space

Controlar los eventos dentro de un Namespace

kubectl create namespaces desarrollo

Cambiar el namespace actual

Si deseas cambiar el namespace predeterminado sin tener que especificarlo manualmente cada vez que ejecutas un comando, puedes usar:

kubectl config set-context --current --namespace=desarrollo

Ver el namespace actual

kubectl config view --minify --output 'jsonpath={..namespace}'

Creamos un pod en ese namespace

kubectl run apache --image=httpd

Vemos los eventos del namespace

❯ kubectl get events --namespace desarrollo
LAST SEEN   TYPE     REASON      OBJECT       MESSAGE
17s         Normal   Scheduled   pod/apache   Successfully assigned desarrollo/apache to multinode-m04
17s         Normal   Pulling     pod/apache   Pulling image "httpd"
16s         Normal   Pulled      pod/apache   Successfully pulled image "httpd" in 1.484s (1.484s including waiting). Image size: 148178227 bytes.
16s         Normal   Created     pod/apache   Created container apache
16s         Normal   Started     pod/apache   Started container apache

Esto mismo aparece si hacemos kubectl describe pod apache en la zona de eventos.

Filtrar eventos por campos

Si queremos ver solo los eventos donde el TYPE es Warning hacemos :

kubectl get events --field-selector type="Warning"

Viendo eventos en tiempo real

Haciendo uso de -w (watch)

kubectl get events --namespace desarrollo -w