Services: Acceso a Aplicaciones

Resumen de una línea

Service proporciona acceso estable a Deployments mediante IP virtual y DNS, con tipos: ClusterIP, NodePort, LoadBalancer, e Ingress para HTTP.

Información

Problema: Acceso a Pods Efímeros

Deployment: web-app ×3 Pods
Pods tienen IP: 10.0.0.1, 10.0.0.2, 10.0.0.3 (efímeras)

Problema:
- IPs cambian cuando Pod muere
- ¿A cuál Pod conectarse?
- ¿Cómo balancear carga?

Solución: Service

Concepto: Service

Service = punto de acceso estable a Pods dinámicos

apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  type: ClusterIP
  selector:
    app: web       # Selecciona Pods con este label
  ports:
  - port: 80
    targetPort: 8080

Tipos de Services

1. ClusterIP (Interno)

type: ClusterIP
Service IP: 10.96.0.1 (interna)
Acceso: Dentro del clúster
Ejemplo: servicio de bases de datos interno

Uso:

# Desde otro Pod
curl http://web-service:80
# Kubernetes DNS resuelve automáticamente

2. NodePort (Externo)

type: NodePort
spec:
  ports:
  - port: 80
    targetPort: 8080
    nodePort: 30000  # Puerto en cada nodo (30000-32767)
Acceso: NodeIP:30000
Ejemplo: http://192.168.1.100:30000

Uso: Acceso desde fuera del clúster (desarrollo)

3. LoadBalancer (Cloud)

type: LoadBalancer
Cloud crea Load Balancer externo
IP pública asignada automáticamente
Ejemplo: http://load-balancer-ip

Uso: Producción en cloud (AWS, GCP, Azure)

4. ExternalName

type: ExternalName
externalName: example.com

CNAME a servicio externo

DNS en Kubernetes

Kubernetes proporciona DNS interno:

Service: web-service
Namespace: default

Resolucion:
- web-service → 10.96.0.1
- web-service.default → 10.96.0.1
- web-service.default.svc.cluster.local → 10.96.0.1

Descubrimiento de Servicios

# Dentro de un Pod
curl http://db-service:5432
# Kubernetes DNS resuelve automáticamente

Ingress Controller

Para HTTP/HTTPS avanzado (routing por URL/host):

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /app1
        pathType: Prefix
        backend:
          service:
            name: app1-service
            port:
              number: 80
      - path: /app2
        pathType: Prefix
        backend:
          service:
            name: app2-service
            port:
              number: 80
http://example.com/app1 → app1-service
http://example.com/app2 → app2-service

Operaciones Comunes

Crear Service

# Imperativo
kubectl expose deployment web-app --type=ClusterIP --port=80
 
# Declarativo
kubectl apply -f service.yaml

Ver Services

# Listar
kubectl get svc
 
# Detalles
kubectl describe svc web-service
 
# Endpoints (Pods asociados)
kubectl get endpoints web-service

Acceder a Service

# Desde dentro del clúster
kubectl exec -it pod-name -- curl http://web-service
 
# Port forward (desarrollo)
kubectl port-forward svc/web-service 8080:80
# Luego: http://localhost:8080

Parámetros Clave

Parámetro Función

type ClusterIP, NodePort, LoadBalancer selector Labels de Pods a balancear port Puerto del Service targetPort Puerto del contenedor nodePort Puerto en nodo (NodePort)

Relaciones

Conecta con

Fuentes