Día 03 - Crear un Namespace y desplegar un Pod en él
Problema / Desafío
Crear un Namespace llamado dev y desplegar un Pod llamado dev-nginx-pod con la imagen nginx:latest dentro de ese Namespace.
Solución
---
apiVersion: v1
kind: Namespace
metadata:
name: dev
labels:
name: dev
---
apiVersion: v1
kind: Pod
metadata:
name: dev-nginx-pod
namespace: dev
labels:
name: dev-nginx-pod
spec:
containers:
- name: dev-nginx-pod
image: nginx:latest
Desglose del manifiesto
Este archivo define dos recursos separados por ---, que es el separador de documentos en YAML. Kubernetes los procesa en orden: primero crea el Namespace y luego el Pod dentro de él.
Recurso 1: Namespace
kind: Namespace: Un Namespace es un mecanismo de Kubernetes para dividir los recursos del clúster en grupos lógicos aislados. Funciona como una "carpeta virtual" que permite organizar, aislar y controlar el acceso a los recursos.
metadata.name: dev: El nombre del Namespace. Se usa como referencia en otros recursos con el campo namespace:.
metadata.labels: Labels asignados al Namespace. Los labels son pares clave-valor que permiten identificar y filtrar recursos. En este caso name: dev permite buscar el Namespace con selectores como kubectl get ns -l name=dev.
Recurso 2: Pod
metadata.namespace: dev: Indica que este Pod se crea dentro del Namespace dev. Sin este campo, el Pod se crearía en el Namespace default.
metadata.labels: Labels del Pod. A diferencia del Namespace, estos labels se usan para que controladores como Deployments o Services identifiquen y seleccionen este Pod.
spec.containers: Lista de contenedores que corren dentro del Pod. Cada contenedor necesita un name y una image.
¿Qué es un Namespace y para qué sirve?
Los Namespaces resuelven el problema de organizar recursos en clústeres compartidos por múltiples equipos o ambientes:
| Caso de uso | Ejemplo |
|---|---|
| Separar ambientes | dev, staging, production |
| Separar equipos | team-backend, team-frontend |
| Aislar aplicaciones | app-payments, app-auth |
| Aplicar políticas | Resource Quotas, Network Policies por Namespace |
Kubernetes crea estos Namespaces por defecto:
| Namespace | Propósito |
|---|---|
default |
Donde se crean los recursos si no se especifica un Namespace |
kube-system |
Componentes internos de Kubernetes (API server, scheduler, etc.) |
kube-public |
Recursos accesibles públicamente sin autenticación |
kube-node-lease |
Objetos Lease para heartbeats de los nodos |
¿Por qué usar un solo archivo con ---?
El separador --- permite definir múltiples recursos en un solo archivo YAML. Kubernetes los aplica en orden secuencial, lo cual es útil cuando un recurso depende de otro (el Pod necesita que el Namespace exista primero).
La alternativa sería tener archivos separados:
Ambos enfoques son válidos. Un solo archivo es más práctico cuando los recursos están relacionados y se despliegan juntos.
Aplicar y verificar
# Aplicar el manifiesto (crea Namespace y Pod)
kubectl apply -f namespace-dev-pod.yml
# Ver los namespaces
kubectl get namespaces
# Ver el Pod en el namespace dev
kubectl get pods -n dev
# Ver detalles del Pod
kubectl describe pod dev-nginx-pod -n dev
# Ver todos los recursos en el namespace dev
kubectl get all -n dev
La flag -n dev es necesaria para ver recursos dentro del Namespace dev. Sin ella, kubectl solo muestra recursos del Namespace default.
Comandos imperativos equivalentes
# Crear el namespace
kubectl create namespace dev
# Crear el pod en el namespace dev
kubectl run dev-nginx-pod --image=nginx:latest -n dev
Troubleshooting
| Problema | Solución |
|---|---|
Error: namespaces "dev" not found al crear el Pod |
Asegurar que el Namespace se define antes del Pod en el archivo, o crearlo primero con kubectl create namespace dev |
El Pod no aparece con kubectl get pods |
Agregar -n dev al comando. Sin -n, solo muestra el Namespace default |
Pod en estado ImagePullBackOff |
Verificar que la imagen nginx:latest existe y que el nodo tiene acceso al registry |
Pod en estado Pending |
Verificar recursos disponibles con kubectl describe pod dev-nginx-pod -n dev y revisar la sección Events |