Kubernetes ofrece la capacidad de segmentar un clúster físico compartido en múltiples unidades lógicas, conocidas como namespaces (o espacios de nombres). Estos actúan como clústeres virtuales que permiten la coexistencia de diferentes entornos o equipos dentro de una misma infraestructura.
Un namespace define un ámbito de alcance para los recursos. Esto significa que los nombres de los recursos, como Pods o Services, deben ser únicos únicamente dentro de su namespace. Es importante destacar que los namespaces no pueden anidarse entre sí, y cada recurso de Kubernetes pertenece exclusivamente a uno.
Administración Básica de Namespaces
Visualización de Namespaces Existentes
Para inspeccionar los namespaces configurados en un clúster de Kubernetes, se puede emplear el siguiente comando:
$ kubectl get namespaces
# Alternativamente, la forma abreviada es:
$ kubectl get ns
NAME STATUS AGE
default Active 11d
kube-system Active 11d
kube-public Active 11d
Inicialmente, un clúster de Kubernetes se configura con tres namespaces por defecto:
default: Utilizado para objetos que no especifican un namespace explícitamente.kube-system: Contiene recursos creados por el propio sistema de Kubernetes.kube-public: Un namespace de propósito general que es legible por todos los usuarios, incluyendo aquellos no autenticados. Se usa típicamente para hacer visibles ciertos recursos a todo el clúster.
Para obtener información más detallada sobre un namespace específico, como sus etiquetas, anotaciones, estado, cuotas de recursos o límites, se usa:
$ kubectl describe namespace <nombre-del-namespace>
Name: default
Labels: kubernetes.io/metadata.name=default
Annotations: <none>
Status: Active
No resource quota.
Resource Limits
Type Resource Min Max Default
---- -------- --- --- ---
Container cpu - - 100m
</none>
La salida de este comando puede revelar configuraciones importantes como cuotas de recursos (ResourceQuota), que gestionan el consumo agregado de recursos dentro del namespace, y rangos de límites (LimitRange), que definen las restricciones mínimas y máximas de recursos para objetos individuales.
Un namespace puede encontrarse en uno de dos estados:
Active: El namespace está operativo y puede alojar nuevos recursos.Terminating: El namespace está en proceso de eliminación y no permite la creación de nuevos objetos.
Creación de un Nuevo Namespace
Advertencia: Evite utilizar el prefijo kube- al nombrar sus namespaces, ya que está reservado para componentes del sistema de Kubernetes.
Se puede crear un namespace de dos maneras:
-
Mediante un archivo de manifiesto YAML:
Cree un archivo, por ejemplo,
mi-namespace.yaml, con el siguiente contenido:apiVersion: v1 kind: Namespace metadata: name: mi-proyectoLuego, aplique el manifiesto con
kubectl:$ kubectl apply -f ./mi-namespace.yaml -
Directamente desde la línea de comanods:
$ kubectl create namespace mi-proyecto
Eliminación de un Namespace
Para eliminar un namespace, se puede utilizar el archivo de manifiesto o un comando directo:
-
Usando el archivo de manifiesto (si fue creado así):
$ kubectl delete -f ./mi-namespace.yaml -
Con un comando directo:
$ kubectl delete namespace mi-proyecto
¡Precaución! La eliminación de un namespace conlleva la eliminación irremediable de todos los recursos contenidos en él. La operación de eliminación es asíncrona, por lo que el namespace puede permanecer en estado Terminating durante un período antes de desaparecer por completo.
Beneficios del Uso de Namespaces
Los namespaces en Kubernetes son fundamentales para operar un clúster compartido por múltiples usuarios, equipos o proyectos. Facilitan el aislamiento lógico y la gestión eficiente de recursos, permitiendo que distintas "comunidades" de usuarios trabajen de manera independiente.
Los principales beneficios incluyen:
- Aislamiento de Recursos: Proporcionan un ámbito de nombres único, evitando conflictos de denominación entre recursos de diferentes equipos o aplicaciones.
- Gestión de Permisos y Políticas: Permiten asociar mecanismos de autenticación, autorización y políticas de seguridad a segmentos específicos del clúster, delegando el control administrativo a usuarios de confianza dentro de cada espacio.
- Control de Consumo de Recursos: Habilitan la imposición de límites en la cantidad de recursos (CPU, memoria, almacenamiento) que cada namespace puede consumir, lo que previene que un equipo monopolice los recursos del clúster y afecte a otros.
En esencia, los namespaces permiten a los operadores de clústeres ofrecer un servicio multi-inquilino seguro y eficiente, donde cada inquilino (equipo, proyecto) tiene su propio entorno virtualizado con sus reglas, recursos y límites definidos.
Namespaces y Resolución DNS
Cuando se despliega un servicio en Kubernetes, se generan entradas DNS correspondientes que facilitan su descubrimiento. El formato estándar para estas entradas es <nombre-del-servicio>.<nombre-del-namespace>.svc.cluster.local.
Esto implica que, si un contenedor intenta comunicarse con un servicio utilizando solo su <nombre-del-servicio>, el sistema DNS de Kbuernetes lo resolverá automáticamente dentro del namespace actual. Esta característica es muy útil para mantener la portabilidad de configuraciones entre diferentes entornos (por ejemplo, desarrollo, staging, producción) que usan nombres de servicio idénticos.
Sin embargo, para acceder a un servicio que reside en un namespace diferente, es necesario utilizar el nombre de dominio completamente calificado (FQDN) del servicio (<nombre-del-servicio>.<nombre-del-namespace>.svc.cluster.local) para asegurar una resolución correcta.