Saltar al contenido principal

Namespaces y contextos

Los namespaces son una forma de agrupar los recursos de kubernetes. Esto permite que podamos gestionar los diferentes recursos de una aplicación ( pod, deployment, service, etc) para establecer unas cuotas recursos, políticas de seguridad y configuraciones específicas.

Que hace y que no hace un namespace

Un namespace no es una barrera de seguridad, sino una forma de organizar y gestionar los recursos de kubernetes.

Por defecto, un namespace solo separa recursos lógicamente y no físicamente. Por ejemplo, los pods de un namespace pueden acceder a los servicios de otro namespace via red.

Lo que si nos permite un namespace, una vez definido, es aplicar un control de accesos de usuarios RBAC sobre todos los elementos de un namespace, asi como aplicar políticas de red para aislar los recursos de un namespace de otros y establecer cuotas de recursos, para limitar el uso de CPU y memoria de los recursos de un namespace.

Listar namespaces

Por omisión, kubernetes crea un namespace llamado default que es el namespace por defecto.

Dentro vídeo: https://youtu.be/_aiO_0YjhOQ

Namespaces y Contextos

Listar namespaces

Podemos listar los namespaces con el comando:

kubectl get ns

Esto nos muestra nuestro namespace por defecto y los namespaces del sistema de kubernetes (no tocar estos namespaces):

NAME              STATUS   AGE
default Active 26d
kube-node-lease Active 26d
kube-public Active 26d
kube-system Active 26d

Puede ser interesante listar los namespaces junto con sus `labels``:

kubectl get ns --show-labels

Este comando nos muestra nuestros namespaces de la siguiente forma:

NAME              STATUS   AGE   LABELS
default Active 26d kubernetes.io/metadata.name=default
kube-node-lease Active 26d kubernetes.io/metadata.name=kube-node-lease
kube-public Active 26d kubernetes.io/metadata.name=kube-public
kube-system Active 26d kubernetes.io/metadata.name=kube-system

Crear un namespace

Podemos crear un namespace simplemente con el comando:

kubectl create namespace <nombre-namespace>

O con su abreviatura:

kubectl create ns <nombre-namespace>

Aún así, también también lo podemos crear con un fichero de configuración para dejarlo definido como código:

apiVersion: v1
kind: Namespace
metadata:
name: development
labels:
name: development

Para utilizar este json de configuración podemos utilizar el comando:

kubectl create -f <fichero-json>

Borrar un namespace

Podemos borrar un namespace con el comando:

kubectl delete ns <nombre-namespace>

Cambiar de namespace y contextos

Podríamos ejecutar comandos en cualquier namespace añadiendo el parámentro --namespace o -n a cualquier comando, por ejemplo:

kubectl -namespace development get pods 

También podríamos utilizar la abreviatura -n:

kubectl -n development get pods

El proceso anterior sería más farragoso, excepto que queramos lanzar un comando puntual en un namespace concreto, es más recomendable utilizar la configuración de contexto de kubectl:

kubectl config set-context <nombre-context> --namespace=<nombre-namespace>

Así estaríamos asociando un namespace a un contexto.

Consideraciones de seguridad

Es importante tener en cuenta que los namespaces no son una barrera de seguridad, sino una forma de organizar y gestionar los recursos de kubernetes.

Para aislar recursos de forma segura, deberíamos utilizar Network Policies y RBAC (Role Based Access Control), que veremos en capítulos posteriores.

Por defecto, podremos acceder por la red de los pods de un namespace a los pods de otro namespace, por lo que deberíamos configurar políticas de red para restringir este tráfico.


Volver al índice

X

Graph View