Páginas

viernes, 17 de marzo de 2023

La economía del software según J. B. Rainsberger

Este artículo está basado en una conferencia de 2019 titulada “The economics of software design” de J.B. Rainsberger y que está disponible en Youtube en ver conferencia .

Lo que aquí relato es mi libre interpretación de lo que cuenta Rainsberger, lo digo porque puedo estar equivocada y tergiversar sus palabras. O sea son mis palabras, no las suyas, por si acaso. Es para que no me pase lo mismo que al tipo de la cola del cine en la película “Annie Hall” cuando habla sobre el trabajo de Marshall MacLujan ver escena.

El objetivo de la conferencia es explicar porque son necesarias prácticas ágiles a la hora de desarrollar software. Rainsberger con mucho talento sigue un hilo sólido que explica a desarrolladores y no desarrolladores porqué usar practicas ágiles va a mejorar los sistemas de información.

Rainsberger dice que hay tres asuntos importantes en los que hay que centrar la atención cuando se desarrolla software:

  • Las funcionalidades desarrolladas (Features)
  • El diseño del software (Design)
  • La retroalimentación (Feedback)

Funcionalidades desarrolladas

La refactorización es la piedra angular del desarrollo de código. Esta refactorización facilita mejorar el coste marginal. El coste marginal es un término financiero que se puede definir como el incremento de coste al producir N+1 unidades de determinado producto, respecto al coste de producción de N unidades. Llevando esto al mundo software, se puede traducir en el coste de añadir una nueva funcionalidad o cambiar una funcionalidad ya existente. Es menor de añadir o modificar funcionalidades si el sistema está bien diseñada, es decir no es un galimatías. Los patrocinadores del software (financiero de la empresa u organismo) entienden de costes marginales, los desarrolladores de diseño del software. Entonces, si para tener un mejor coste marginal es necesario refactorizar los promotores entienden que refactorizar es necesario, los desarrolladores ya lo saben. La forma de refactorizar constantemente es utilizar TDD (Test Driven Development).

Diseño del software

Para su exposición Rainsberger utiliza el siguiente gráfico.

Aquí la curva representada por g representa el aumento del coste de seguir modificando un sistema que no se desarrolla con “Diseño Evolutivo”. Inicialmente desarrollar el sistema es menos costoso, pero con el tiempo el coste de mantenerlo se eleva exponencialmente, según Rainsberger siguiendo el comportamiento del interés compuesto según Bernoulli, de hay la formula (1+1/n)ⁿ -> e. Sin embargo la curva representada por f corresponde a los sistemas que se desarrollan con “Diseño Evolutivo” (básicamente empleando TDD), en estos el diseño está mejorando constantemente y eso contribuye a que aunque cada vez el sistema sea más complejo el crecimiento de costes sea mucho más moderado. En términos más vulgares que el galimatías sea menor, aunque la complejidad sea mayor.

También dice Rainsberger que el punto t₀ en el caso de los sistemas que no se desarrollan con "Diseño Evolutivo" es el momento en que económicamente es más rentable tirar el sistema y hacerlo de nuevo. Cómo según él nadie sabe calcular cuando llega ese momento, es mejor trabajar con “diseño evolutivo” para evitar el desastre.

Retroalimentación

En cuanto a la producción del software existe un modelo clásico llamado “En cascada” que implica las fases:

Requisitos -> Análisis-> Diseño-> Codificación -> Pruebas -> Puesta en marcha

En este modelo la retroalimentación se ejecuta demasiado tarde. Esto provoca que la cantidad de re-trabajo suela ser ingente porque cuando algo no se ajusta a lo esperado ya hay mucho que cambiar.

En “XP (eXtreme Programming de 1999)” se expuso que era mejor realizar un ciclo de desarrollo y pruebas constante que pusiera en evidencia si lo que se estaba desarrollando era lo que se necesitaba. XP y a continuación Agile aconsejan prácticas que mejoran la retroalimentación: pequeños ciclos de desarrollo, pruebas unitarias para conocer el estado interno del sistema y pruebas de aceptación para saber si el sistema está de acuerdo con las necesidades del usuario.

Rainsberger expone que las técnicas para llevar esto a cabo son TDD y BDD. También las prácticas de DevOps ayudan a la retroalimentación y facilitan la labor coordinada de los equipos de desarrollo y operaciones.

Conclusiones

Esta conferencia apoya de forma empírica y heurística el desarrollo basado en técnicas ágiles.

No hay fórmulas mágicas, pero desarrollar software no es fácil y yo también estoy convencida de que todas las prácticas ágiles contribuyen a que el mundo del desarrollo de software mejore.

Buenas noticias, eso nos beneficia a todos a los informáticos y a los no informáticos.

lunes, 20 de febrero de 2023

Expresiones regulares en JavaScript

Qué es una expresión regular y como se crea en JavaScript.

Una expresión regular es una secuencia de caracteres que conforma un patrón de búsqueda. Este patrón se utiliza para buscar dentro conjuntos de caracteres contenidos en: literales, variables, ficheros, etc. y comprobar si hay coincidencia o no en la búsqueda.

Las búsquedas con patrones tienen muchas utilidades. Por ejemplo:

  • Buscar una subcadena dentro de una cadena de caracteres.
  • Reemplazar partes de una cadena por otras subcadenas.
  • Validar el formato de un dato.
  • Formatear datos.
  • Filtrar información y extraer datos que cumplan ciertas condiciones.
Las expresiones regulares no son complicadas, pero en una primera aproximación pueden intimidar. Cuando se comprenden y se saben manejar la perspectiva cambia y se convierten en grandes aliados de los programadores.

Un patrón es un objeto RegExp de JavaScript que se crea escribiendo caracteres entre dos barras oblicuas. Luego se puede utilizar de distintas formas, por ejemplo con el método test() que es uno de los métodos del objeto patrón. Un ejemplo:


   let patron = /verde/;
   console.log (patron.test("¡Qué verde era mi valle!")); // true

Este patrón /verde/ busca el conjunto de caracteres verde en la cadena "¡Qué verde era mi valle!" y como hay coincidencia devuelve true.

Hay más métodos de los objetos JavaScript que manejan los patrones. Por ejemplo el método search() del objeto String. Este método devuelve -1 si no encuentra coincidencia y un número positivo que indica la posición donde encuentra el patrón. Por ejemplo:


   "!Qué verde era mi valle¡".search(patr);

devuelve un 5 que es la posición de la cadena donde empieza la palabra verde si se cuenta de izquierda a derecha en la cadena empezando por 0.

Metacaracteres en las expresiones regulares.

En los patrones se usan caracteres que tienen significados especiales y es lo que se llama metacaracteres. Por ejemplo el caracter . en un patrón significa coincidencia con cualquier caracter. Un ejemplo:


   let patr = /r..a/; // Busca una r, 2 caracteres cualesquiera y una a.
   let cadena = "La casa roja";
   console.log (patr.test(cadena)); // true
   cadena = "La casa rosa";
   console.log (patr.test(cadena)); // true
   cadena = "El ron era bueno"; 
   console.log (patr.test(cadena)); // false
   cadena = "El remo se rompió";
   console.log (patr.test(cadena)); // false

Hay muchos metacaracteres para crear expresiones regulares y conseguir con los patrones realizar busquedas complejas. Estos patrones evitan muchas veces tener que crear largos algoritmos de programación. Por ejemplo:


/[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*@[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,5}/

este patrón sirve para comprobar si una dirección de correo electrónico tiene un formato correcto. De esta forma con esta sola línea se consigue evitar tener que idear y codificar un algoritmo que lo compruebe y cuantas menos líneas de código escritas, menos líneas de código a mantener.

Ejemplo de dos metacaracteres usados normalmente.

Metacaracter.

Significado ➝ Cualquier caracter.

Ejemplo:


   let patr = /a..a./; 
   let cadena = "ambar";
   console.log (patr.test(cadena)); // true
   cadena = "amigo";
   console.log (patr.test(cadena)); // false

Metacaracter\d

Significado ➝ Cualquier caracter que sea un número arábigo, es decir 0, 1 ,2 ,3 ,4 ,5 ,6 , 7 ,8 o 9

Ejemplo:


   let patr = /\d/; 
   let cadena = "Juan tiene 18 años";
   console.log (patr.test(cadena)); // true
   cadena = "Juan tiene dieciocho años";
   console.log (patr.test(cadena)); // false

Si necesitas más información sobre expresiones regulares y más ejemplos puedes consultar el libro Uso de expresiones regulares en JavaScript

martes, 10 de enero de 2023

JavaScript: Guia rápida de expresiones regulares

Aquí hay un resumen de los meta-caracteres y otras estructuras más empleados en las expresiones regulares. Si necesitas una explicación mas detallada y ver algunos ejemplos puedes consultar el libro Uso de expresiones regulares en JavaScript


Metacaracteres generales


Metacaracter Significado
\d Cualquier caracter que sea un número arábigo, es decir 0, 1 ,2 ,3 ,4 ,5 ,6 , 7 ,8 o 9
\D Cualquier que no sea un número arábigo, es decir 0, 1, 2, 3, 4, 5, 6, 7, 8 o 9
\w Cualquier caracter del alfabeto latino básico es decir letras minúsculas, letras mayúsculas y guión de subrayado
\W Cualquier caracter que no sea del alfabeto latino básico es decir letras minúsculas, letras mayúsculas, números arábigos y guión de subrayado
\s Encuentra coincidencia cuando hay un espacio u otros caracteres no imprimibles
\^ Comprueba el principio de la cadena
\$ Comprueba el final de la cadena
\ Indica que el siguiente caracter, tiene que ser tratado de forma especial. Es útil para tratar meta-caracteres como caracteres especiales y para tratar caracteres normales como meta-caracteres
\b Comprueba límites de palabra. Un límite de palabra es la posición donde un caracter de palabra no es seguido o precedido por otro caracter de palabra. Los caracteres de palabra son: letras del alfabeto latino en mayúsculas o minúsculas, números arábigos o sea los caracteres del 0 al 9 y el caracter de subrayado
\B Comprueba límites de no palabra. Un límite de no palabra es la posición donde un caracter de palabra es seguido o precedido por otro caracter de palabra. Los caracteres de palabra son: letras del alfabeto latino en mayúsculas o minúsculas, números arábigos o sea los caracteres del 0 al 9 y el caracter de subrayado. Es decir busca que un caracter esté seguido o precedido por otro del mismo tipo, de palabra o de no palabra
[abc] o [a-c] Encuentra coincidencia si hay alguno de los caracteres que aparecen entre corchetes en la cadena. También se pueden especificar rangos de caracteres mediante un guión, así [abc] es lo mismo que [a-c]
[^abc] o [^a-c] Encuentra coincidencia si encuentra algún caracter distinto de los que aparecen entre corchetes en la cadena. También se pueden especificar rangos de caracteres mediante un guión, así [^abc] es lo mismo que [^a-c]
\t Hay coincidencia si encuentra un tabulador horizontal en la cadena. Hay que tener en cuenta que este caracter es un Non Printable Character y los editores normalmente no lo muestran como tal sino que lo interpretan como una orden, en este caso que el caracter siguiente se muestre más a la derecha
\r \n \v \f Estos al igual que el anterior son Non Printable Characteres y los editores normalmente no lo muestran como tal sino que lo interpretan como una orden. Cada uno tiene un significado distinto: \r carriage return (junto a \n salto de línea), \n linefeed (salto de línea), \v vertical tab y \f form-feed (salto de página)
x|y Disyunción: coincide si hay x o y. Cada componente separado por | se llama alternativa

Metacaracteres cuantificadores


Metacaracter Significado
x* El item precedente 'x' se repite 0 o más veces
x+ El item precedente 'x' se repite 1 o más veces
x? El item precedente 'x' se repite 0 o 1 vez
x{n} El item precedente 'x' se repite exactamente n veces

Grupos


Grupo Significado
(abc) Busca la cadena abc
(/w/w) Busca 2 caracteres del alfabeto latino seguidos
(?<g>abc) El grupo se llama g. Luego se puede usar con \k<g>
(([0-9]){2}-){3} Los grupos se pueden anidar. En este caso el primer grupo es un numero que se tiene que repetir 2 veces seguido de un guión es el segundo grupo que anida al primero. Luego todo eso se repite 3 veces

Flags


Flag Significado
i Encuentra coincidencia sin distinguir mayúsculas de minúsculas
g Encuentra todas las coincidencias del patrón en la cadena
m Significa busqueda multilínea. Solo es aplicable a los metacarateres ^ y $ de principio y final de línea
s Es aplicable al metacaracter .. Cuando se usa el flag s el . encuentra coincidencia con salto de línea \n
u JavaScript utiliza la codificación Unicode, esto determina como se almacenan internamente los caracteres en memoria. Existen caracteres que se guardan de 2 bytes (16 bits de 0s y 1s) y otros que se guardan en 4 bytes. Hay que tener en cuenta que Unicode tiene combinaciones de 0s y 1s para representar los caracteres de cualquier idioma, una a sería 01000001 en binario o 41 en hexadecimal.
Para construir patrones para Unicode se usa el metacaracter \p junto con otros caracteres que se ponen entre {}, por ejemplo {Sc} significa symbol y currency (símbolo y moneda)
y Busca el patrón en una posición determinada dentro de la cadena. Para establecer la posición en la que buscar se usar la propiedad lastIndex de RegExp

Objetos para manejar patrones


Objeto.Método Uso
RegExp.text() El método test() ejecuta una busqueda del patrón dentro de una cadena de caracteres (string), devolviendo true si lo encuentra o false sino lo encuentra
RegExp.exec() El método exec() realiza una búsqueda para encontrar el patrón dentro de una cadena de caracteres (string) y devuelve un array con los resultados. Sino hay coincidencias devuelve null
String.match() Con la bandera g de global, este método devuelve un array con las coincidencias encontradas
String.matchAll() Debe llevar la bandera g y devuelve un iterador que contiene las coincidencias del patrón encontradas en la cadena
String.split() Separa la cadena por el patrón especificado y crea un array con las subcadenas obtenidas
String.search() Busca la primera coincidencia del patrón y devuelve la posición dentro de la cadena en la que lo encuentra
String.replace() Reemplaza una cadena o las coincidencias del patrón con la cadena especificada. El método replace tiene dos argumentos, uno para especificar la cadena o patrón a reemplazar y el segundo para especificar conqué hay que reemplazarlo

martes, 16 de agosto de 2022

Qué es Cloud Computing

Estoy asistiendo a un curso online en https://www.edx.org/es y la definición e introducción que hacen para explicar "La Nube" me ha parecido muy interesante y quiero compartirla con vosotros.

Cloud es la entrega de recursos para computación a demanda. En lugar de depender de un servicio físico instalado, se tiene acceso a una estructura donde el software y/o el hardware están virtualmente integrados.

NIST(National Institute of Standards and Technology) define Cloud como: Un modelo para proporcionar recursos compartidos que son fácilmente aprovisionados, configurados y entregados por parte de el proveedor del servicio.

Características esenciales de Cloud

  1. Autoservicio a demanda.- los recursos de Cloud se obtienen sin necesidad de intervención humana. Estos servicios pueden ser: potencia de procesamiento, capacidad de almacenamiento y capacidad de red.
  2. Acceso a la red.- A los recursos de Cloud se puede acceder vía red desde mecanismos y plataformas estándar cómo móviles, tabletas, portátiles o estaciones de trabajo.
  3. Zona común de recursos.- Esto permite a los proveedores de servicios Cloud optimizar el uso de dichos recursos, permitiendo ofrecer a sus clientes servicios a precios mejores que los que conseguirían si los recursos los adquirieran de forma privada.
  4. Elasticidad.- Se obtienen más recursos cuando se necesitan y se devuelven cuando no se usan.
  5. Servicios a medida.- Solo se paga por lo que se usa. El uso de recursos se monitoriza, se mide y se informa de forma trasparente sobre su utilización.

Modelos de despliegue de Cloud

  • Público.- Los servicios se suministran desde infraestructuras (hardware y software) propiedad del proveedor a las que se accede desde internet y estas infraestructuras se comparten entre varias compañías.
  • Privado.- Los servicios se suministran desde infraestructuras (hardware y software) propiedad del proveedor a las que se accede desde internet y estas infraestructuras son de uso privado de una compañía.
  • Híbrido.- Una mezcla de público y privado

Modelos de servicio de Cloud

  • Infraestructura como servicio.- Proporciona recursos físicos como servidores, redes, almacenamiento de datos sin necesidad de instalarlos ni mantenerlos. Esto se ve a menudo como IaaS por sus siglas en inglés Infraestructure as a service. Un ejemplo, es cuando se aloja una web en un servidor que se contrata de forma remota. El servidor podemos decir que es virtual puesto que no tenemos ninguna máquina real.
  • Plataforma como servicio.- Proporciona acceso a una plataforma que normalmente tiene hardware y software, generalmente lo que se necesita para desarrollar y desplegar aplicaciones a usuarios en internet. Esto se conoce a menudo como PaaS por sus siglas en inglés Platform as a Service. Un ejemplo de esto es si contratamos un servidor(hardware) con un servidor de aplicaciones(software) ya instalado en el que vamos a desplegar nuestra web.
  • Software como servicio.- Es un modelo de licenciado y entrega en el cual las aplicaciones están alojadas y licenciadas en forma de subscripción, algunas veces se conoce este modelo como “software a demanda”. Este modelo se conoce como SaaS por sus siglas en inglés Software as a Service. Un ejemplo es cuando contratamos una aplicación de cualquier tipo de la que vamos a hacer uso en remoto, normalmente se paga por usuario.

viernes, 29 de julio de 2022

JavaScript: Que es Node con un ejemplo.

JavaScript es un lenguaje de programación que inicialmente se diseñó para ser ejecutado en el buscador. Es decir, se construían páginas html que para poder contener código ejecutable se cargaban con scripts que no eran otra cosa que módulos con sentencias JavaScript que dotaban y dotan a las páginas html de interactividad con el usuario. Por ejemplo, si se clica un botón se abre una nueva ventana.

JavaScript es un lenguaje de programación que inicialmente se diseñó para ser ejecutado en el buscador. Es decir, se construían páginas html que para poder contener código ejecutable se cargaban con scripts que no eran otra cosa que módulos con sentencias JavaScript que dotaban y dotan a las páginas html de interactividad con el usuario. Por ejemplo, si se clica un botón se abre una nueva ventana.

Para ello lo primero es instalar Node que se puede hacer desde https://nodejs.org/en/download/

Después de la instalación podemos escribir en la consola del sistema el comando node y se recibe información de la versión que se ha instalado:

Welcome to Node.js v14.16.0.

Un ejemplo de uso de Node es el siguiente. Escribimos un módulo en lenguaje JavaScript con el siguiente contenido:

Se guarda este módulo con el nombre holamundo.js. Si se ejecuta en la consola del sistema el comando node holamundo, se arranca un servicio en 127.0.0.1:1234 y por ello en la consola del sistema se verá:

Servidor corriendo en http://127.0.0.1:1234

A continuación abriendo un buscador y escribiendo http://127.0.0.1:1234 veremos

Para terminar

Node permite que la programación de servidor se escriba en javascript al igual que la del cliente. Node ha tenido bastante éxito y actualmente muchos sistemas tiene su frontend e incluso su backend escritos con JavaScript haciendo uso de este software. Node permite escribir código asíncrono para mejorar la interacción con el usuario y no hacerle esperar cuando no es necesario, además esta orientado a eventos y basado en el motor V8 de Google. Pero eso es otra historia…

viernes, 15 de julio de 2022

Javascript: Ejemplo de CRUD con MariaDB y Node Express

Con carácter general para establecer la conexión


Leer todas las filas


Leer una fila por identificador


Crear una fila


Modificar una fila


Borrar una fila



Espero que sea de ayuda para algun abnegado programador

martes, 22 de marzo de 2022

Para qué sirve Kubernetes: un ejemplo

Para qué sirve Kubernetes.

El despliegue de aplicaciones está evolucionando para facilitar a los ingenieros del software la tarea. Parece una contradicción que los ingenieros no dispongan de los mejores productos software para suministrarles ayuda en su trabajo, pero haciendo honor al dicho “en casa de herrero, cuchillo de palo”.

En los orígenes, no hace demasiado tiempo, las aplicaciones eran monolíticas e incluían grandes áreas de funcionalidad. En estos momentos el despliegue era algo manual que no comportaba la misma problemática que actualmente, puesto que el despliegue de un sistema no interfería con otros. Cada sistema era estanco y auto-contenido y las dependencias entre sistemas eran mínimas.

Con el advenimiento del micro-servicio las cosas han cambiado. Ahora los sistemas no son obligatoriamente monolíticos, hay otras opciones. Un sistema se puede construir en numerosas pequeñas partes que tienen que colaborar para suministrar la funcionalidad completa. Esta forma de desarrollar sistemas contribuye a que los desarrolladores puedan ser más efectivos a la hora de incorporar nuevas funcionalidades a los programas y también para llevar a cabo su mantenimiento tanto de eliminación de errores como de incorporación de mejoras. No es aceptable hoy en día que un cambio en una aplicación sea largo y tedioso, las organizaciones necesitan que sus sistemas evolucionen al mismo ritmo que suceden los acontecimientos.

En este escenario, el despliegue de sistemas es el despliegue de sus pequeñas partes. Esas partes tienen que trabajar de forma orquestada como un equipo en el que cada parte hace lo que se espera de ella y de forma coordinada con el resto de las partes.

Entonces surge un problema que antes no existía, orquestar adecuadamente todas las partes o micro-servicios. Los micro-servicios tienen dependencias, en el mundo del desarrollo actual los programadores hacen uso de librerías para llevar a cabo funcionalidades ya resueltas y que han sido programadas por otros. Esto hace que normalmente un desarrollo dependa de las librerías en las cuales se apoya. Esto produce muchos quebraderos de cabeza a los ingenieros que tienen que desplegar software, porque si se despliegan dos sistemas que dependen de una misma librería esta librería tiene ser utilizada exactamente en la misma versión. En caso contrario surgen los problemas de incompatibilidades.

Para esto se ideó la tecnología de contenedores. En esta tecnología cada micro-servicio se empaqueta con sus librerías y hay automatismos (capas) que se encargan de controlar las versiones de las librerías comunes y otros elementos. En este ejemplo se va a utilizar Docker como tecnología de contenedores.

Con Docker no tenemos problemas dependencias, pero surgen problemas de gestión de los numerosos contenedores que tiene que manejar el equipo de operaciones. Cuantos contenedores están activos, que recursos consume cada uno, es necesario replicar alguno de ellos para que no se produzcan cuellos de botella, se ha caído alguno, están en la versión adecuada, es necesario dar marcha atrás en un despliegue, etc.

Para esta gestión viene al rescate Kubernetes.

Qué es Kubernetes.

Kubernetes también conocido como K8s es un sistema open-source para la automatización del despliegue, escalado y gestión de aplicaciones contenorizadas.

Un cluster Kubernetes está formado por componentes que sirven para gestionar un conjunto de máquinas llamadas nodos.

No se van a describir aquí todos los tipos de componentes que existen en Kubernetes. Solo se van a exponer aquellos componentes de los que hace uso el ejemplo que aquí se explica.

El componente de orden superior que se utiliza es el Deployment que representa un despliegue. En el ejemplo el Deployment tiene un Pod, un Service y varios ReplicaSet. Los Pod albergan contenedores, los ReplicaSet se encargan de mantener activas tantas copias de un pod como se hayan establecido. Los servicios exponen los pods, es decir los contenedores que incluyen como un servicio de red.

Para ilustrar los componentes que utiliza el ejemplo, se utiliza la siguiente figura:

Ejemplo de Uso de Kubernetes

Se crea un contenedor que incluye un servidor web nginx que muestra una página html. Para ello se realizan las siguientes acciones:

  1. Instalar Docker https://docs.docker.com/get-docker/
  2. Crear un contenedor Docker
    • Crear un contenedor Docker que incluye: un servidor web nginx, una página html, una hoja de estilos y dos imágenes. Para construir un contenedor hay que crear un fichero con nombre dockerfile que describe su contenido. En el caso del ejemplo:
      FROM nginx
      COPY pagina.html /usr/share/nginx/html
      COPY pagina.css /usr/share/nginx/html
      COPY LogoDocker.png /usr/share/nginx/html
      COPY LogoKubernetes.png /usr/share/nginx/html
    • En el directorio donde está el dockerfile se ejecuta el comando para crear el contenedorcon el comando:
      docker build -t containerprueba .
  3. Se publica en un registro de contenedores, para luego usarlo desde kubernetes. En este caso en: http://hub.docker.com con el nombre
    marisaafuera/containerprueba
  4. Instalar Minikube https://minikube.sigs.k8s.io/docs/start/ y arrancarlo. Minikube es una herramienta que administra maquinas virtuales en donde corre una instancia de Kubernetes en un solo nodo y es útil a efectos de aprendizaje y pruebas.
  5. Crear un deployment en kubernetes (se crean automáticamente el pod y el servicio) con el comando:
    kubectl create deployment containerprueba --image=marisaafuera/containerprueba
  6. Exponerlo en Kubernetes para que sea accesible con:
    kubectl expose deployment containerprueba --type=LoadBalancer --port=8090
  7. Ahora debería de funcionar http://localhost:8090/pagina.html, pero no funciona. Después de unas cuantas horas buscando por qué no funciona, al final con port forward funciona:
    kubectl port-forward pod/<nombre pod> 8091:80
  8. Para acceder a la aplicación contenorizada y kubernetizada:
  9. Minikube tiene un dashboard que da información sobre el entorno de ejecución y permite gestionarlo. Se arranca con minikube dashboard.

    Para terminar

    Este artículo explica en la práctica en qué consiste Kubernetes. La ventaja de utilizar una herramienta de este tipo es apoyar el despliegue de sistemas con software que ayude a los equipos de desarrollo y operaciones a dar mejor servicio a los usuarios. Automatizar el trabajo, si se hace correctamente ayuda a que las tareas repetitivas se hagan mejor y con menos errores.