En mi artículo anterior, profundicé en el fascinante mundo de los microservicios: Patrones de arquitectura de microservicios, Parte 1: Patrones de descomposición . Este fue el comienzo de mi completa serie de artículos sobre microservicios y sus patrones.
Si bien el paso lógico sería continuar con la Parte 2 de esta serie, he decidido que lo siguiente que me gustaría explorar y contarles es el proceso vital de entregar estos microservicios al usuario final sin problemas.
CI/CD es una técnica para entregar aplicaciones a los clientes, que se logra agregando automatización a diferentes etapas del desarrollo de aplicaciones. Creo que comprender CI/CD (integración continua e implementación continua) puede permitir a los desarrolladores obtener una mejor comprensión de cómo existen los artefactos del proyecto backend más allá de los límites del repositorio del proyecto. Esta comprensión también puede crear un cambio fundamental en la perspectiva del desarrollador. En lugar de simplemente ver su trabajo como líneas de código, pueden empezar a adoptar el contexto más amplio de su proyecto como un producto valioso.
En este artículo, nuestro objetivo es desmitificar el proceso de CI/CD a través de una aplicación práctica. Lo guiaremos a través de un tutorial paso a paso, desglosándolo módulo por módulo, donde creará una canalización de CI/CD manualmente. Para hacer esto, aprovecharemos el poder de las herramientas DevOps contemporáneas como AWS, Docker, Kubernetes, Ansible, Git, Apache Maven y Jenkins . Entonces, ¡comencemos este viaje!
Este módulo está dedicado a la creación de una instancia de servidor virtual AWS EC2. Como parte de este artículo, configurará tres instancias EC2 para Jenkins, Ansible y Kubernetes. Por ahora, puede continuar con los siguientes módulos y volver a visitar este módulo en las secciones "[módulo 2]: Jenkins", "[módulo 6]: Ansible" y "[módulo 7]: Kubernetes".
Vaya a https://aws.amazon.com.
Haga clic en el botón Crear una cuenta de AWS .
Siga las instrucciones en la página web para crear una cuenta.
Vaya a https://console.aws.amazon.com/console/home. Haga clic en el botón Iniciar sesión .
Ingrese todas las credenciales necesarias en esta página web.
Busque EC2 en el cuadro de búsqueda.
Elija Servidor virtual EC2 haciendo clic en Servicio EC2 .
Haga clic en el botón Iniciar instancia .
Vaya a la sección "Nombre y etiquetas" .
Proporcione un nombre para una nueva instancia del servidor virtual AWS EC2 en la sección "Nombre" .
También puede agregar etiquetas adicionales para su servidor virtual haciendo clic en "Agregar etiquetas adicionales" .
Vaya a la sección "Imágenes de aplicaciones y sistema operativo (imagen de máquina de Amazon)" .
Para jugar con el servidor virtual GRATIS :
Vaya a la sección "Tipo de instancia" .
Para jugar con el servidor virtual GRATIS :
Seleccione un tipo con la etiqueta elegible para el nivel gratuito en la sección Tipo de instancia .
Para mí es t2.micro (Familia: t2 1cCPU 1 GiB Memoria Generación actual: verdadero) .
Vaya a la sección "Configurar almacenamiento" .
Para jugar con el servidor virtual GRATIS :
No cambie la configuración predeterminada. Los clientes elegibles para el nivel gratuito pueden obtener 30 GB de almacenamiento magnético o de uso general (SSD) de EBS .
Vaya a la sección "Configuración de red" .
Necesita configurar la seguridad de su servidor virtual. Para hacer esto,
De forma predeterminada, se puede acceder a su servidor virtual a través de ( Tipo: SSH, Protocolo: TCP, Puerto: 22 ). Si necesita tipos de conexión adicionales, agréguelos agregando reglas de grupo de seguridad entrante adicionales.
Vaya a la sección "Par de claves (Iniciar sesión)" .
Cree un nuevo par de claves si aún no lo ha creado.
Si aún no ha creado un "par de claves" :
Inicie la instancia del servidor virtual EC2 haciendo clic en el botón "Iniciar instancia" .
Después de completar el proceso de creación de la instancia del servidor virtual EC2, verá lo siguiente.
Luego debe ir a la sección "Instancias" haciendo clic en el botón "Ver todas las instancias" .
Ahora puede ver que su instancia del servidor virtual AWS EC2 se está ejecutando.
Ahora, configuremos JenkinsServer en la instancia del servidor virtual EC2.
Necesita un servidor virtual para ejecutar Jenkins.
Siga las instrucciones de la sección [Módulo 1]: Servidor virtual AWS EC2 de este tutorial para finalizar este paso y crear una instancia de servidor virtual EC2 con el nombre JenkinsServer.
No olvide agregar una configuración de grupo de seguridad. Permite que Jenkins y SSH funcionen en los puertos 8080 y 22 respectivamente.
Utilice el nombre "JenkinsServer" para distinguir su instancia de servidor virtual EC2.
Cree el grupo de seguridad "CI_CD_Pipeline" y "CI_CD_Pipeline_Key_Pair" para una nueva instancia AWS EC2 "JenkinsServer" . Puede reutilizarlos más adelante en el artículo.
Vaya a la página de inicio de la Consola de AWS → Panel de la Consola de administración EC2 → Instancias.
Luego debes elegir JenkinsServer y luego hacer clic en el botón "Conectar" .
Entonces verá esta página web. Debes volver a hacer clic en el botón "Conectar" .
Ahora puede ver la terminal en línea de la instancia del servidor virtual EC2.
Ahora necesita descargar Jenkins en su instancia de servidor virtual EC2.
Siga estas instrucciones:
Vaya a la página web de descarga de Jenkins.
Puede ver las opciones de lanzamientos estables (LTS) y regulares (semanales). Elija la opción Red Hat/Fedora/Alma/Rocky/CentOS LTS.
Verá esta página web.
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
Ahora Jenkins está descargado.
Para finalizar la instalación de Jenkins, necesitamos importar la clave de Jenkins.
Para importar la clave de Jenkins necesitamos copiar el comando "sudo rpm..." y ejecutarlo.
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
De esta manera, el administrador de paquetes “rpm” puede verificar que los paquetes de Jenkins que instala son exactamente los publicados por el proyecto Jenkins y que no han sido manipulados ni dañados.
Para ejecutar Jenkins, necesitamos instalar Java en nuestra instancia de servidor virtual EC2.
Para instalar Java , utilice este comando.
sudo amazon-linux-extras install java-openjdk11 -y
Verifique si Java se instaló correctamente usando este comando:
java -version
Verás algo así.
Para ejecutar Jenkins, necesita instalar fontconfig en nuestra instancia de servidor virtual EC2.
Utilice este comando.
sudo yum install fontconfig java-11-openjdk -y
Fontconfig es una biblioteca diseñada para proporcionar configuración de fuentes, personalización y acceso a aplicaciones en todo el sistema. Jenkins lo requiere porque Jenkins tiene características que representan fuentes.
En pasos anteriores, configuró su instancia de servidor virtual EC2 para usar un repositorio Jenkins específico y luego importó la clave GPG asociada con este repositorio. Ahora, debe ejecutar el comando que buscará en todos los repositorios que conoce, incluido el de Jenkins que agregó, para encontrar el paquete de Jenkins. Una vez que encuentre el paquete Jenkins en el repositorio de Jenkins, lo descargará e instalará.
Ejecutemos este comando.
sudo yum install jenkins -y
Puede iniciar Jenkins usando este comando.
sudo systemctl start jenkins
Para comprobar que Jenkins se está ejecutando, utilice este comando.
sudo systemctl status jenkins
Verá el resultado tal como está en la siguiente captura de pantalla:
Jenkins ahora debería estar en funcionamiento.
Para acceder a la aplicación Jenkins, abra cualquier navegador web e ingrese la dirección IP pública o el nombre de dominio de su instancia EC2 seguido del puerto 8080.
http://<your-ec2-ip>:8080
La primera vez que acceda a Jenkins, se bloqueará con una contraseña generada automáticamente.
Debe mostrar esta contraseña usando el siguiente comando.
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
Copie esta contraseña, regrese a su navegador, péguela en el campo Contraseña de administrador y haga clic en "Continuar".
Entonces podrás ver esta página web.
Ahora puede utilizar su servidor Jenkins.
Ahora, como Jenkins funciona bien, puede comenzar a crear la canalización de Jenkins. Para crear una canalización de Jenkins, debe crear un nuevo "proyecto de estilo libre". Para crear un nuevo "proyecto de estilo libre", debe ir al panel de Jenkins y hacer clic en el botón "Nuevo elemento" .
Ingrese el nombre del “proyecto Freestyle” de Github (el nombre de “pipeline” se usará más adelante) y luego haga clic en el botón “Aceptar” .
Luego proporcione la descripción de la tubería.
Luego haga clic en el botón “Aplicar” y “Guardar”. Después de eso, significa que creó los fundamentos de la canalización que se construirá en este tutorial.
Ahora que Jenkins se ejecuta en la instancia del servidor virtual AWS EC2, puede configurar Git con la canalización.
Git es un sistema de control de versiones distribuido (VCS) gratuito y de código abierto diseñado para ayudar a los equipos de software a realizar un seguimiento de cada modificación del código en un tipo especial de base de datos. Si se comete un error, los desarrolladores pueden retroceder el tiempo y comparar versiones anteriores del código para ayudar a corregir el error y minimizar las interrupciones para todos los miembros del equipo. VCS es especialmente útil para
Git, como sistema de control de versiones más popular, nos permite extraer el código más reciente del repositorio Github de su proyecto a su instancia de servidor virtual EC2 donde está instalado Jenkins.
Utilice este comando para instalar Git.
sudo yum install git -y
Ahora verifique que Git esté funcionando, usando este comando.
git --version
Ahora Git está funcionando bien en la instancia del servidor virtual EC2.
Como Git funciona bien en la instancia del servidor virtual EC2, ahora podemos integrar Jenkins con Git.
Para iniciar esta integración, instalemos el complemento Jenkins Github.
Vaya a la sección del panel de Jenkins.
Haga clic en el botón "Administrar Jenkins" y luego haga clic en el botón "Administrar complementos" .
Haga clic en el botón "Complementos disponibles" .
Busque el cuadro de búsqueda del complemento Github .
Seleccione el complemento Github .
Seleccione el complemento Github . Y luego haga clic en el botón “Instalar sin reiniciar” .
Espere a que finalice la descarga del complemento Github.
¡Sí! El complemento Jenkins Github está instalado.
Ahora que el complemento GitHub Jenkins está instalado, puede configurar este complemento para integrar finalmente Jenkins con Git. Para hacerlo, debe regresar a la página principal haciendo clic en el botón "Volver a la página principal".
Luego, en la página principal, debe hacer clic en el botón "Administrar Jenkins" y luego hacer clic en el botón "Configuración global de herramientas" .
Luego en la página web de Configuración Global de Herramientas debes ir a la sección Git.
En la sección Git, debe configurar Git proporcionando el nombre y la ruta a Git en la computadora.
Luego haga clic en los botones “Aplicar” y “Guardar” **.**
Aquí ha terminado de configurar el complemento Jenkins Github.
Ahora, una vez instalado y configurado el complemento Jenkins Github, podrá utilizar este complemento dentro de su canalización. Esto permitirá que la canalización que creó en el módulo 2 extraiga el código de su proyecto del repositorio de GitHub especificado.
Bueno, para integrar este complemento en su canalización, debe ir a la sección Administración de código fuente y elegir Git en su canalización. Luego debe proporcionar la URL del repositorio de su proyecto. Si el repositorio de su proyecto es público en Github, no necesita proporcionar credenciales. Si el repositorio del proyecto es privado en Github, debes proporcionar credenciales.
Puedes usar mi proyecto con la siguiente URL del repositorio: https://github.com/Sunagatov/Hello.git .
Simplemente cópielo y péguelo en la entrada " URL del repositorio" . Luego haga clic en los botones "Aplicar" y "Guardar" para finalizar la integración de Git con el pipeline.
Ahora puede usar su canalización actualizada para extraer un proyecto de Github. Para hacerlo, debe hacer clic en el botón **“Construir ahora”**. Como resultado, verá una compilación exitosa en el historial de compilación.
Abra la primera compilación del historial de compilación.
Ahora puede ver el resultado exitoso del trabajo de la primera compilación. Si abre su terminal AWS EC2. Puedes comprobar que la tubería funciona bien.
Simplemente use este comando.
cd /var/lib/jenkins/workspace/{your pipeline name}
De esta manera, puede ver que su proyecto de Github se extrajo a su instancia de servidor virtual AWS EC2.
Apache Maven es una herramienta de gestión de proyectos y automatización de compilaciones ampliamente utilizada en el desarrollo de software. Agiliza el proceso de compilación, prueba y empaquetado de código al administrar las dependencias del proyecto y proporcionar un ciclo de vida de compilación consistente. Maven emplea archivos de configuración basados en XML (archivos POM) para definir la estructura, las dependencias y las tareas del proyecto, lo que permite a los desarrolladores gestionar e implementar de manera eficiente proyectos de software complejos.
Ahora que ha integrado Git en el proceso, puede mejorarlo aún más incorporando Apache Maven, que le permite compilar, probar y empaquetar su proyecto. Para hacerlo, necesita instalar Apache Maven en su instancia del servidor virtual AWS EC2 donde se instalaron Jenkins y Git.
Para descargar Apache Maven, vaya al directorio "/opt" .
cd /opt
Y luego usa este comando.
sudo wget https://dlcdn.apache.org/maven/maven-3/3.9.4/binaries/apache-maven-3.9.4-bin.tar.gz
Este comando descargará el último Apache Maven oficial (consulte la última versión en el sitio web oficial de Apache Maven). Para encontrar la última versión oficial de Apache Maven, utilice el enlace https://maven.apache.org/download.cgi .
Utilice este comando para extraer Apache Maven del archivo descargado:
sudo tar -xvzf apache-maven-*.tar.gz
Vaya a la carpeta raíz usando este comando.
cd ~
Edite el archivo .bash_profile usando este comando.
vi .bash_profile
Agregue las variables JAVA_HOME y M2_HOME.
Asigne la ruta a JDK11 para JAVA_HOME y la ruta al directorio maven para la variable M2_HOME .
Para encontrar la ruta JDK, use este comando.
sudo find / -name java
Cómo utilizar VIM
Guarde los cambios.
Luego, ejecute este comando para actualizar las variables del sistema.
source .bash_profile
Para verificar $PATH , use este comando.
echo $PATH
Para verificar Apache Maven , utilice este comando.
mvn -v
Si has hecho todo correctamente podrás visualizar la versión de Apache Maven.
Dado que Apache Maven se puede utilizar en una instancia EC2, puede instalar el complemento Apache Maven para integrarlo con la canalización.
Para lograr esto, siga estos pasos:
Espere a que finalice el proceso de descarga.
Y luego haga clic en el botón “Volver a la página principal” .
Con la instalación exitosa del complemento Apache Maven Jenkins, ahora puede utilizar este complemento dentro del proceso que creó y actualizó en los módulos 2 y 3.
Para hacerlo, siga estos pasos:
Luego vaya a la sección "Maven" . Haga clic en el botón "Agregar Maven" . Desmarque "Instalar automáticamente".
Luego agregue el nombre y la ruta MAVEN_HOME .
Haga clic en los botones "Aplicar" y "Guardar" .
Aquí ha terminado de configurar el complemento Apache Maven Jenkins.
Ahora que el complemento Apache Maven GitHub está instalado y configurado, ahora puede utilizar Apache Maven dentro de su canalización. Esto permitirá que la canalización que creó en el “[módulo 2]: Servidor Jenkins” construya el código de su proyecto para crear un artefacto jar.
Para integrar Apache Maven en la canalización, debe seguir estos pasos:
Finalmente, debe hacer clic en los botones "Aplicar" y "Guardar" para finalizar la integración de Apache Maven con la canalización.
Ahora puede utilizar su canal actualizado para construir su proyecto Github. Para hacerlo, debe hacer clic en el botón **“Construir ahora”**. Como resultado, verá un resultado de trabajo exitoso en el historial de compilación.
Si abre su terminal AWS EC2. Puedes comprobar que la tubería funciona bien.
Simplemente use este comando.
cd /var/lib/jenkins/workspace/{your pipeline name}/target
De esta manera podrá ver el artefacto JAR, que indica la compilación exitosa de su proyecto desde GitHub.
Ahora creemos una nueva instancia EC2 con el nombre "Ansible Server" donde instalará Docker y Ansible.
Utilice las instrucciones de la sección " Iniciar una instancia de servidor virtual AWS EC2" de este tutorial para finalizar este paso. No olvide agregar una configuración de grupo de seguridad. Permite que Docker y SSH funcionen en los puertos 8080 y 22 respectivamente.
Haga clic en el botón "Conectar".
Ahora puede ver la terminal en línea de la instancia del servidor virtual EC2.
sudo chown ansible-admin:ansible-admin /opt/docker
Ahora necesita instalar Docker en su instancia Ansible EC2. Para hacer eso, necesita crear una nueva carpeta acoplable.
sudo mkdir /opt/docker
Luego, instale Docker ejecutando el siguiente comando.
sudo yum install docker -y
Debe agregar el usuario actual "ansible-admin" al grupo Docker en el servidor virtual EC2 "AnsibleServer" para otorgar privilegios de administrador a Docker.
sudo usermod -a -G docker ansible-admin
Deberá cerrar sesión y volver a iniciarla para que estos cambios surtan efecto.
Luego puedes ejecutar el siguiente comando.
id ansible-admin
para ver que el nuevo usuario de Docker existe.
Ahora que Docker está instalado en la instancia Ansible EC2, puede iniciarlo ejecutando el siguiente comando.
sudo systemctl start docker
Cuando se inicia Docker, puede ejecutar el siguiente comando
sudo systemctl status docker
para ver que la ventana acoplable está activa y ejecutándose ahora.
En la versión final del proceso, el proceso implicará crear una nueva imagen de Docker a partir de su proyecto de GitHub y enviarla a Docker Hub. Para lograr esto, su proyecto GitHub debe contener un Dockerfile.
Si utilizó el proyecto "Hola" que se ofreció en el módulo " [Módulo 3]: Git y Github" , entonces no necesita crear un nuevo Dockerfile ya que este repositorio de proyectos ya contiene Dockerfile.
FROM eclipse-temurin:17-jre-jammy ENV HOME=/opt/app WORKDIR $HOME ADD hello-0.0.1-SNAPSHOT.jar $HOME ENTRYPOINT ["java", "-jar", "/opt/app/hello-0.0.1-SNAPSHOT.jar" ]
Si utilizó su propio repositorio de proyectos y no contenía un Dockerfile, deberá crear un nuevo Dockerfile.
Para crear un nuevo Dockerfile, ejecute el siguiente comando, que creará el nuevo archivo.
sudo touch Dockerfile
Luego puede completar este archivo con una secuencia de comandos que describan cómo crear un entorno de aplicación en contenedores. Estos comandos incluyen acciones como copiar archivos en la imagen, instalar software, configurar variables de entorno y configurar el contenedor.
Para llenar el Dockerfile con estos comandos, ejecute el siguiente comando.
vim Dockerfile
El Dockerfile está listo para usar.
Ahora que su Dockerfile está preparado para su uso, continúe copiando el artefacto JAR de su proyecto de la instancia EC2 **"JenkinsServer"** y péguelo en la instancia EC2 "AnsibleServer" . Es importante tener en cuenta que esta transferencia se automatizará aún más a lo largo del proceso.
Al completar este paso, estará listo para probar su Dockerfile junto con el entorno Docker que ha configurado.
Antes de comenzar las pruebas, asegúrese de autenticarse en Dockerhub. Ejecute el siguiente comando.
docker login
Este comando le pedirá que proporcione sus credenciales de inicio de sesión de Dockerhub, incluidos su nombre de usuario y contraseña.
Con esto, ha completado el proceso de inicio de sesión en Docker y ahora está listo para continuar con las pruebas.
Una vez completado el inicio de sesión exitoso en Dockerhub, ahora está listo para comenzar a probar el Dockerfile que ha preparado.
Ejecute este comando para crear una imagen acoplable.
docker build -t hello:latest .
A continuación, ejecuta el siguiente comando para establecer una etiqueta que facilitará la carga de la imagen en Dockerhub:
docker tag hello:latest zufarexplainedit/hello:latest
Finalmente, proceda a enviar la imagen de Docker a Dockerhub mediante la ejecución de este comando.
docker push zufarexplainedit/hello:latest
Siguiendo estos pasos, navegue hasta su cuenta Dockerhub para verificar si puede ver una imagen nueva o no.
Ahora deberías observar que la imagen se ha agregado efectivamente. Este resultado confirma la instalación exitosa del entorno Docker y que su Dockerfile es correcto.
Ahora configuremos el servidor Ansible en la instancia del servidor virtual EC2.
Necesita un servidor virtual para ejecutar Ansible.
Siga las instrucciones de la sección [Módulo 1]: Servidor virtual AWS EC2 de este tutorial para finalizar este paso y crear una instancia de servidor virtual EC2 para Ansible.
No olvide agregar una configuración de grupo de seguridad. Permite que Ansible y SSH funcionen en los puertos 8080 y 22 respectivamente.
Utilice el nombre "AnsibleServer" para distinguir su instancia de servidor virtual EC2.
Puede reutilizar el grupo de seguridad "CI_CD_Pipeline" y "CI_CD_Pipeline_Key_Pair" para una nueva instancia EC2 "AnsibleServer" .
Vaya a la página de inicio de la Consola de AWS → Panel de la Consola de administración EC2 → Instancias → AnsibleServer.
Luego haga clic en el botón "Conectar" .
Entonces verá esta página web. Debes volver a hacer clic en el botón "Conectar" .
Ahora puede ver la terminal en línea de la instancia del servidor virtual EC2.
Ahora configuremos Ansible Server en la instancia del servidor virtual EC2.
Lo primero que debe hacer cuando desee configurar AnsibleServer en la instancia del servidor virtual EC2 es cambiar su nombre de host.
Vamos a hacerlo. Ejecute este comando para abrir el archivo de nombre de host:
sudo vi /etc/hostname
Debería ver algo como esto:
Reemplace este nombre de host con "ansible-server". Luego, reinícialo.
sudo init 6
Ahora agreguemos un nuevo usuario ansible-admin a la instancia del servidor virtual AWS EC2.
Para hacer eso use este comando:
sudo useradd ansible-admin
Luego, configure la contraseña para el usuario ansible-admin .
sudo passwd ansible-admin
Además, debe configurar los privilegios de usuario editando el archivo sudoers .
sudo visudo
Agregue "ansible-admin ALL=(ALL) ALL" a este archivo sudoers .
Además, debe editar el archivo /etc/ssh/sshd_config para habilitar la autenticación de contraseña.
sudo vi /etc/ssh/sshd_config
Luego debes recargar el servicio para confirmar estos cambios.
sudo service sshd reload
Como resultado de ejecutar este comando, verá:
Ahora puede usar este comando para evitar agregar sudo a todos los comandos adicionales.
sudo su - ansible-admin
Más adelante en este artículo, planea administrar servidores remotos, como instancias de servidor virtual K8s EC2. Por eso es necesario configurar claves SSH.
ssh-keygen
Como resultado de ejecutar este comando, verá:
Ahora las claves SSH están generadas y listas para usar.
Ahora puede instalar Ansible en su instancia de servidor virtual EC2 “AnsibleServer” .
Vamos a hacerlo.
Ejecute este comando para instalar Ansible.
sudo amazon-linux-extras install ansible2
Para verificar Ansible, use este comando:
ansible --version
Como resultado de ejecutar este comando, verá:
Como Ansible está instalado en su instancia de servidor virtual EC2 “AnsibleServer” , puede configurar Jenkins para integrarlo con Ansible. Debe instalar el complemento "Publicar a través de SSH" para integrar Jenkins con la instancia del servidor virtual EC2 donde está instalado Ansible y con otras instancias del servidor virtual EC2 donde está instalado Kubernetes .
Vaya a "Panel de control" → " Administrar Jenkins" → "Configurar sistema" → "Complementos disponibles" .
Luego ingrese "Publicar a través de SSH" en el cuadro de búsqueda.
Haga clic en el botón "Instalar sin reiniciar" . Espere a que finalice el proceso de descarga.
Ahora el complemento "Publicar a través de SSH" está instalado en la instancia del servidor virtual Jenkins EC2.
Con la instalación exitosa del complemento Apache Maven Jenkins, ahora puede utilizar este complemento dentro del proceso que creó y actualizó en los módulos 2 y 3.
Para hacerlo, siga estos pasos:
Vaya a "Panel de control" → "Administrar Jenkins" → "Configurar sistema" → "Publicar a través de SSH" .
Ingrese todos los datos requeridos tal como aparecen en la captura de pantalla, incluido el nombre de host, el nombre de usuario y la clave privada (o contraseña, si corresponde).
Luego haga clic en los botones "Aplicar" y "Guardar" .
Aquí ha terminado de configurar el complemento Jenkins "Publicar a través de SSH" .
A continuación, haga clic en "Probar configuración" para validar que el complemento esté funcionando correctamente.
En el lado izquierdo puede ver que el estado de configuración del complemento de prueba es "Éxito". Significa que la configuración del complemento es correcta.
Debe crear una nueva carpeta en la instancia AnsibleServer EC2 donde se almacenará el JAR del proyecto. Este jar se utilizará para crear una imagen de Docker más adelante.
Empecemos.
Vaya a la carpeta "/opt" en la instancia AnsibleServer EC2.
cd /opt
Cree una nueva carpeta "docker" allí.
sudo mkdir docker
Otorgue privilegios a esta carpeta "docker" .
sudo chown ansible-admin:ansible-admin docker
Ahora, verifique los privilegios de la carpeta "docker" ejecutando este comando.
ll
Puede ver que se puede acceder a la carpeta "docker" con el usuario "ansible-admin" .
Ahora que el complemento Github "Publicar a través de SSH" está instalado y configurado, ahora puede integrarlo en la canalización que creó en el "[módulo 2]: Servidor Jenkins" para transferir un artefacto jar del proyecto desde " JenkinsServer" a “Servidor Ansible” .
Bueno, para integrar el complemento Github "Publicar a través de SSH" en el proceso, debes seguir estos pasos:
Finalmente, debe hacer clic en los botones "Aplicar" y "Guardar" para finalizar la integración del complemento "Publicar a través de SSH" con la canalización.
Ahora puede usar su canalización actualizada para transferir un artefacto jar del proyecto de " JenkinsServer" a "AnsibleServer" . Para hacerlo, debe hacer clic en el botón "Construir ahora" . Como resultado, verá un resultado de trabajo exitoso en el historial de compilación.
Si abre su terminal AWS EC2 “AnsibleServer” . Puedes comprobar que la tubería funciona bien.
Simplemente use este comando.
cd /opt/docker
De esta manera podrá ver el artefacto JAR, que indica la compilación exitosa de su proyecto desde GitHub.
Cuando ejecuta un libro de estrategias de Ansible, especifica los hosts en los que debe ejecutarse. Puede hacer esto de dos maneras:
hosts
en una lista de direcciones IP o nombres de host./etc/ansible/hosts
.
Al editar /etc/ansible/hosts
, puede administrar fácilmente grupos de hosts sin tener que escribir sus direcciones IP cada vez que ejecuta un libro de estrategias.
Averigüemos el host de la instancia AnsibleServer EC2 ejecutando el siguiente comando.
sudo ifconfig
Después de descubrir el host de la instancia AnsibleServer EC2, puede agregarlo al archivo de hosts de Ansible ejecutando el siguiente comando.
sudo vi /etc/ansible/hosts
También puedes agregar “[ansible]” como referencia.
Si está administrando un grupo de servidores y desea aplicar un libro de estrategias a todos ellos, en lugar de especificar la dirección IP de cada servidor en el libro de estrategias, simplemente puede agregar todos los servidores a un grupo en el archivo de inventario y luego especificar el grupo en el libro de jugadas.
Ansible está diseñado para automatizar tareas en servidores remotos. La autenticación SSH sin contraseña permite a Ansible conectarse a esos servidores sin la necesidad de ingresar una contraseña manualmente.
Ejecute este comando para crear una conexión segura desde su computadora a otra computadora (como la de la dirección IP 172.31.34.41), usando la clave SSH del usuario ansible-admin.
sudo ssh-copy-id -i /home/{your user name}/.ssh/id_rsa.pub {your user name}@{your host address}
En mi caso, se ve así.
sudo ssh-copy-id -i /home/ansible-admin/.ssh/id_rsa.pub [email protected]
Ahora puede ver "Número de claves agregadas: 1" . Significa que la instalación de autenticación SSH sin contraseña se completó con éxito.
Ahora que Ansible está todo configurado y listo para funcionar, puede crear un nuevo libro de estrategias de Ansible para su canalización. Este manual permitirá a Ansible crear y enviar una nueva imagen de Docker a Dockerhub.
Así es como puedes hacerlo:
touch hello-app.yml
hello-app.yml
recién creado. Ábrelo para editarlo con este comando. vi hello-app.yml
--- - hosts: ansible user: root tasks: - name: create docker image command: docker build -t hello:latest . args: chdir: /opt/docker - name: create tag to push image onto dockerhub command: docker tag hello:latest zufarexplainedit/hello:latest - name: push docker image onto dockerhub command: docker push zufarexplainedit/hello:latest
El manual de Ansible para tareas de Docker está listo para usar.
Con Ansible, el libro de estrategias de Ansible, AnsibleServer y JenkinsServer configurados correctamente, es hora de probar el libro de estrategias de Ansible.
Navegue hasta la ubicación de su libro de jugadas de Ansible.
cd /opt/docker
Luego, ejecute el siguiente comando.
sudo -u ansible-admin ansible-playbook /opt/docker/hello-app.yml
Al finalizar, verá el resultado de la ejecución exitosa de su libro de jugadas de Ansible.
Además, tómese un momento para visitar su cuenta de Dockerhub y verifique si ahora hay una nueva imagen visible.
Deberías ver la imagen recién agregada. Este resultado confirma que su manual de estrategias de Ansible es correcto.
Ahora que el complemento Github "Publicar a través de SSH" , Ansible y Docker están instalados y configurados, ahora puede integrarlos todos en la canalización que creó en el "[módulo 2]: Servidor Jenkins" para transferir un artefacto jar del proyecto. de " JenkinsServer" a "AnsibleServer" y luego cree una nueva imagen de Docker a partir de su proyecto y luego inserte esta imagen de Docker en Dockerhub.
Para lograrlo es necesario seguir estos pasos:
Finalmente, haga clic en los botones "Aplicar" y "Guardar" para finalizar las tareas de integración de Ansible Docker con la canalización.
Ahora puede probar su canalización actualizada para transferir sin problemas un artefacto jar del proyecto desde " JenkinsServer" a "AnsibleServer", luego crear una nueva imagen de Docker a partir de su proyecto y luego enviar esta imagen de Docker a Dockerhub. Para hacerlo, debe hacer clic en el botón "Construir ahora" . Como resultado, verá un resultado de trabajo exitoso en el historial de compilación.
Además, tómese un momento para visitar su cuenta de Dockerhub y verifique si ahora hay una nueva imagen visible.
Deberías ver la imagen recién agregada. Este resultado confirma que su manual de estrategias de Ansible con tareas de Docker se integró exitosamente en la canalización.
Ahora configuremos K8 en la instancia EC2. Creará una nueva instancia EC2 e instalará su herramienta de línea de comandos kubectl para interactuar más con un clúster de Kubernetes .
Utilice las instrucciones de la sección " Iniciar una instancia de servidor virtual AWS EC2" de este tutorial para finalizar este paso.
No olvide agregar una configuración de grupo de seguridad. Permite que todas las herramientas y SSH funcionen en los puertos 8080 y 22 respectivamente.
Utilice el nombre "K8sServer" para distinguir su instancia de servidor virtual EC2.
Puede reutilizar el grupo de seguridad “CI_CD_Pipeline” y “CI_CD_Pipeline_Key_Pair” para una nueva instancia EC2 “K8sServer” .
Haga clic en el botón "Conectar".
Ahora puede ver la terminal en línea de la instancia del servidor virtual EC2.
Lo primero que debe hacer cuando desee configurar KuberenetesServer en una instancia de servidor virtual EC2 es cambiar su nombre de host.
Vamos a hacerlo. Ejecute este comando para abrir el archivo de nombre de host:
sudo vi /etc/hostname
Debería ver algo como esto.
Reemplace este nombre de host con "kubernetes-server" y luego reinícielo.
sudo init 6
Su nombre de host fue cambiado.
Utilice este comando para comprobar la versión de AWS .
aws --version
De esta manera podrá ver su versión actual de aws-cli.
Si puede ver la versión aws-cli/1.18 , debe descargar la última versión.
Ahora que descubrió que tiene una versión antigua de aws-cli en su instancia EC2, debe actualizarla. Para eso, vaya a AWS → Documentación → Interfaz de línea de comandos de AWS → Guía del usuario para la versión 2.
Copie y pegue el comando curl .
Primero, ejecute este comando para descargar la versión 2 de awscli.
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
Espere a que comience el proceso de descarga.
Debería ver algo como esto.
En segundo lugar, debe ejecutar este comando para descomprimir el archivo awscli versión 2.
unzip awscliv2.zip
En tercer lugar, debe ejecutar este comando para instalar awscli versión 2.
sudo ./aws/install
Luego, vuelva a cargar el terminal en línea de la instancia del servidor virtual Kubernetes EC2.
A continuación, utilice este comando para comprobar la versión de AWS.
aws --version
Puede ver que aws cli tiene aws-cli/2.
Kubectl es una herramienta de línea de comandos fundamental para interactuar con cualquier clúster de Kubernetes, independientemente de la infraestructura subyacente. Le permite administrar recursos, implementar aplicaciones, configurar redes, acceder a registros y realizar otras tareas dentro de un clúster de Kubernetes.
Ahora necesita instalar la herramienta de línea de comandos kubectl para interactuar más con un clúster de Kubernetes. Para eso, debe ir a AWS → Documentación → Amazon EKS → Guía del usuario → Instalación o actualización de kubectl → Linux .
O simplemente haga clic en el enlace https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html .
Primero, ejecute este comando para descargar kubectl.
curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.27.1/2023-04-19/bin/linux/amd64/kubectl
Espere el proceso de descarga.
Verás algo como esto.
Dar permiso a kubectl.
chmod +x kubectl
Mueva kubectl a la carpeta /usr/local/bin.
sudo mv kubectl /usr/local/bin
Verifique la versión de kubectl.
kubectl version --output=yaml
Eksctl es otra herramienta de línea de comandos diseñada específicamente para el servicio Amazon EKS. Eksctl se puede utilizar para crear clústeres de AWS EKS, administrar grupos de nodos y realizar tareas específicas de EKS, como la integración con roles de IAM y otros servicios de AWS, abstrayendo gran parte de la configuración y administración de la infraestructura de AWS.
Ejecute el comando para descargar kubectl.
curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
Mueva eksctl a la carpeta /usr/local/bin.
sudo mv /tmp/eksctl /usr/local/bin
Verifique la versión de eksctl.
eksctl version
Deberías ver la versión.
Debe crear una función de IAM y adjuntarla a su instancia EC2 "KubernetesServer" .
Para hacer eso, necesita encontrar EC2 en el cuadro de búsqueda.
Elija EC2 Virtual Server haciendo clic en el enlace https://us-east-1.console.aws.amazon.com/ec2 /.
Vaya a Panel de IAM → Roles .
Haga clic en el botón "Crear rol" en la página web de roles de IAM .
Luego elija "servicio AWS", "EC2". Y haga clic en el botón "Siguiente" .
Luego, busque "AmazonEC2FullAccess" , "AmazonEC2FullAccess" , "IAMFullAccess" , "AWSCloudFormationFullAccess" en el cuadro de búsqueda y luego haga clic en el botón "Agregar permisos" .
Y luego haga clic en el botón "Siguiente" .
Luego escriba "Eksctl_Role" en la entrada "Nombre de rol" .
Y haga clic en el botón "Crear rol" .
El rol finalmente se crea.
Vaya a la página web de la instancia AWS EC2. Elija "Servidor Kuberbetes". Luego haga clic en "Acciones" → "Seguridad" → "Modificar función de IAM".
Elija "Eksctl_Role" y luego haga clic en el botón "Actualizar función de IAM" .
Ahora su rol de IAM está conectado con su “EKS_Server” y su herramienta eksctl.
Un clúster de Amazon EKS (Elastic Kubernetes Service) es un entorno de Kubernetes administrado en AWS que automatiza tareas complejas de infraestructura como configuración, escalado y mantenimiento. Es esencial ya que proporciona una plataforma eficiente, segura y optimizada para AWS para implementar, administrar y escalar aplicaciones en contenedores, agilizar las operaciones y liberar a los desarrolladores para que se concentren en la codificación en lugar de administrar la infraestructura subyacente.
Ahora es el momento de configurar su clúster EKS.
Para lograr esto, siga estos pasos:
eksctl create cluster --name cluster-name \ --region region-name \ --node-type instance-type \ --nodes-min 2 \ --nodes-max 2 \ --zones <AZ-1>,<AZ-2>
Por ejemplo, en mi caso, se ve así.
eksctl create cluster --name zufarexplainedit \ --region eu-north-1 \ --node-type t3.micro
Ejecute el comando modificado y espere pacientemente hasta que se complete el proceso de creación del clúster. Notará que el estado del clúster EKS se indica como "creando" en la página web de AWS CloudFormation.
El procedimiento de creación del clúster suele tardar unos 20 minutos. Una vez completado, el terminal mostrará el resultado del proceso.
Además, puede verificar el estado de creación exitosa del clúster EKS en la página web de AWS CloudFormation.
Un archivo YAML de implementación de Kubernetes es un script de configuración escrito en formato YAML que define cómo administrar y mantener una aplicación o servicio específico dentro de un clúster de Kubernetes. Encapsula instrucciones para orquestar la implementación, escalado, actualización y monitoreo de contenedores que ejecutan la aplicación. Este archivo incluye detalles como la imagen del contenedor, la cantidad deseada de réplicas, límites de recursos, variables de entorno, configuración de red y más. Cuando se aplica a un clúster de Kubernetes, el archivo YAML de implementación garantiza el estado deseado de la aplicación, gestionando automáticamente la creación, el escalado y la recuperación de contenedores para mantener el nivel deseado de disponibilidad y confiabilidad.
Ahora, como el clúster de Kubernetes, eksctl y kubectl están instalados y configurados, puede crear un archivo yaml de implementación de Kubernetes.
Puede hacerlo ejecutando el siguiente comando.
touch hello-app-deployment.yaml
Luego, edite este archivo ejecutando el siguiente comando.
vi hello-app-deployment.yaml
Agregue este contenido a hello-app-deployment.yaml.
apiVersion: apps/v1 kind: Deployment metadata: name: zufarexplainedit-hello-app labels: app: hello-app spec: replicas: 2 selector: matchLabels: app: hello-app template: metadata: labels: app: hello-app spec: containers: - name: hello-app image: zufarexplainedit/hello imagePullPolicy: Always ports: - containerPort: 8080 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 1
Ahora hello-app-deployment.yaml está creado y listo para usar.
Un archivo YAML del servicio Kubernetes es un script de configuración escrito en formato YAML que define una abstracción de red para un conjunto de pods, lo que permite acceder a ellos de manera consistente dentro de un clúster de Kubernetes. Este archivo describe cómo otros servicios o clientes externos deben descubrir, acceder y equilibrar la carga del servicio. Incluye especificaciones como el tipo de servicio (ClusterIP, NodePort, LoadBalancer), números de puerto, selectores para identificar pods y más. Cuando se aplica a un clúster de Kubernetes, el archivo YAML del servicio crea una IP virtual y un puerto que enruta el tráfico a los pods apropiados, abstrayendo los cambios subyacentes del pod y proporcionando un punto final estable para la comunicación, lo que permite una conectividad perfecta y un escalado dinámico.
Como el clúster de Kubernetes, eksctl y kubectl están instalados y configurados, puede crear un archivo yaml del servicio Kubernetes.
Para hacer eso, necesita crear un archivo yaml del servicio Kubernetes ejecutando el siguiente comando.
touch hello-app-service.yaml
Luego, edite este archivo ejecutando el siguiente comando.
vi hello-app-service.yaml
Agregue este contenido a hello-app-deployment.yaml.
apiVersion: v1 kind: Service metadata: name: zufarexplainedit-hello-app-service labels: app: hello-app spec: selector: app: hello-app ports: - port: 8080 targetPort: 8080 type: LoadBalancer
Ahora hello-app-service.yaml está creado y listo para usar.
Con su clúster de Kubernetes EKS instalado y configurado correctamente, y sus archivos de implementación y servicio de Kubernetes listos, es hora de poner las cosas a prueba utilizando los comandos de kubectl.
Aplicar implementación.
Utilice el siguiente comando para aplicar la configuración de implementación.
kubectl apply -f hello-app-deployment.yaml
Esto creará una implementación con la cantidad especificada de réplicas y una estrategia de actualización continua, lo que garantizará la disponibilidad y capacidad de administración de su aplicación.
2. Aplicar Servicio.
A continuación, aplique la configuración del servicio.
kubectl apply -f hello-app-service.yaml
Esto configurará un servicio tipo LoadBalancer, exponiendo su aplicación a Internet.
Tenga en cuenta que es posible que el LoadBalancer tarde un poco en aprovisionarse y adquirir una dirección IP externa.
Verifique el estado del LoadBalancer.
Supervise el estado de su servicio utilizando.
kubectl get service zufarexplainedit-hello-app-service
Cuando se asigna una IP externa, ya casi está listo para acceder a su aplicación.
Accede a tu aplicación.
Usando un navegador web, ingrese la dirección IP externa asignada seguida de :8080. Después de un breve momento, la página se cargará y mostrará el mensaje "HelloWorld". Tenga en cuenta que la carga inicial puede tardar unos segundos.
Cuando necesite ordenar recursos dentro de su entorno de Kubernetes, puede usar los siguientes comandos de kubectl para eliminar implementaciones, pods y servicios de manera efectiva.
1. Eliminar todas las implementaciones .
Para eliminar todas las implementaciones, puede utilizar el siguiente comando.
kubectl delete deployments --all
Esta acción garantiza que no queden instancias de implementación activas en su clúster.
2. Eliminar todos los pods .
Si necesita eliminar todos los pods, ya sea que estén administrados por una implementación o no, puede usar el siguiente comando.
kubectl delete pods --all
Borrar pods puede ayudar a restablecer el estado de su clúster o prepararse para nuevas implementaciones.
3. Eliminar todos los servicios .
Para limpiar servicios que exponen sus aplicaciones a la red, puede usar el siguiente comando.
kubectl delete services --all
La eliminación de servicios puede implicar tiempo de inactividad, así que considere las implicaciones antes de continuar.
Para eliminar todos los recursos asociados con el clúster de Amazon EKS especificado creado con eksctl
, incluidos los nodos trabajadores, los componentes de red y otros recursos, puede utilizar el siguiente comando.
eksctl delete cluster --name {your cluster name} --region {your region name}
Para mí lo es.
eksctl delete cluster --name zufarexplainedit --region eu-north-1
Asegúrese de estar seguro de detener el clúster, ya que esta acción es irreversible y provocará la pérdida de datos.
Ahora agreguemos un nuevo usuario ansible-admin a la instancia del servidor virtual AWS EC2 “KubernetesServer” .
Para hacer eso use este comando.
sudo useradd ansible-admin
Luego, configure la contraseña para el usuario ansible-admin .
sudo passwd ansible-admin
Además, debe configurar los privilegios de usuario editando el archivo sudoers .
sudo visudo
Agregue "ansible-admin ALL=(ALL) ALL" a este archivo sudoers .
Además, debe editar el archivo /etc/ssh/sshd_config para habilitar la autenticación de contraseña.
sudo vi /etc/ssh/sshd_config
Luego deberá recargar el servicio para realizar estos cambios.
sudo service sshd reload
Como resultado de ejecutar este comando, verá:
Ahora puede usar este comando para evitar agregar sudo a todos los comandos adicionales.
sudo su - ansible-admin
Más adelante en este artículo, planea administrar servidores remotos, como la instancia del servidor virtual EC2 de K8 . Por eso es necesario configurar claves SSH.
ssh-keygen
Como resultado de ejecutar este comando, verá:
Ahora las claves SSH están generadas y listas para usar.
Ansible está diseñado para automatizar tareas en servidores remotos. La autenticación SSH sin contraseña permite a Ansible conectarse a esos servidores sin la necesidad de ingresar una contraseña manualmente.
Ejecute este comando para crear una conexión segura desde su computadora a otra computadora (como la de la dirección IP 172.31.34.41), usando la clave SSH del usuario ansible-admin.
sudo ssh-copy-id -i /home/{your user name}/.ssh/id_rsa.pub {your user name}@{your host address}
En mi caso, se ve así.
sudo ssh-copy-id -i /home/ansible-admin/.ssh/id_rsa.pub [email protected]
Ahora puede ver "Número de claves agregadas: 1" . Significa que la instalación de autenticación SSH sin contraseña se completó con éxito.
Cuando ejecuta un libro de estrategias de Ansible, especifica los hosts en los que debe ejecutarse. En este paso, debe especificar el host de la instancia EC2 de KubernetesServer. Para hacerlo, debe repetir los mismos pasos que pasó en " [Módulo 6]: Ansible".
Averigüemos el host de la instancia EC2 de KubernetesServer ejecutando el siguiente comando.
sudo ifconfig
Después de encontrar el host de la instancia EC2 de KubernetesServer, puede agregarlo al archivo de hosts de Ansible ejecutando el siguiente comando.
sudo vi /etc/ansible/hosts
También puedes agregar “[kubernetes]” como referencia.
Ahora que Kubernetes está configurado y listo para funcionar, puede crear un nuevo libro de estrategias de Ansible con tareas de Kubernetes para su canalización. Este manual permitirá a Ansible ejecutar su aplicación en el clúster de Kubernetes con comandos kubectl.
Así es como puedes hacerlo:
touch kubernetes-hello-app.yml
hello-app.yml
recién creado. Ábrelo para editarlo con este comando. vi kubernetes-hello-app.yml
--- - hosts: kubernetes tasks: - name: deploy regapp on kubernetes command: kubectl apply -f hello-app-deployment.yaml - name: create service for regapp command: kubectl apply -f hello-app-service.yaml - name: update deployment with new pods if image updated in docker hub command: kubectl rollout restart deployment.apps/zufarexplainedit-hello-app
El manual de Ansible para tareas de Kubernetes está listo para usar.
Ahora que Kubernetes, Ansible y el manual de estrategias de Ansible para las tareas de Kubernetes están configurados y listos para funcionar, puede integrarlo con Jenkins.
Vaya a JenkinsServer → Panel de Jenkins → Nuevo elemento.
Cree un nuevo proyecto Jenkins Freestyle con el nombre "CD-Job".
Haga clic en el botón "Aceptar".
Vaya a la sección "Acciones posteriores a la compilación".
Haga clic en el botón "Agregar acción posterior a la compilación".
Elija la opción "Enviar artefactos de compilación a través de SSH".
Elija "AnsibleServer" como servidor SSH.
Agregue este comando a la entrada "comando ejecutivo".
sudo -u ansible-admin ansible-playbook /opt/docker/kubernetes-hello-app.yml
Haga clic en los botones "Aplicar" y "Guardar".
Vaya al panel de Jenkins → “CI_CD_Pipeline” → Configurar → sección “Acciones posteriores a la compilación”.
Haga clic en el botón "Agregar acción posterior a la compilación".
Elija la opción "Crear otros proyectos".
Vaya a la sección "Crear otros proyectos".
Elija la opción "Activar solo si la compilación es estable".
Agregue "CD-Job" a la entrada "Proyecto para construir".
Haga clic en los botones "Aplicar" y "Guardar".
Ahora puedes considerar que la tubería está completamente terminada y lista para usar.
Ahora es el momento de poner a prueba la versión final del pipeline.
Navegue a Jenkins → Panel de Jenkins → "CI_CD_Pipeline".
Haga clic en el botón "Construir ahora".
Para ver los resultados, revise los registros de la consola de compilación.
Notará que el "CD-Job" se activó en los registros de la consola de compilación y el estado final está marcado como ÉXITO.
4
Además, puede dirigirse a Dockerhub para confirmar la adición de la nueva imagen de Docker.
Y finalmente, puede acceder a su aplicación mediante un navegador web. Ingrese la dirección IP externa asignada seguida de ":8080". Después de un breve momento, la página se cargará y mostrará el mensaje "HelloWorld".
¡Enhorabuena por configurar este moderno canal de CI/CD!
¡Has hecho un trabajo increíble y eres un verdadero héroe!
¡Gracias por todo tu esfuerzo!
Zufar Sunagatov es un experimentado ingeniero de software senior apasionado por el diseño de sistemas de software modernos.