From 2535e1fb60698b00f141122614f8c178471116d7 Mon Sep 17 00:00:00 2001 From: fredpena Date: Sat, 3 Aug 2024 23:06:48 -0400 Subject: [PATCH 1/2] Translation Spanish Chapter 5 --- README-es.md | 2 +- chapter-5/README-es.md | 280 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 281 insertions(+), 1 deletion(-) create mode 100644 chapter-5/README-es.md diff --git a/README-es.md b/README-es.md index c565239..c1b779c 100644 --- a/README-es.md +++ b/README-es.md @@ -18,7 +18,7 @@ algunos proyectos de código abierto. - [Capítulo 2: Desafíos de las aplicaciones nativas en la nube](chapter-2/README-es.md) - [Capítulo 3: Pipelines de servicios: construcción de aplicaciones nativas en la nube](chapter-3/README-es.md) - Capítulo 4: Pipelines de entorno: despliegue de aplicaciones nativas en la nube -- Capítulo 5: Infraestructura multi-nube (App) +- [Capítulo 5: Infraestructura multi-nube (App)](chapter-5/README-es.md) - Capítulo 6: Construyamos una plataforma basada en Kubernetes - Capítulo 7: Capacidades de la plataforma I: Preocupaciones comunes de las aplicaciones - Capítulo 8: Capacidades de la plataforma II: Permitir que los equipos experimenten diff --git a/chapter-5/README-es.md b/chapter-5/README-es.md new file mode 100644 index 0000000..5532adf --- /dev/null +++ b/chapter-5/README-es.md @@ -0,0 +1,280 @@ +# Capítulo 5: Infraestructura multi-nube (App) + +— +_🌍 Disponible +en_: [English](README.md) | [中文 (Chinese)](README-zh.md) | [日本語 (Japanese)](README-ja.md) | [Español](README-es.md) +> **Nota:** Presentado por la fantástica comunidad +> de [ 🌟 contribuidores](https://github.com/salaboy/platforms-on-k8s/graphs/contributors) cloud-native! + +--- + +Este tutorial paso a paso usa Crossplane para aprovisionar las instancias de Redis, PostgreSQL y Kafka para nuestros +servicios de aplicación. + +Usando Crossplane y las Composiciones de Crossplane, nuestro objetivo es unificar cómo se aprovisionan estos +componentes, ocultando su ubicación a los usuarios finales (equipos de aplicaciones). + +Los equipos de aplicaciones deberían poder solicitar estos recursos utilizando un enfoque declarativo, al igual que con +cualquier otro recurso de Kubernetes. Esto permite a los equipos usar Pipelines de Entorno para configurar tanto los +servicios de aplicación como los componentes de infraestructura de aplicación necesarios para la aplicación. + +## Instalación de Crossplane + +Para instalar Crossplane, necesitas tener un clúster de Kubernetes; puedes crear uno usando KinD como hicimos para +ti. [Capítulo 2](../chapter-2/README-es.md#creando-un-clúster-local-con-kubernetes-kind). + +Instalemos [Crossplane](https://crossplane.io) en su propio namespace utilizando Helm + +```shell +helm repo add crossplane-stable https://charts.crossplane.io/stable +helm repo update + +helm install crossplane --namespace crossplane-system --create-namespace crossplane-stable/crossplane --version 1.15.0 --wait +``` + +Luego, instala el proveedor de Helm de Crossplane, junto con un nuevo `ClusterRoleBinding` para que el Proveedor de Helm +pueda instalar Charts en nuestro nombre. + +```shell +kubectl apply -f crossplane/helm-provider.yaml +``` + +Después de unos segundos, si verificas los proveedores configurados, deberías ver que Helm está `INSTALLED` y `HEALTHY`: + +```shell +❯ kubectl get providers.pkg.crossplane.io +NAME INSTALLED HEALTHY PACKAGE AGE +provider-helm True True xpkg.upbound.io/crossplane-contrib/provider-helm:v0.17.0 49s +``` + +Luego, crea un `ProviderConfig` que instruya al Proveedor de Helm a usar la configuración del clúster para instalar +Charts +dentro del clúster. + +```shell +kubectl apply -f crossplane/helm-provider-config.yaml +``` + +Ahora estamos listos para instalar nuestras composiciones de Crossplane para Bases de Datos y Brokers de Mensajes para +proporcionar todos los componentes que nuestra aplicación necesita. + +## Infraestructura de Aplicaciones bajo demanda usando Composiciones de Crossplane + +Necesitamos instalar nuestras Definiciones de Recursos Compuestos de Crossplane (XRDs) para nuestra Base de Datos de +Clave-Valor (Redis), nuestra Base de Datos SQL (PostgreSQL) y nuestro Broker de Mensajes (Kafka). + +```shell +kubectl apply -f resources/definitions +``` + +Ahora instala las composiciones de Crossplane correspondientes y los datos de inicialización: + +```shell +kubectl apply -f resources/compositions +kubectl apply -f resources/config +``` + +El recurso de Composición de Crossplane (`app-database-redis.yaml`) define qué recursos en la nube necesitan ser creados +y cómo deben ser configurados juntos. La Definición de Recursos Compuestos de Crossplane ( +XRD) (`app-database-resource.yaml`) define una interfaz simplificada que permite a los equipos de desarrollo de +aplicaciones solicitar rápidamente nuevas bases de datos creando recursos de este tipo. + +Consulta el directorio de [recursos/](resources/) para las Composiciones y las Definiciones de Recursos Compuestos ( +XRDs). + +### Vamos a aprovisionar la Infraestructura de Aplicaciones + +Podemos aprovisionar una nueva Base de Datos de Clave-Valor para que nuestro equipo la use ejecutando el siguiente +comando: + +```shell +kubectl apply -f my-db-keyvalue.yaml +``` + +El recurso `my-db-keyvalue.yaml` se ve así: + +```yml +apiVersion: salaboy.com/v1alpha1 +kind: Database +metadata: + name: my-db-keyvalue +spec: + compositionSelector: + matchLabels: + provider: local + type: dev + kind: keyvalue + parameters: + size: small +``` + +Observa que estamos usando las etiquetas `provider: local`, `type: dev`, y `kind: keyvalue`. Esto permite a Crossplane +encontrar la composición correcta basada en las etiquetas. En este caso, el Proveedor de Helm creó una instancia local +de Redis. + +Puedes verificar el estado de la base de datos usando: + +```shell +> kubectl get dbs +NAME SIZE MOCKDATA KIND SYNCED READY COMPOSITION AGE +my-db-keyavalue small false keyvalue True True keyvalue.db.local.salaboy.com 97s +``` + +Puedes verificar que se creó una nueva instancia de Redis en el namespace `default`. + +Puedes seguir los mismos pasos para aprovisionar una base de datos PostgreSQL ejecutando: + +```shell +kubectl apply -f my-db-sql.yaml +``` + +Ahora deberías ver dos `dbs`. + +```shell +> kubectl get dbs +NAME SIZE MOCKDATA KIND SYNCED READY COMPOSITION AGE +my-db-keyavalue small false keyvalue True True keyvalue.db.local.salaboy.com 2m +my-db-sql small false sql True False sql.db.local.salaboy.com 5s +``` + +Ahora puedes verificar que hay dos Pods en ejecución, uno para cada base de datos: + +```shell +> kubectl get pods +NAME READY STATUS RESTARTS AGE +my-db-keyavalue-redis-master-0 1/1 Running 0 3m40s +my-db-sql-postgresql-0 1/1 Running 0 104s +``` + +Debería haber 4 Secrets de Kubernetes (dos para nuestros dos lanzamientos de Helm y dos que contienen las credenciales +para conectarse a las instancias recién creadas): + +```shell +> kubectl get secret +NAME TYPE DATA AGE +my-db-keyavalue-redis Opaque 1 2m32s +my-db-sql-postgresql Opaque 1 36s +sh.helm.release.v1.my-db-keyavalue.v1 helm.sh/release.v1 1 2m32s +sh.helm.release.v1.my-db-sql.v1 helm.sh/release.v1 1 36s +``` + +Podemos hacer lo mismo para aprovisionar una nueva instancia de nuestro Broker de Mensajes Kafka: + +```shell +kubectl apply -f my-messagebroker-kafka.yaml +``` + +Y luego listar con: + +```shell +> kubectl get mbs +NAME SIZE KIND SYNCED READY COMPOSITION AGE +my-mb-kafka small kafka True True kafka.mb.local.salaboy.com 2m51s +``` + +Kafka no requiere crear ningún secreto al usar su configuración predeterminada. + +Deberías ver tres Pods en ejecución (uno para Kafka, uno para Redis y uno para PostgreSQL). + +```shell +> kubectl get pods +NAME READY STATUS RESTARTS AGE +my-db-keyavalue-redis-master-0 1/1 Running 0 113s +my-db-sql-postgresql-0 1/1 Running 0 108s +my-mb-kafka-0 1/1 Running 0 100s +``` + +**Nota**: si estás eliminando y recreando bases de datos o brokers de mensajes usando el mismo nombre de recurso, +recuerda eliminar los `PersistentVolumeClaims`, ya que estos recursos no se eliminan cuando eliminas los recursos de +Database o MessageBroker. + +¡Ahora puedes crear tantas instancias de bases de datos o brokers de mensajes como pueda manejar los recursos de tu +clúster! + +## Vamos a desplegar nuestra Aplicación de Conferencias + +Bien, ahora que tenemos nuestras dos bases de datos y nuestro broker de mensajes en funcionamiento, necesitamos +asegurarnos de que nuestros servicios de aplicación se conecten a estas instancias. Lo primero que debemos hacer es +deshabilitar las dependencias de Helm definidas en el gráfico de la Aplicación de Conferencias para que, cuando se +instale la aplicación, no se instalen las bases de datos ni el broker de mensajes. Podemos hacer esto configurando el +flag `install.infrastructure` en `false`. + +Para ello, utilizaremos el archivo `app-values.yaml` que contiene las configuraciones para que los servicios se conecten +a nuestras bases de datos recién creadas: + +```shell +helm install conference oci://registry-1.docker.io/salaboy/conference-app --version v1.0.0 -f app-values.yaml +``` + +El contenido del archivo `app-values.yaml` se ve así: + +```yml +install: + infrastructure: false +frontend: + kafka: + url: my-mb-kafka.default.svc.cluster.local +agenda: + kafka: + url: my-mb-kafka.default.svc.cluster.local + redis: + host: my-db-keyavalue-redis-master.default.svc.cluster.local + secretName: my-db-keyavalue-redis +c4p: + kafka: + url: my-mb-kafka.default.svc.cluster.local + postgresql: + host: my-db-sql-postgresql.default.svc.cluster.local + secretName: my-db-sql-postgresql +notifications: + kafka: + url: my-mb-kafka.default.svc.cluster.local +``` + +Observa que el archivo `app-values.yaml` depende de los nombres que especificamos para nuestras bases de +datos (`my-db-keyvalue` y `my-db-sql`) y nuestros brokers de mensajes (`my-mb-kafka`) en los archivos de ejemplo. Si +solicitas otras bases de datos y brokers de mensajes con nombres diferentes, necesitarás adaptar este archivo con los +nuevos nombres. + +Una vez que los pods de la aplicación se inicien, deberías tener acceso a la aplicación al apuntar tu navegador +a [http://localhost:8080](http://localhost:8080). Si has llegado hasta aquí, ahora puedes aprovisionar infraestructura +multi-nube utilizando las Composiciones de Crossplane. Consulta +el [Tutorial de Composiciones de Crossplane para AWS](aws/), que fue aportado +por [@asarenkansah](https://github.com/asarenkansah). Al separar +el aprovisionamiento de la infraestructura de la aplicación del código de la aplicación, no solo habilitas la +portabilidad entre proveedores de nube, sino que también permites a los equipos conectar los servicios de la aplicación +con infraestructura que puede ser gestionada por el equipo de plataforma. + +## Limpieza + +Si deseas deshacerte del clúster de KinD creado para este tutorial, puedes ejecutar: + +```shell +kind delete clusters dev +``` + +## Próximos Pasos + +Si tienes acceso a un Proveedor de Nube como Google Cloud Platform, Microsoft Azure o Amazon AWS, te recomiendo +encarecidamente que revises los **Proveedores de Crossplane** para estas plataformas. Instalar estos proveedores y +aprovisionar Recursos en la Nube, en lugar de usar el Proveedor de Helm de Crossplane, te dará una experiencia real +sobre cómo funcionan estas herramientas. + +Como se mencionó en el Capítulo 5, ¿cómo manejarías los servicios que necesitan componentes de infraestructura que no se +ofrecen como servicios gestionados? En el caso de Google Cloud Platform, no ofrecen un Servicio de Kafka Gestionado que +puedas aprovisionar. ¿Instalarías Kafka usando Charts de Helm o VMs, o cambiarías Kafka por un servicio gestionado como +Google PubSub? ¿Mantendrás dos versiones del mismo servicio? + +## Resumen y Contribuciones + +En este tutorial, hemos logrado separar el aprovisionamiento de la infraestructura de la aplicación del despliegue de la +aplicación. Esto permite a diferentes equipos solicitar recursos bajo demanda (usando composiciones de Crossplane) y +servicios de aplicación que pueden evolucionar de manera independiente. + +Usar dependencias de Helm Charts para fines de desarrollo y obtener rápidamente una instancia completamente funcional de +la aplicación en funcionamiento es excelente. Para entornos más sensibles, es posible que desees seguir un enfoque como +el mostrado aquí, donde tienes múltiples maneras de conectar tu aplicación con los componentes requeridos por cada +servicio. + +¿Quieres mejorar este tutorial? Crea un issue, envíame un mensaje en [Twitter](https://twitter.com/salaboy) o envía un +Pull Request. From 101effeaf314f2b66735b17ad00be5b07d526089 Mon Sep 17 00:00:00 2001 From: fredpena Date: Sat, 3 Aug 2024 23:46:14 -0400 Subject: [PATCH 2/2] Translation Spanish Chapter 6 --- README-es.md | 2 +- chapter-6/README-es.md | 275 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 276 insertions(+), 1 deletion(-) create mode 100644 chapter-6/README-es.md diff --git a/README-es.md b/README-es.md index c1b779c..2b1d44f 100644 --- a/README-es.md +++ b/README-es.md @@ -19,7 +19,7 @@ algunos proyectos de código abierto. - [Capítulo 3: Pipelines de servicios: construcción de aplicaciones nativas en la nube](chapter-3/README-es.md) - Capítulo 4: Pipelines de entorno: despliegue de aplicaciones nativas en la nube - [Capítulo 5: Infraestructura multi-nube (App)](chapter-5/README-es.md) -- Capítulo 6: Construyamos una plataforma basada en Kubernetes +- [Capítulo 6: Construyamos una plataforma basada en Kubernetes](chapter-6/README-es.md) - Capítulo 7: Capacidades de la plataforma I: Preocupaciones comunes de las aplicaciones - Capítulo 8: Capacidades de la plataforma II: Permitir que los equipos experimenten - Capítulo 9: Mida sus plataformas diff --git a/chapter-6/README-es.md b/chapter-6/README-es.md new file mode 100644 index 0000000..b0a722e --- /dev/null +++ b/chapter-6/README-es.md @@ -0,0 +1,275 @@ +# Capítulo 6: Construyamos una plataforma basada en Kubernetes + +— +_🌍 Disponible +en_: [English](README.md) | [中文 (Chinese)](README-zh.md) | [日本語 (Japanese)](README-ja.md) | [Español](README-es.md) +> **Nota:** Presentado por la fantástica comunidad +> de [ 🌟 contribuidores](https://github.com/salaboy/platforms-on-k8s/graphs/contributors) cloud-native! + +--- + +En este tutorial paso a paso, crearemos las APIs de nuestra plataforma reutilizando el poder de las APIs de Kubernetes. +El primer caso de uso en el que la plataforma puede ayudar a los equipos de desarrollo es creando nuevos entornos de +desarrollo y proporcionando un enfoque de autoservicio. + +Para construir este ejemplo, utilizaremos Crossplane y `vcluster`, dos proyectos de código abierto alojados en la +Cloud-Native Computing Foundation. + +## Instalación + +Para instalar Crossplane, necesitas tener un clúster de Kubernetes; puedes crear uno usando KinD como hicimos para +ti. [Capítulo 5](../chapter-5/README-es.md#instalación-de-crossplane) + +Usaremos [`vcluster`](https://www.vcluster.com/) en este tutorial, pero no es necesario instalar nada en nuestro clúster +para que `vcluster` funcione. Necesitamos el CLI de `vcluster` para conectarnos a nuestros `vcluster`s. Puedes +instalarlo siguiendo las instrucciones en el sitio +oficial: [https://www.vcluster.com/docs/getting-started/setup](https://www.vcluster.com/docs/getting-started/setup) + +## Definiendo nuestra API de Entorno + +Un entorno representa un clúster de Kubernetes donde la Aplicación de Conferencias se instalará para desarrollo. La idea +es proporcionar a los equipos entornos de autoservicio para que realicen su trabajo. + +Para este tutorial, definiremos una API de Entorno y una Composición de Crossplane que usa el Proveedor de Helm para +crear una nueva instancia de `vcluster`. + +Consulta la Definición de Recursos Compuestos (XRD) de Crossplane para +nuestros [Entornos aquí](resources/env-resource-definition.yaml) y la Composición de +[Crossplane aquí](resources/composition-devenv.yaml). Este recurso configura el aprovisionamiento de un nuevo `vcluster` +usando el Proveedor de Helm de +Crossplane, [consulta esta configuración aquí](resources/compositions/composition-devenv.yaml). Cuando se crea un +nuevo `vcluster`, la composición instala nuestra Aplicación de Conferencias en él, nuevamente utilizando el Proveedor de +Helm de Crossplane, pero esta vez +configurado [para apuntar a las APIs del `vcluster` recién creado](resources/compositions/composition-devenv.yaml), +puedes [consultar esto aquí](resources/compositions/composition-devenv.yaml). + +Vamos a instalar ambos XRD ejecutando: + +```shell +kubectl apply -f resources/definitions +``` + +Ahora que el XRD está definido, instalemos la Composición ejecutando: + +```shell +kubectl apply -f resources/compositions +``` + +Deberías ver: + +```shell +composition.apiextensions.crossplane.io/dev.env.salaboy.com created +compositeresourcedefinition.apiextensions.crossplane.io/environments.salaboy.com created +``` + +Con el recurso de Entorno y la Composición de Crossplane usando `vcluster`, nuestros equipos ahora pueden solicitar sus +Entornos bajo demanda. + +## Solicitar un nuevo Entorno + +Para solicitar un nuevo Entorno, los equipos pueden crear nuevos recursos de entorno como este: + +```yml +apiVersion: salaboy.com/v1alpha1 +kind: Environment +metadata: + name: team-a-dev-env +spec: + compositionSelector: + matchLabels: + type: development + parameters: + installInfra: true + +``` + +Una vez enviado al clúster, la Composición de Crossplane entrará en acción y creará un nuevo `vcluster` con una +instancia de la Aplicación de Conferencias dentro. + +```shell +kubectl apply -f team-a-dev-env.yaml +``` + +Deberías ver: + +```shell +environment.salaboy.com/team-a-dev-env created +``` + +Siempre puedes verificar el estado de tus Entornos ejecutando: + +```shell +> kubectl get env +NAME CONNECT-TO TYPE INFRA DEBUG SYNCED READY CONNECTION-SECRET AGE +team-a-dev-env team-a-dev-env-jp7j4 development true true True False team-a-dev-env 1s + +``` + +Puedes verificar que Crossplane está creando y gestionando los recursos relacionados con la composición ejecutando: + +```shell +> kubectl get managed +NAME CHART VERSION SYNCED READY STATE REVISION DESCRIPTION AGE +team-a-dev-env-jp7j4-8lbtj conference-app v1.0.0 True True deployed 1 Install complete 57s +team-a-dev-env-jp7j4-vcluster vcluster 0.15.0-alpha.0 True True deployed 1 Install complete 57s +``` + +Estos recursos gestionados no son otros que los lanzamientos de Helm que se están creando: + +```shell +kubectl get releases +NAME CHART VERSION SYNCED READY STATE REVISION DESCRIPTION AGE +team-a-dev-env-jp7j4-8lbtj conference-app v1.0.0 True True deployed 1 Install complete 45s +team-a-dev-env-jp7j4-vcluster vcluster 0.15.0-alpha.0 True True deployed 1 Install complete 45s +``` + +Luego, podemos conectarnos al entorno aprovisionado ejecutando (utiliza la columna CONNECT-TO para el nombre +del `vcluster`): + +```shell +vcluster connect team-a-dev-env-jp7j4 --server https://localhost:8443 -- zsh +``` + +Una vez que estés conectado al `vcluster`, estarás en un clúster de Kubernetes diferente, por lo que si listas todos los +namespaces disponibles, deberías ver: + +```shell +kubectl get ns +NAME STATUS AGE +default Active 64s +kube-system Active 64s +kube-public Active 64s +kube-node-lease Active 64s +``` + +Como puedes ver, Crossplane no está instalado aquí. Pero si listas todos los pods en este clúster, deberías ver todos +los pods de la aplicación en ejecución: + +```shell +NAME READY STATUS RESTARTS AGE +conference-app-kafka-0 1/1 Running 0 103s +conference-app-postgresql-0 1/1 Running 0 103s +conference-app-c4p-service-deployment-57d4ddcd68-45f6h 1/1 Running 2 (99s ago) 104s +conference-app-agenda-service-deployment-9bf7946c9-mmx8h 1/1 Running 2 (98s ago) 104s +conference-app-redis-master-0 1/1 Running 0 103s +conference-app-frontend-deployment-c8c64c54d-lntnw 1/1 Running 2 (98s ago) 104s +conference-app-notifications-service-deployment-64ff7bcdf8nbvhl 1/1 Running 3 (80s ago) 104s +``` + +También puedes hacer un port-forwarding a este clúster para acceder a la aplicación usando: + +```shell +kubectl port-forward svc/frontend 8080:80 +``` + +Ahora tu aplicación está disponible en [http://localhost:8080](http://localhost:8080) + +Puedes salir del contexto de `vcluster` escribiendo `exit` en el terminal. + +## Simplificando la superficie de nuestra plataforma + +Podemos dar un paso más para simplificar la interacción con las APIs de la plataforma, evitando que los equipos se +conecten al Clúster de Plataforma y eliminando la necesidad de tener acceso a las APIs de Kubernetes. + +En esta breve sección, desplegamos una Interfaz de Usuario de Administración que permite a los equipos solicitar nuevos +entornos a través de un sitio web o un conjunto de REST APIs simplificadas. + +Antes de instalar la Interfaz de Usuario de Administración, debes asegurarte de que no estás dentro de una sesión de +`vcluster`. (Puedes salir del contexto de `vcluster` escribiendo `exit` en el terminal). Verifica que tienes los +namespaces `crossplane-system` en el clúster actual al que estás conectado. + +Puedes instalar esta Interfaz de Usuario de Administración usando Helm: + +```shell +helm install admin oci://docker.io/salaboy/conference-admin --version v1.0.0 +``` + +Una vez instalada, puedes hacer un port-forwarding a la Interfaz de Usuario de Administración ejecutando: + +```shell +kubectl port-forward svc/admin 8081:80 +``` + +Ahora puedes crear y verificar tus entornos usando una interfaz simple +en [http://localhost:8081](http://localhost:8081). Si esperas a que el entorno esté +listo, recibirás el comando `vcluster` que debes usar para conectarte al entorno. + +![imgs/admin-ui.png](imgs/admin-ui.png) + +Al usar esta interfaz simple, los equipos de desarrollo no necesitarán acceder directamente a las APIs de Kubernetes +desde el clúster que tiene todas las herramientas de la plataforma (Por ejemplo: Crossplane y Argo CD). + +Además de la interfaz de usuario, la aplicación de Administración de la Plataforma te ofrece un conjunto simplificado de +endpoints REST donde tienes total flexibilidad para definir cómo deben ser los recursos en lugar de seguir el Modelo de +Recursos de Kubernetes. Por ejemplo, en lugar de tener un Recurso de Kubernetes con todos los metadatos necesarios por +la API de Kubernetes, podemos usar el siguiente payload JSON para crear un nuevo Entorno: + +```json +{ + "name": "team-curl-dev-env", + "parameters": { + "type": "development", + "installInfra": true, + "frontend": { + "debug": true + } + } +} +``` + +Puedes crear este entorno ejecutando: + +```shell +curl -X POST -H "Content-Type: application/json" -d @team-a-dev-env-simple.json http://localhost:8081/api/environments/ +``` + +Luego, lista todos los entornos con: + +```shell +curl localhost:8081/api/environments/ +``` + +O elimina un entorno ejecutando: + +```shell +curl -X DELETE http://localhost:8081/api/environments/team-curl-dev-env +``` + +Esta aplicación sirve como una fachada entre Kubernetes y el mundo exterior. Dependiendo de las necesidades de tu +organización, es posible que desees tener estas abstracciones (APIs) desde el principio, para que el equipo de +plataforma pueda ajustar sus decisiones sobre herramientas y flujos de trabajo por debajo de la superficie. + +## Limpieza + +Si deseas deshacerte del clúster de KinD creado para estos tutoriales, puedes ejecutar: + +```shell +kind delete clusters dev +``` + +## Próximos Pasos + +¿Puedes extender la Interfaz de Usuario de Administración para crear Bases de Datos y Brokers de Mensajes como hicimos +en el Capítulo 5? ¿Qué se necesitaría? Entender dónde deben hacerse los cambios te dará experiencia práctica en el +desarrollo de componentes que interactúan con las APIs de Kubernetes y proporcionan interfaces simplificadas para los +consumidores. + +¿Puedes crear tus propias composiciones para usar Clústeres Reales en lugar de `vcluster`? ¿Para qué tipo de escenario +usarías un Clúster real y cuándo usarías un `vcluster`? + +¿Qué pasos adicionales necesitarías seguir para ejecutar esto en un Clúster de Kubernetes real en lugar de ejecutarlo en +Kubernetes KinD? + +## Resumen y Contribuciones + +En este tutorial, hemos construido una nueva API de Plataforma reutilizando el modelo de Recursos de Kubernetes para +aprovisionar entornos de desarrollo bajo demanda. Además, con la aplicación de Administración de Plataforma hemos creado +una capa simplificada para exponer las mismas capacidades sin presionar a los equipos para que aprendan cómo funciona +Kubernetes o los detalles subyacentes, proyectos y tecnologías que hemos utilizado para construir nuestra Plataforma. + +Al basarse en contratos (en este ejemplo, la definición de recurso de Entorno), el equipo de plataforma tiene la +flexibilidad para cambiar los mecanismos utilizados para aprovisionar entornos dependiendo de sus requisitos y +herramientas disponibles. + +¿Quieres mejorar este tutorial? Crea un issue, envíame un mensaje en [Twitter](https://twitter.com/salaboy) o envía un +Pull Request.