Glosario básico DevOps [ES]
Tags: devops, docker, terraform, microservices
Published: 2021-01-12 20:48:20

El mundo del DevOps tiene una gran cantidad de herramientas y términos que se deberían conocer si se está interesado en adentrarse en él y aplicar esta filosofía sea en sus nuevos proyectos o empresa, este es un post por el que puedes empezar. 

A continuación definiré varias términos importantes

**GIT** 🌱

Es la herramienta usada para llevar el control de versiones de un repositorio de código, cuenta con distintas funcionalidades para cumplir el objetivo de gestionar de forma eficiente y fácil estos proyectos, tales como ver el historial de cambios que se han realizado, regresar a un punto específico en estos cambios si es necesario, crear copias separadas (ramas) donde se pueden generar cambios sin estropear el proyecto principal de esta forma se puede trabajar de forma colaborativa donde cada desarrollador puede realizar su cambio(commit) subirlo(push) luego unirlo(merge) con los cambios de los demás , también permite llevar a este versionamiento a un repositorio remoto donde existen distintos proveedores como Github, Gitlab, BitBucket cada uno con sus distintas características

**Microservicios** 🎛️

Es una de las distintos patrones de arquitectura de software que existen en la actualidad donde el sistema completo es un conjunto de pequeñas piezas de software en este caso llamados servicios con objetivos y funcionalidades diferentes, estas piezas de software son aplicaciones que pueden estar escritas en lenguaje de programación diferentes la una de la otra y son independientes pero tienen comunicación con el resto del conjunto, el objetivo es que estos servicios sean de un tamaño reducido lo cual permita su portabilidad y escalabilidad, llegando a replicarse en distintos entornos o servidores con facilidad, es aquí donde aparece el conecpto de contenerización(será explicado más adelante) donde cada microservicio/aplicación se vuelve un contenedor 

Por ejemplo: Aplicación de voto electrónico

Cliente-web-voting(React Js) -> Collect Votes (RedisDB) -> Consume Votes (Java) 
-> Storage(PostgresDB) -> Print Results(NodeJS) 

En este ejemplo vemos que cada servicio puede estar elaborado con un lenguaje o tecnología diferente y se comunican entre sí 

**Docker** 🐳

Es una tecnología que permite el desarrollo y manejo de contenedores de aplicaciones, los contenedores Docker NO son máquinas virtuales aunque su razón de ser es parecida distribuir y optimizar recursos es aquí donde Docker lo hace mejor que las VM   reduciendo espacios y recursos innecesarios dejando únicamente el proceso que necesita ejecutar la aplicación y empaquetándolo para su posterior transporte a cualquier entorno que ejecute este software así cada contenedor se vuelve un proceso aislado de los demás pero que corre sobre el mismo sistema operativo. Al ser un software completo consta de una arquitectura con diversos compenentes como un CLI (permite la ejecución de comandos) - Rest API - Daemon/Server , y distintas funcionalidades como personalizar estos contenedores que para su creación se basan en imágenes de software existentes.
Vale la pena señalar que Docker no es la primera ni la única herramienta que cumple con este propósito, basta con una pequeña búsqueda y podrás conocer alternativas, pero si es la más utilizada al momento de este post

**Docker-compose** ⛲

Es una herramienta de Docker que permite agrupar la configuración de distintos contenedores que pueden pertenecen a un mismo proyecto o sistema, si leíste los dos conceptos anteriores tendrás claro el propósito de compose, la forma en la que se usa esta herramientas es escribiendo en un archivo de extensión .yml a modo de texto plano todo lo que se desea que configurar en los servicios como: puertos, comandos, variables de entorno, redes, y un largo etc(dependiendo del contenedor y objetivo)

Generalmente este archivo es nombrado "docker-compose.yml"

Ejemplo: crear un contenedor de Aula Virtual (Moodle) y lo comunica con una BD(MySQL) y se enlaza a un proxy de Nginx
Revisa más detalles en mi repo: https://github.com/kevingo710/ngninx-moodle-wp

```
version: '3'

services:
    dbapp:
        image: mysql:5
        restart: always
        volumes:
            - db-volume:/var/lib/mysql
        env_file:
            - moodle_variables.env
        deploy:
            replicas: 1
            restart_policy:
                condition: any
    moodleapp:
        image: jhardison/moodle:latest
        links:
            - dbapp:DB
        depends_on:
            - dbapp
        restart: always
        volumes:
            - moodleapp-data:/var/moodledata
        expose:
            - 80
            - 443
        environment:
            - VIRTUAL_HOST=moodle.dinasaccarola.tk
            - LETSENCRYPT_HOST=moodle.dinasaccarola.tk
            - LETSENCRYPT_EMAIL=example.email.tic@mail.com
        env_file:
            - moodle_variables.env
        deploy:
            replicas: 1
            restart_policy:
                condition: any
                
volumes:
    db-volume:
    moodleapp-data:

networks:
  default:
    external:
     name: nginx-proxy
```
Aquí se definen los servicios se establecen los nombres, se estables comandos y puertos asi como una red configuración de volúmenes para persistencia de los datos y variables de entornos 


**YAML** 📑

En el ejemplo anterior se trabajo con esta extensión, a continuación la explicación del mismo, este es un formato de texto plano que pretende ser entendible por humanos y es ampliamente usando para configuración en diversos software uno de ellos es Docker, también Kubernetes y herramientas de CI/CD como Jenkins, Gitlab CI/CD, CircleCI, TraviCI y más...

Existen tres reglas básicas en yml y lo comparemos con json 

  

> Identación - solo 2 o 4 espacios


![yml1.jfif](https://cdn.hashnode.com/res/hashnode/image/upload/v1609965122300/pI0BXpEW2.jpeg)




> Formato - pares clave-valor

![yml2.jfif](https://cdn.hashnode.com/res/hashnode/image/upload/v1609965232744/Er1jvUvx1.jpeg)

 
> Manejo de Listas - colleciones 


![yml3.jfif](https://cdn.hashnode.com/res/hashnode/image/upload/v1609965258072/CxuwJOt40.jpeg)


Existen muchas otras reglas de yml y estas tiene especificaciones de acuerdo al software en que se está empleado este formato lo cual podrás revisar en su documentación de acuerdo con tu necesidad

Como saber si esta correcta la sintaxis ? 

Muchos de los software que lo emplean tienen integrados linters donde se puede probar que no existan errores pero acá te dejo tres alternativas

Editor online YAML linter http://yamllint.com

CLI https://yamllint.readthedocs.io/en/stable/

VSCode extensión https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml

**Kubernetes** ☸️

Es una solución que permite la orquestación de contenedores, si bien con Docker podemos manejar contenedores relativamente fácil que sucede si no solo manejamos 1 o 2 contenedores si no un número que ya no podemos representar con los dedos de las manos como 100 o 1000 es aquí donde se usa esta tecnología que cuenta con la infraestructura y herramientas necesarias para cumplir estas tareas que pueden llegar a ser complejas y críticas dentro de la organización pues una aplicación que requiera un número alto de contenedores de por sí tiene un gran número de usuarios. Brevemente la funcionalidad de k8s es crear una arquitectura de cluster que permite agrupar estos contenedores en pods(servidores) y crear replicas para asegurar la escalabilidad

**Serverless Computing** ⛳

Es un paradigma computacional el cual se caracteriza por no manejar infraestructura de servidor para desplegar una aplicación o servicio, lo único necesario es el código, tienen su origen en el paradigma de programación funcional donde una única entrada en este caso el código tiene una única salida siendo esta la aplicación o servicio en funcionamiento, su uso y popularidad empezó junto con la computación en la nube debido a que los proveedores empezaron a crear estos servicios teniendo cada uno de ellos todo un catálogo AWS Amplify/Lambda, Azure Functions , etc. 

Su enfoque esta orientado a desarrollos rápidos y dar facilidad de uso a los programadores pues aprender herramientas y conceptos para administrar infraestructura tiene su curva de aprendizaje y complejidad para la cual no todos tienen las ganas o el tiempo suficiente y se puede optar por esta opción 

**Continous Integration** ♻️

En un entorno de desarrollo el código esta un repositorio centralizado donde constantemente se están haciendo cambios, aplicando la filosofía DevOps la integración continúa consiste en probar esos cambios automáticamente para depurar posibles errores existentes en el código y que no lleguen a producción, es decir si todo está correcto en los cambios de código y pasa todos los test establecidos se combina y continúa el ciclo caso contrario se rechaza para una revisión

**Continous Delivery** 🪂

Siguiendo el ciclo si se pasa la fase de integración, sigue la fase de entrega o distribución donde se obtiene también de forma automática un producto final o base de código en otros casos artefacto dependiendo esto del proyecto que está listo para implementarse en cualquier entorno de producción, en esta fase también se puede hacer pruebas automatizadas, esta sería la fase previa al despliegue que también esta considerado en el ciclo como Continous Deployment


**Infrastructure as Code** 📜

Consiste en realizar la creación y configuración de infraestructura(hardware como máquinas virtuales, disco, redes y demás)  mediante código legible y entendible para los humanos con el fin de automatizar y documentar estos procesos ya que al ser código también se lo puede versionar y llevar a un repositorio, su uso esta orientada a entornos Cloud y algunos proveedores tienen su propias soluciones como: AWS-CloudFormation, Google Cloud-Deployment Manager, aunque existen otras soluciones compatibles también con distintos proveedores así como Terraform

En resumen usted podrá mediante código en su máquina local crear y aprovisionar infraestructura en la nube, sin tener que pasar por los paneles de administración del proveedores(que cambian constante) haciendo click en las distintas opciones que en ocasiones olvidarás


**Terraform** ♈

Es una de las opciones de herramientas para manejar Infraestructura como código que permite gestionar distintos proveedores Cloud puede ser al mismo tiempo, o permite manejar nuestra propia infraestructura, tiene su propia sintaxis muy parecido al lenguaje humano, la extensión de sus archivos es .tf, tiene su CLI para ejecutar sus propios comandos que mostrarán la salida, por tanto con terraform podemos crear y destruir infraestructura en la nube en cuestión de minutos o segundos

**Immutable Infrastructure** 🏛️

Es una forma de crear infraestructura de tal manera que no se modifique luego de la implementación y si esto es necesario se creará nueva infraestructura basándose en los mismos principios pero con las nuevas características, la computación en la nube ha permitido extender esta práctica debido a los recursos casi ilimitados siendo esta una de las limitaciones de esta metodología, también la infraestructura como código al nivel de automatización colabora en el uso de esta práctica en el proceso de despliegue que acorde a su estrategia hará uso de la misma