Archivos de configuración de aplicaciones

Uno de los usos más extendidos de YAML es la configuración de aplicaciones y servicios. Su sintaxis clara lo volvió el formato predilecto en herramientas de DevOps como Docker Compose y Kubernetes.

11.1 Docker Compose (docker-compose.yml)

¿Qué es Docker Compose? Permite definir y ejecutar aplicaciones multi-contenedor desde un único archivo YAML que describe servicios, redes y volúmenes.

Ejemplo: aplicación web con base de datos

version: "3.9"

services:
  app:
    image: miapp:1.0
    container_name: app_container
    ports:
      - "8080:8080"
    environment:
      - DB_HOST=db
      - DB_USER=root
      - DB_PASSWORD=1234
    depends_on:
      - db

  db:
    image: mysql:8.0
    container_name: db_container
    environment:
      MYSQL_ROOT_PASSWORD: 1234
      MYSQL_DATABASE: miappdb
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

Explicación:

  • version: versión del esquema.
  • services: define los contenedores (app y db).
  • app: servicio que expone el puerto 8080.
  • db: servicio MySQL con volumen persistente.
  • volumes: asegura que los datos sobrevivan a reinicios.

Ejecución: docker-compose up -d levanta todo el stack.

11.2 Kubernetes (deployment.yaml y service.yaml)

Kubernetes describe el estado deseado de pods, servicios, deployments, configmaps y más a través de archivos YAML.

Deployment (deployment.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mi-app
  labels:
    app: mi-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: mi-app
  template:
    metadata:
      labels:
        app: mi-app
    spec:
      containers:
        - name: mi-app-container
          image: miapp:1.0
          ports:
            - containerPort: 8080

Claves: replicas define la cantidad de instancias; selector y labels enlazan el Deployment con los pods correctos; containers especifica imagen y puertos.

Aplicación: kubectl apply -f deployment.yaml

Service (service.yaml)

apiVersion: v1
kind: Service
metadata:
  name: mi-app-service
spec:
  selector:
    app: mi-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP

Claves: selector conecta el Service con los pods etiquetados app: mi-app; ports define la redirección; type determina el alcance (interno con ClusterIP).

Aplicación: kubectl apply -f service.yaml

11.3 Deployment y Service juntos

Podemos declarar varios objetos en un único archivo usando separadores ---.

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mi-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: mi-app
  template:
    metadata:
      labels:
        app: mi-app
    spec:
      containers:
        - name: mi-app-container
          image: miapp:1.0
          ports:
            - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: mi-app-service
spec:
  selector:
    app: mi-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP

Aplicación conjunta: kubectl apply -f mi-app.yaml

11.4 Docker Compose vs Kubernetes

Aspecto Docker Compose Kubernetes
Enfoque Despliegue local y sencillo Orquestación de clústeres a gran escala
Archivo YAML docker-compose.yml Archivos por recurso (deployment.yaml, service.yaml, etc.)
Escalabilidad Limitada (escala manual) Escalado automático con réplicas/autoscaling
Complejidad Fácil de aprender Más complejo y potente

11.5 Buenas prácticas

  • Mantén la indentación uniforme para evitar errores de despliegue.
  • Documenta los bloques con comentarios claros.
  • Divide configuraciones grandes en varios archivos (por ejemplo: deployment.yaml, service.yaml, configmap.yaml).
  • Usa variables de entorno para ocultar credenciales.
  • Versiona los YAML en Git para auditoría y CI/CD.

En definitiva, YAML es la base de la configuración en Docker Compose y Kubernetes, pilares del ecosistema DevOps. Dominar archivos como docker-compose.yml, deployment.yaml y service.yaml es esencial para desplegar aplicaciones modernas.