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
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.
- Lista de vídeos en Youtube: Curso Kubernetes