Saltar a contenido

Despliegue con Kubernetes

Introducción

Kubernetes (K8s) es una plataforma de orquestación de contenedores que permite automatizar el despliegue, escalado y gestión de aplicaciones en contenedores.

Estructura del Proyecto

Para desplegar una aplicación Spring Boot en Kubernetes, necesitamos crear una carpeta k8s/ en la raíz del proyecto con los siguientes archivos:

proyecto/
├── src/
├── pom.xml
└── k8s/
    ├── deployment.yaml

Componentes Básicos

1. Deployment

El Deployment es el componente que gestiona los pods de tu aplicación. Define:

  • La imagen Docker a utilizar
  • El número de réplicas
  • Los puertos que expone el contenedor
  • Recursos (CPU, memoria)

2. Service

El Service expone tu aplicación dentro del clúster de Kubernetes. Permite la comunicación entre pods y actúa como un balanceador de carga interno.

3. Ingress

El Ingress gestiona el acceso externo a tu aplicación mediante HTTP/HTTPS. Define las reglas de enrutamiento basadas en nombres de dominio y rutas.

Archivos de Configuración

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: <nombredelapp>
  namespace: <nombredelnamespace>
spec:
  replicas: 2
  selector:
    matchLabels:
      app: <nombredelapp>
  template:
    metadata:
      labels:
        app: <nombredelapp>
    spec:
      imagePullSecrets:
      - name: ghcr-secret
      containers:
      - name: <nombredelapp>
        image: ghcr.io/<dueniorepo>/<nombredelrepo>:latest
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: <nombredelapp>
  namespace: <nombredelnamespace>
spec:
  selector:
    app: <nombredelapp>
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
   name: <nombredelapp>
   namespace: <nombredelnamespace>
spec:
   ingressClassName: public
   rules:
   - host: <grupo>.inphotech.co
     http:
       paths:
       - path: /
         pathType: Prefix
         backend:
           service:
             name: <nombredelapp>
             port:
               number: 8080

Notas Importantes

  1. Imagen Docker: Asegúrate de que tu aplicación Spring Boot esté correctamente empaquetada en una imagen Docker
  2. Puerto: Por defecto Spring Boot usa el puerto 8080
  3. Ingress Controller: Necesitas tener un Ingress Controller instalado en tu clúster (como NGINX Ingress Controller)
  4. DNS: El dominio configurado en el Ingress debe apuntar a tu clúster de Kubernetes

2. Crear el Secret en Kubernetes

Antes del primer despliegue, crea el secret para descargar imágenes de GitHub:

kubectl create secret docker-registry ghcr-secret \
  --docker-server=ghcr.io \
  --docker-username=TU_USUARIO_GITHUB \
  --docker-password=TU_TOKEN_GITHUB \
  --docker-email=TU_EMAIL

¿Qué hace cada paso?

  1. Checkout código: Descarga el código del repositorio
  2. Configurar Java: Instala Java 17
  3. Compilar con Maven: Genera el archivo JAR
  4. Login a GitHub Container Registry: Se autentica con GITHUB_TOKEN automático
  5. Construir y subir imagen: Crea la imagen y la sube a ghcr.io
  6. Configurar kubectl: Instala kubectl en el runner
  7. Configurar acceso a Kubernetes: Configura las credenciales del clúster
  8. Desplegar a Kubernetes: Aplica los archivos YAML y reinicia el deployment

Verificar el Despliegue

Entrar a: https://javeriana.inphotech.co/k8smonitor Buscar el namespace y el estado del pod y del service

Ver el Progreso

Puedes ver el progreso del workflow en la pestaña Actions de tu repositorio en GitHub.