Red, configuración y datos
Cómo llega el tráfico a tus Pods, cómo se encuentran entre sí, cómo reciben configuración y dónde guardan datos.
Tipos de Service y sus puertos
Cada tipo agrega una capa sobre el anterior.
¿Cuál uso?
| Tipo | Accesible desde | Uso típico |
|---|---|---|
ClusterIP | Solo dentro del cluster | Bases de datos, APIs internas (monguito) |
NodePort | IP del nodo : 30000–32767 | Pruebas locales sin Ingress |
LoadBalancer | IP externa | Producción en cloud (AKS, EKS, GKE) |
| Ingress / Gateway | Dominio HTTP(S) | Varias apps web detrás de una sola entrada |
Headless (clusterIP: None) | DNS directo a cada Pod | StatefulSets (réplicas de DB) |
Los 4 puertos
| Campo | Dónde | Ejemplo |
|---|---|---|
containerPort | Deployment: donde escucha la app | 3000 |
targetPort | Service: a qué puerto del Pod manda | 3000 |
port | Service: el puerto “público” del Service | 80 |
nodePort | Service NodePort: puerto en el nodo | 30080 |
El error más común: targetPort distinto del puerto real de la app. El Service existe pero responde connection refused.
DNS interno
Cada Service tiene un nombre resoluble desde cualquier Pod. Igual que el nombre de servicio en compose.
Formas del nombre
| Nombre | Funciona desde |
|---|---|
monguito | Pods del mismo namespace |
monguito.datos | Cualquier namespace (<service>.<namespace>) |
monguito.datos.svc.cluster.local | Nombre completo (FQDN) |
mongodb://mati:<password>@monguito:27017/miapp?authSource=admin
Si el Service de Mongo se llama monguito, tu app.js no cambia al pasar de compose a Kubernetes.
Probar la resolución
kubectl run tmp --rm -it --image=busybox -- nslookup monguitokubectl run tmp --rm -it --image=busybox -- wget -qO- http://chanchitokubectl get endpoints chanchitoIngress: una entrada, varios destinos
Rutea por host y path. El YAML está en Manifiestos.
El objeto Ingress son solo reglas; sin un controller instalado no hace nada. El proyecto Kubernetes retiró ingress-nginx en 2026: para algo nuevo usá Traefik u otro controller, o directamente Gateway API.
ConfigMap y Secret: tres formas de usarlos
Como variables sueltas, como todas las variables juntas, o como archivos.
env (una variable)
env:
- name: MONGO_PASSWORD
valueFrom:
secretKeyRef:
name: mongo-secret
key: MONGO_PASSWORD
- name: MONGO_HOST
valueFrom:
configMapKeyRef:
name: chanchito-config
key: MONGO_HOST
envFrom (todas)
envFrom:
- configMapRef:
name: chanchito-config
- secretRef:
name: mongo-secret
Armar la URL con variables: value: mongodb://$(MONGO_USER):$(MONGO_PASSWORD)@monguito:27017/miapp?authSource=admin (declarando antes las variables).
Como archivos
containers:
- name: chanchito
volumeMounts:
- name: config
mountPath: /etc/config
readOnly: true
volumes:
- name: config
configMap:
name: chanchito-config
Si cambiás un ConfigMap/Secret, las variables de entorno no se actualizan solas: hacé kubectl rollout restart deploy/chanchito. Los archivos montados sí se actualizan (con algo de demora).
Almacenamiento: PVC → PV → disco
El Pod pide, el cluster provee. Vos normalmente solo escribís el PVC.
accessModes
| Modo | Significado |
|---|---|
ReadWriteOnce (RWO) | Lectura/escritura desde un nodo. Lo normal para DBs |
ReadOnlyMany (ROX) | Solo lectura desde varios nodos |
ReadWriteMany (RWX) | Escritura desde varios nodos (requiere NFS o similar) |
ReadWriteOncePod | Un único Pod |
Comandos y cuidados
kubectl get pvc
kubectl get pv
kubectl get storageclassCon reclaimPolicy: Delete (el default en la mayoría), borrar el PVC borra los datos. kubectl delete -f k8s/ incluye el PVC si está en esa carpeta.
emptyDir: volumen temporal que vive lo que vive el Pod (caché, archivos compartidos entre contenedores del mismo Pod).
Deployment vs StatefulSet
Para una base de datos con réplicas, StatefulSet.
Diferencias
| Deployment | StatefulSet | |
|---|---|---|
| Nombres de Pods | Aleatorios (-x2k4) | Fijos y ordenados (-0, -1) |
| Disco | Un PVC compartido | Un PVC por réplica (volumeClaimTemplates) |
| Orden de arranque | Todos a la vez | De a uno, en orden |
| DNS por Pod | No | Sí, con Service headless |
| Ideal para | APIs, frontends, workers | Mongo/Postgres con réplicas, Kafka |
Para aprender y en local, Mongo con Deployment + PVC + 1 réplica alcanza. En producción, mejor una base gestionada o un operator.
StatefulSet mínimo
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: monguito
spec:
serviceName: monguito # Service headless
replicas: 1
selector:
matchLabels: { app: monguito }
template:
metadata:
labels: { app: monguito }
spec:
containers:
- name: mongo
image: mongo:7
ports: [{ containerPort: 27017 }]
volumeMounts:
- { name: datos, mountPath: /data/db }
volumeClaimTemplates: # un PVC por Pod
- metadata: { name: datos }
spec:
accessModes: [ReadWriteOnce]
resources: { requests: { storage: 1Gi } }