Tabla de Contenidos

Kubernetes: desplegar una aplicación en el clúster

Paso 1: Crear un Deployment (Despliegue) para tu Aplicación

Un Deployment es un controlador de Kubernetes que gestiona un conjunto de Pods para ejecutar una carga de trabajo de aplicación, generalmente una que no mantiene estado. Los Deployments proporcionan actualizaciones declarativas para Pods y ReplicaSets, permitiéndote describir el estado deseado de tu aplicación y dejando que Kubernetes se encargue de alcanzar ese estado de manera controlada.

1. Define tu Deployment en un archivo YAML:

Crea un archivo, por ejemplo, mi-aplicacion-deployment.yaml, con la siguiente estructura. Este ejemplo desplegará una aplicación Nginx simple:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mi-aplicacion-nginx # Nombre de tu despliegue
  labels:
    app: nginx # Etiqueta para identificar tu aplicación
spec:
  replicas: 3 # Número deseado de réplicas (Pods) de tu aplicación [2, 3]
  selector:
    matchLabels:
      app: nginx # Debe coincidir con las etiquetas de los Pods
  template:
    metadata:
      labels:
        app: nginx # Etiquetas que se aplicarán a los Pods creados
    spec:
      containers:
      - name: nginx-container # Nombre del contenedor
        image: nginx:latest # Imagen Docker a utilizar (por ejemplo, Nginx)
        ports:
        - containerPort: 80 # Puerto en el que el contenedor escucha [2, 3]

Explicación de los campos clave:

apiVersion: La versión de la API de Kubernetes que estás utilizando.

kind: El tipo de recurso de Kubernetes que estás creando, en este caso, un Deployment.

metadata: Información sobre el Deployment, como su name y labels. ç

spec: La especificación deseada para el Deployment.

replicas: El número de Pods idénticos que deseas que se ejecuten.

selector: Define cómo el Deployment encuentra los Pods que debe gestionar. matchLabels asegura que los Pods con la etiqueta app: nginx sean parte de este Deployment.

template: La plantilla para los Pods que el Deployment creará.

metadata.labels: Etiquetas que se aplicarán a cada Pod, crucial para que el selector los identifique.

spec.containers: Define los contenedores que se ejecutarán dentro de cada Pod.

name: Nombre del contenedor.

image: La imagen de contenedor que se utilizará (por ejemplo, nginx:latest).

containerPort: El puerto en el que la aplicación dentro del contenedor está escuchando.

2. Aplica el Deployment a tu clúster:

Usa el comando kubectl apply para crear el Deployment:

kubectl apply -f mi-aplicacion-deployment.yaml

3. Verifica el estado del Deployment y los Pods:

Puedes verificar que tu Deployment se ha creado y que los Pods están en ejecución con los siguientes comandos: Bash

kubectl get deployments
kubectl get pods -l app=nginx # Muestra los Pods con la etiqueta 'app: nginx'

Deberías ver tu Deployment listado y los Pods en estado Running.

Paso 2: Exponer la aplicación con un service

Un Service en Kubernetes es una abstracción que define un conjunto lógico de Pods y una política para acceder a ellos. Los Pods tienen direcciones IP efímeras y pueden cambiar, por lo que los Services proporcionan una ubicación estable e inmutable para acceder a un grupo de Pods.

Existen varios tipos de Services, cada uno adecuado para diferentes escenarios de acceso:

1. Service de tipo ClusterIP (Acceso Interno)

Propósito: Este es el tipo de Service predeterminado. Asigna una dirección IP interna al Service, haciéndolo accesible solo desde dentro del clúster. Es ideal para la comunicación entre diferentes componentes de tu aplicación (microservicios).

Cuándo usarlo: Cuando tu aplicación solo necesita ser accesible por otros servicios o Pods dentro del mismo clúster.

Define tu Service ClusterIP en un archivo YAML (por ejemplo, mi-aplicacion-service-clusterip.yaml):

apiVersion: v1
kind: Service
metadata:
  name: mi-aplicacion-service-internal
spec:
  selector:
    app: nginx # Debe coincidir con las etiquetas de los Pods del Deployment
  ports:
    - protocol: TCP
      port: 80 # Puerto en el que el Service expone la aplicación
      targetPort: 80 # Puerto del contenedor al que se redirige el tráfico
  type: ClusterIP

Aplica el Service:

kubectl apply -f mi-aplicacion-service-clusterip.yaml

Verifica el Service:

kubectl get service mi-aplicacion-service-internal

Verás una CLUSTER-IP asignada, que es la IP interna del Service.

2. Service de tipo NodePort (Acceso Externo Básico)

Propósito: Extiende la funcionalidad de ClusterIP. Expone el Service en un puerto estático (generalmente en el rango 30000-32767) en la dirección IP de cada nodo del clúster. Esto permite que la aplicación sea accesible desde fuera del clúster a través de la IP de cualquier nodo y el NodePort asignado.

Cuándo usarlo: Para exponer aplicaciones web o APIs cuando no tienes un balanceador de carga en la nube o para entornos de desarrollo/prueba.

Define tu Service NodePort en un archivo YAML (por ejemplo, mi-aplicacion-service-nodeport.yaml):

apiVersion: v1
kind: Service
metadata:
  name: mi-aplicacion-service-nodeport
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80 # Puerto en el que el Service expone la aplicación
      targetPort: 80 # Puerto del contenedor al que se redirige el tráfico
      nodePort: 30080 # Opcional: puedes especificar un puerto en el rango 30000-32767
  type: NodePort

Aplica el Service:

kubectl apply -f mi-aplicacion-service-nodeport.yaml

Verifica el Service:

kubectl get service mi-aplicacion-service-nodeport

En la columna PORT(S), verás algo como 80:30080/TCP. El 30080 es el NodePort asignado.

Accede a tu aplicación:

Puedes acceder a tu aplicación desde un navegador o curl utilizando la dirección IP de cualquiera de tus nodos y el NodePort asignado:

http://<IP_del_Nodo>:<NodePort> (ej. http://192.168.1.10:30080)

3. Service de tipo LoadBalancer (Acceso Externo Avanzado - Solo en la Nube)

Propósito: Este tipo de Service solo está disponible en entornos de nube (como AWS EKS, Google Kubernetes Engine, Azure Kubernetes Service). Cuando creas un Service de tipo LoadBalancer, Kubernetes provisiona automáticamente un balanceador de carga externo en tu proveedor de nube, asignándole una dirección IP pública.

Cuándo usarlo: Para aplicaciones de producción que necesitan manejar un alto volumen de tráfico y requieren un balanceador de carga externo gestionado.

Define tu Service LoadBalancer en un archivo YAML (por ejemplo, mi-aplicacion-service-loadbalancer.yaml):

apiVersion: v1
kind: Service
metadata:
  name: mi-aplicacion-service-external
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80 # Puerto en el que el Service expone la aplicación
      targetPort: 80 # Puerto del contenedor al que se redirige el tráfico
  type: LoadBalancer

Aplica el Service:

kubectl apply -f mi-aplicacion-service-loadbalancer.yaml

Verifica el Service:

kubectl get service mi-aplicacion-service-external

En la columna EXTERNAL-IP, verás la dirección IP pública asignada por el balanceador de carga de tu proveedor de nube. Puede tardar unos minutos en aparecer.

Accede a tu aplicación:

Una vez que la EXTERNAL-IP esté disponible, puedes acceder a tu aplicación desde un navegador o curl utilizando esa dirección IP pública:

http://<EXTERNAL-IP>.

Paso 3: Verificación y Depuración

Es fundamental verificar el estado de tus recursos y saber cómo depurar si algo no funciona como esperas.

Verificar Deployments:

kubectl get deployments
kubectl describe deployment mi-aplicacion-nginx # Para detalles y eventos [5]

Verificar Pods:

kubectl get pods -o wide # Muestra IPs de Pods y en qué nodo están [4]
kubectl describe pod <nombre_del_pod> # Para detalles, eventos y errores [4, 5]
kubectl logs <nombre_del_pod> # Para ver los logs de tu aplicación [5]

Verificar Services:

kubectl get services
kubectl describe service mi-aplicacion-service-nodeport # Para detalles y eventos

Bibliografía