Docker & KubernetesKubernetes FundamentosLección 8 de 12
Services y Networking en Kubernetes
Los Pods son efimeros — se crean y destruyen constantemente. Un Service proporciona una IP estable y un nombre DNS para acceder a un grupo de Pods.
Tipos de Service:
• ClusterIP (default): Solo accesible dentro del cluster. Ideal para comunicacion entre microservicios. • NodePort: Expone el servicio en un puerto fijo (30000-32767) en cada nodo. Accesible desde fuera del cluster. • LoadBalancer: Crea un load balancer externo (en cloud providers como AWS/GCP/Azure). La forma estandar de exponer apps al internet. • ExternalName: Alias DNS a un servicio externo.
# service-clusterip.yaml
apiVersion: v1
kind: Service
metadata:
name: api-service
spec:
type: ClusterIP
selector:
app: mi-app # selecciona pods con label app=mi-app
ports:
- port: 80 # puerto del Service
targetPort: 3000 # puerto del contenedor
protocol: TCP
---
# service-loadbalancer.yaml
apiVersion: v1
kind: Service
metadata:
name: api-public
spec:
type: LoadBalancer
selector:
app: mi-app
ports:
- port: 80
targetPort: 3000
# ingress.yaml — routing avanzado de trafico HTTP
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: mi-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: api.midominio.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- host: web.midominio.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 80
# network-policy.yaml — restringir trafico entre pods
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-solo-desde-api
spec:
podSelector:
matchLabels:
app: postgres
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: mi-app
ports:
- protocol: TCP
port: 5432
# Solo pods con label app=mi-app pueden conectarse a postgres:5432
# Comandos para Services
kubectl get services
kubectl get svc # alias corto
# Ver endpoints (pods reales detras del service)
kubectl get endpoints api-service
# DNS interno: desde cualquier pod puedes acceder a:
# api-service.default.svc.cluster.local
# o simplemente: api-service (mismo namespace)
# Probar conectividad desde un pod temporal
kubectl run debug --rm -it --image=busybox -- sh
# Dentro del pod:
# wget -qO- http://api-service:80
# Ver Ingress
kubectl get ingress
kubectl describe ingress mi-ingress
ConsejoUsa ClusterIP para servicios internos (DB, cache, APIs internas). Usa LoadBalancer o Ingress solo para lo que necesita acceso externo. Menos exposicion = mas seguridad.
Practica esta lección
Resuelve los ejercicios del curso de Docker & Kubernetes en la app, gratis y con corrección automática.
Empezar a practicar