# Prueba tu despliegue de Ruby on Rails


## Prerrequisitos

- Completa todas las secciones anteriores de esta guía, comenzando con [Contenerizar una aplicación de Ruby on Rails](/guides/ruby/deploy/containerize/).
- [Activar Kubernetes](/desktop/use-desktop/kubernetes/#enable-kubernetes) en Docker Desktop.

---

## Resumen

En esta sección, aprenderás a utilizar Docker Desktop para desplegar tu aplicación en un entorno de Kubernetes completo en tu máquina de desarrollo. Esto te permite probar y depurar tus cargas de trabajo en Kubernetes localmente antes del despliegue.

---

## Crea un archivo YAML de Kubernetes

En tu directorio `docker-ruby-on-rails`, crea un archivo llamado `docker-ruby-on-rails-kubernetes.yaml`. Abre el archivo en un IDE o editor de texto y agrega el siguiente contenido. Reemplaza `DOCKER_USERNAME/REPO_NAME` con tu nombre de usuario de Docker y el nombre del repositorio que creaste en [Configura CI/CD para tu aplicación de Ruby on Rails](/guides/ruby/deploy/configure-github-actions/).

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: docker-ruby-on-rails-demo
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      service: ruby-on-rails
  template:
    metadata:
      labels:
        service: ruby-on-rails
    spec:
      containers:
        - name: ruby-on-rails-container
          image: DOCKER_USERNAME/REPO_NAME
          imagePullPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: docker-ruby-on-rails-demo
  namespace: default
spec:
  type: NodePort
  selector:
    service: ruby-on-rails
  ports:
    - port: 3000
      targetPort: 3000
      nodePort: 30001
```

En este archivo YAML de Kubernetes, hay dos objetos, separados por `---`:

- Un Deployment, que describe un grupo escalable de pods idénticos. En este caso, obtendrás solo una réplica, o copia de tu pod. Ese pod, que se describe bajo `template`, contiene un solo contenedor. El contenedor se crea a partir de la imagen compilada por GitHub Actions en [Configura CI/CD para tu aplicación de Ruby on Rails](/guides/ruby/deploy/configure-github-actions/).
- Un servicio tipo NodePort, que redirigirá el tráfico desde el puerto 30001 en tu host al puerto 8001 dentro de los pods a los que se dirige, permitiéndote acceder a tu aplicación desde la red.

Para obtener más información sobre los objetos de Kubernetes, consulta la [documentación de Kubernetes](https://kubernetes.io/docs/home/).

---

## Despliega y comprueba tu aplicación

1. En una terminal, navega a `docker-ruby-on-rails` y despliega tu aplicación en Kubernetes.

   ```console
   $ kubectl apply -f docker-ruby-on-rails-kubernetes.yaml
   ```

   Deberías ver una salida como la siguiente, indicando que tus objetos de Kubernetes se crearon con éxito.

   ```shell
   deployment.apps/docker-ruby-on-rails-demo created
   service/docker-ruby-on-rails-demo created
   ```

2. Asegúrate de que todo haya funcionado listando tus despliegues.

   ```console
   $ kubectl get deployments
   ```

   Tu despliegue debería listarse de la siguiente manera:

   ```shell
   NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
   docker-ruby-on-rails-demo  1/1     1            1           15s
   ```

   Esto indica que el pod solicitado en tu archivo YAML está activo y en funcionamiento. Realiza la misma comprobación para tus servicios.

   ```console
   $ kubectl get services
   ```

   Deberías obtener una salida como la siguiente.

   ```shell
   NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
   kubernetes                  ClusterIP   10.96.0.1       <none>        443/TCP          23h
   docker-ruby-on-rails-demo   NodePort    10.99.128.230   <none>        3000:30001/TCP   75s
   ```

   Además del servicio predeterminado `kubernetes`, puedes ver tu servicio `docker-ruby-on-rails-demo`, aceptando tráfico en el puerto 30001/TCP.

3. Para crear y migrar la base de datos en una aplicación de Ruby on Rails ejecutándose en Kubernetes, debes seguir estos pasos.

   **Obtén los pods actuales**:  
   Primero, debes identificar los pods que se ejecutan en tu clúster de Kubernetes. Ejecuta el siguiente comando para listar los pods actuales en el espacio de nombres `default`:

   ```sh
   # Obtener los pods actuales en el clúster en el espacio de nombres (namespace) default
   $ kubectl get pods
   ```

   Este comando mostrará una lista de todos los pods en el espacio de nombres `default`. Busca el pod con el prefijo `docker-ruby-on-rails-demo-`. Aquí tienes un ejemplo de salida:

   ```console
   NAME                                         READY   STATUS    RESTARTS      AGE
   docker-ruby-on-rails-demo-7cbddb5d6f-qh44l   1/1     Running   2 (22h ago)   9d
   ```

   **Ejecuta el comando de migración**:  
   Una vez que hayas identificado el pod correcto, utiliza el comando `kubectl exec` para ejecutar la migración de la base de datos dentro del pod.

   ```sh
   $ kubectl exec -it docker-ruby-on-rails-demo-7cbddb5d6f-qh44l -- rails db:migrate RAILS_ENV=development
   ```

   Este comando abre una sesión de terminal interactiva (`-it`) en el pod especificado y ejecuta el comando `rails db:migrate` con el entorno configurado en desarrollo (`RAILS_ENV=development`).

   Siguiendo estos pasos, te aseguras de que tu base de datos se migre correctamente dentro de la aplicación de Ruby on Rails que se ejecuta en tu clúster de Kubernetes. Este proceso ayuda a mantener la integridad y la coherencia de la estructura de datos de tu aplicación durante el despliegue y las actualizaciones.

4. Abre el navegador y ve a [http://localhost:30001](http://localhost:30001), deberías ver la aplicación de Ruby on Rails funcionando.

5. Ejecuta el siguiente comando para retirar tu aplicación.

   ```console
   $ kubectl delete -f docker-ruby-on-rails-kubernetes.yaml
   ```

---

## Resumen

En esta sección, aprendiste a utilizar Docker Desktop para desplegar tu aplicación en un entorno de Kubernetes completo en tu máquina de desarrollo.

Información relacionada:

- [Documentación de Kubernetes](https://kubernetes.io/docs/home/)
- [Desplegar en Kubernetes con Docker Desktop](/desktop/use-desktop/kubernetes/)
- [Resumen del modo Swarm](/engine/swarm/)

