Despliegue del Proyecto en la nube de AWS (EKS)

Clase 20 de 24Curso de Kubernetes

Resumen

¿Cómo podemos desplegar una aplicación en un clúster de Kubernetes en la nube?

Desplegar una aplicación en un clúster de Kubernetes (K8s) en la nube es un proceso que requerirá varios pasos para asegurar que todos los componentes estén alineados y en operación. A continuación, exploramos el proceso, las configuraciones necesarias y buenas prácticas para lograr una implementación exitosa.

¿Qué prerrequisitos son esenciales?

Para comenzar, asegúrate de cumplir con ciertos prerrequisitos básicos necesarios para el despliegue:

  • Clúster EKS en AWS: debes haber creado previamente un clúster de Elastic Kubernetes Service dentro de tu cuenta de AWS.
  • Base de datos RDS: debes contar con una instancia de base de datos Amazon RDS configurada para que los pods puedan interactuar con esta base de datos.
  • Registries de Docker: tener configurados los registries de Docker necesarios para tus aplicaciones backend y frontend.

Con estos elementos en marcha, estarás listo para proceder al despliegue.

¿Cómo organizamos los recursos en namespaces?

Una práctica común en Kubernetes es segmentar recursos en namespaces, los cuales permiten un orden lógico y organizacional:

  • Namespace para backend: alojando todos los componentes relacionados con la parte del servidor.
  • Namespace para frontend: que incluye todos los componentes de la interfaz de usuario.
  • Namespace para storage: para gestionar la capa de persistencia, como el almacenamiento y bases de datos. Aquí se puede crear un servicio de tipo ExternalName que conecta con la base de datos RDS.

Crear namespaces específicos no solo organiza tus recursos, sino que también ayuda en la configuración de accesos y políticas.

kubectl create namespace backend
kubectl create namespace frontend
kubectl create namespace storage

¿Cómo configuramos la conexión con servicios externos?

Para conectar con una base de datos RDS, puedes usar un servicio ExternalName que apuntará a la base de datos:

apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: storage
spec:
  type: ExternalName
  externalName: tu-endpoint-rds.amazonaws.com

¿Cómo gestionamos información sensible en Kubernetes?

La gestión de datos sensibles en Kubernetes debe manejarse con sumo cuidado. Usar secretos para valores como contraseñas es una buena práctica:

kubectl create secret generic mysql-secret \
  --from-literal=username=admin \
  --from-literal=password=k8s \
  --from-literal=host=tu-endpoint-rds.amazonaws.com \
  -n backend

Para asegurar la confidencialidad, Kubernetes cifra los secretos en almacenamiento, haciéndolos seguros y protegidos.

¿Cómo inicializamos nuestra base de datos?

Inicializar la base de datos puede involucrar la creación de tablas y otros procesos iniciales, definidos a través de scripts. Estos scripts se ejecutan mediante un Job de Kubernetes.

apiVersion: batch/v1
kind: Job
metadata:
  name: init-db
  namespace: backend
spec:
  template:
    spec:
      containers:
        - name: db-init
          image: image-usada-para-initializar
          volumeMounts:
            - name: config-volume
              mountPath: /init-scripts
          envFrom:
            - secretRef:
                name: mysql-secret
      volumes:
        - name: config-volume
          configMap:
            name: db-scripts
      restartPolicy: OnFailure

¿Cómo compilar imágenes para diferentes arquitecturas?

Cuando se trabaja con Docker para diferentes arquitecturas, como en máquinas ARM y clústeres AMD, Buildx se vuelve esencial para la compilación multi-plataforma:

docker buildx build --platform=linux/amd64 -t mi-registry/mi-app:tag .
docker push mi-registry/mi-app:tag

¿Cómo configuramos y desplegamos nuestra aplicación?

Después de compilar, es crucial validar las configuraciones de tu archivo de despliegue:

  1. Validar Deployment YAML: comprueba que la referencia a las imágenes y configuraciones son correctas.

  2. Health Checks: utiliza readiness y liveliness probes para asegurar que el servicio esté disponible y funcionando como se espera.

  3. External Access: configura servicios tipo LoadBalancer para facilitar el acceso exterior a la aplicación.

    apiVersion: apps/v1 kind: Deployment metadata: name: mi-app namespace: backend spec: replicas: 1 selector: matchLabels: app: mi-app template: metadata: labels: app: mi-app spec: containers: - name: mi-app image: mi-registry/mi-app:tag ports: - containerPort: 5001 envFrom: - secretRef: name: mysql-secret

Al asegurar cada uno de estos pasos, podrás desplegar aplicaciones robustas y flexibles en Kubernetes, apoyando a cualquier negocio a alcanzar la escala y eficiencia deseadas. Sigue explorando y adaptando nuevas prácticas para continuar mejorando.