# Desplegar en Kubernetes


## Requisitos previos

- Descarga e instala Docker Desktop como se describe en [Obtener Docker](/get-started/get-docker/).
- Completa los pasos para contenerizar una aplicación en la [Parte 2](/guides/kube-deploy/02_our_app/).
- Asegúrate de que Kubernetes esté activado en Docker Desktop:
  Si Kubernetes no está funcionando, sigue las instrucciones de [Orquestación](/guides/kube-deploy/orchestration/) para terminar de configurarlo.

## Introducción

Ahora que has demostrado que los componentes individuales de tu aplicación se ejecutan como contenedores independientes, es hora de organizarlos para que sean gestionados por un orquestador como Kubernetes. Kubernetes proporciona muchas herramientas para escalar, conectar en red, proteger y mantener tus aplicaciones contenerizadas, más allá de las capacidades de los contenedores por sí mismos.

Para validar que tu aplicación contenerizada funciona bien en Kubernetes, utilizarás el entorno de Kubernetes integrado en Docker Desktop directamente en tu máquina de desarrollo para desplegar tu aplicación, antes de pasarla a un clúster de Kubernetes completo en producción. El entorno de Kubernetes creado por Docker Desktop cuenta con _todas las funciones disponibles_, lo que significa que tiene todas las características de Kubernetes que tu aplicación disfrutará en un clúster real, accesibles desde la comodidad de tu máquina de desarrollo.

## Describir aplicaciones usando YAML de Kubernetes

Todos los contenedores en Kubernetes se programan como pods, que son grupos de contenedores ubicados en el mismo lugar que comparten algunos recursos. Además, en una aplicación del mundo real casi nunca se crean pods individuales. En su lugar, la mayoría de tus cargas de trabajo se programan como despliegues (deployments), que son grupos escalables de pods mantenidos automáticamente por Kubernetes. Por último, todos los objetos de Kubernetes pueden y deben describirse en manifiestos llamados archivos YAML de Kubernetes. Estos archivos YAML describen todos los componentes y configuraciones de tu aplicación de Kubernetes y se pueden usar para crear y destruir tu aplicación en cualquier entorno de Kubernetes.

Ya escribiste un archivo YAML de Kubernetes básico en la parte de descripción general de Orquestación de este tutorial. Ahora, puedes escribir un archivo YAML ligeramente más sofisticado para ejecutar y administrar tu aplicación Todo, usando la imagen de contenedor `getting-started` creada en la [Parte 2](/guides/kube-deploy/02_our_app/) del tutorial de inicio rápido. Coloca lo siguiente en un archivo llamado `bb.yaml`:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bb-demo
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      bb: web
  template:
    metadata:
      labels:
        bb: web
    spec:
      containers:
        - name: bb-site
          image: getting-started
          imagePullPolicy: Never
---
apiVersion: v1
kind: Service
metadata:
  name: bb-entrypoint
  namespace: default
spec:
  type: NodePort
  selector:
    bb: web
  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 `replica`, o copia de tu pod, y ese pod (que se describe bajo la clave `template:`) tiene un solo contenedor dentro, basado en tu imagen `getting-started` del paso anterior en este tutorial.
- Un servicio `NodePort`, que enrutará el tráfico desde el puerto 30001 en tu host al puerto 3000 dentro de los pods a los que se dirige, lo que te permitirá acceder a tu aplicación Todo desde la red.

Además, ten en cuenta que aunque el YAML de Kubernetes puede parecer largo y complicado al principio, casi siempre sigue el mismo patrón:

- La `apiVersion`, que indica la API de Kubernetes que analiza este objeto
- El `kind` (tipo) que indica qué tipo de objeto es
- Algunos metadatos (`metadata`) que aplican cosas como nombres a tus objetos
- La especificación (`spec`) que detalla todos los parámetros y configuraciones de tu objeto.

## Desplegar y verificar tu aplicación

1. En una terminal, navega a donde creaste `bb.yaml` y despliega tu aplicación en Kubernetes:

   ```console
   $ kubectl apply -f bb.yaml
   ```

   Deberías ver una salida como la siguiente, que indica que tus objetos de Kubernetes se crearon correctamente:

   ```shell
   deployment.apps/bb-demo created
   service/bb-entrypoint created
   ```

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

   ```console
   $ kubectl get deployments
   ```

   Si todo va bien, tu despliegue debería listarse de la siguiente manera:

   ```shell
   NAME      READY   UP-TO-DATE   AVAILABLE   AGE
   bb-demo   1/1     1            1           40s
   ```

   Esto indica que el único pod que solicitaste en tu YAML está activo y ejecutándose. Realiza la misma comprobación para tus servicios:

   ```console
   $ kubectl get services

   NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
   bb-entrypoint   NodePort    10.106.145.116   <none>        3000:30001/TCP   53s
   kubernetes      ClusterIP   10.96.0.1        <none>        443/TCP          138d
   ```

   Además del servicio `kubernetes` predeterminado, vemos nuestro servicio `bb-entrypoint` aceptando tráfico en el puerto 30001/TCP.

3. Abre un navegador y visita tu aplicación Todo en `localhost:30001`. Deberías ver tu aplicación Todo, igual que cuando la ejecutaste como un contenedor independiente en la [Parte 2](/guides/kube-deploy/02_our_app/) del tutorial.

4. Una vez satisfecho, elimina tu aplicación:

   ```console
   $ kubectl delete -f bb.yaml
   ```

## Conclusión

En este punto, has utilizado con éxito Docker Desktop para desplegar tu aplicación en un entorno de Kubernetes completo en tu máquina de desarrollo. Ahora puedes agregar otros componentes a tu aplicación y aprovechar todas las características y el poder de Kubernetes, directamente en tu propia máquina.

Además de despliegue en Kubernetes, también has descrito tu aplicación en un archivo YAML de Kubernetes. Este simple archivo de texto contiene todo lo que necesitas para crear tu aplicación en un estado de ejecución. Puedes registrarlo en tu control de versiones y compartirlo con tus colegas. Esto te permite distribuir tus aplicaciones a otros clústeres (como los clústeres de prueba y producción que probablemente vengan después de tus entornos de desarrollo).

## Referencias de Kubernetes

Más documentación sobre todos los objetos de Kubernetes nuevos utilizados en este artículo está disponible aquí:

- [Pods de Kubernetes](https://kubernetes.io/docs/concepts/workloads/pods/pod/)
- [Despliegues (Deployments) de Kubernetes](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/)
- [Servicios de Kubernetes](https://kubernetes.io/docs/concepts/services-networking/service/)

