Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Introducción
Presentación del curso “DevOps esencial”
Hola, soy Álvaro González Crespo y soy administrador de sistemas especializado en
soluciones "cloud" y contenedores. En este curso, vamos a familiarizarnos y a aprender los
conceptos de la filosofía de trabajo DevOps, de dónde proviene, qué nos ofrece para
mejorar nuestros flujos de trabajo y cómo aplicarla a nuestros procesos. Durante el curso,
veremos los orígenes de DevOps en el "Toyota Production System" de los años 40, qué
problemas arrastramos en nuestras metodologías de trabajo tradicionales en el entorno
de la consultoría informática, en qué consisten los procesos de mejora continua y qué
métodos –como la monitorización, el análisis de código, los test automáticos, la
programación por pares y más– podemos implantar en nuestra infraestructura para
mejorar el flujo de trabajo y reducir nuestra problemática diaria. Al terminar el curso,
seremos capaces de realizar una profunda revisión de todo nuestro flujo de trabajo de
desarrollo y operaciones y podremos detectar los puntos débiles del mismo para mejorar
significativamente la velocidad de respuesta, la productividad y la visibilidad de todas las
partes de nuestro proyecto, al mismo tiempo que reducimos la tasa de errores y los
tiempos de caída del sistema.
Objetivos de DevOps
No nos interesará implementar un método de trabajo DevOps si no vemos ninguna
ventaja. Así que vamos a ver cuáles son los principales objetivos que obtenemos o que
buscamos obtener con un flujo de trabajo de este tipo. Aunque dependiendo de la
especialización o del autor de la metodología DevOps que consultemos los objetivos o los
nombres no serán exactamente los mismos, me voy a basar en cinco puntos muy comunes
y sencillos que encontraréis a menudo en mucha metodología. En el mundo tradicional del
desarrollo, estamos acostumbrados a compilar y desplegar muy poco. Con compilar me
refiero a una "release" o versión completa de nuestro proyecto, que normalmente
preparamos solo cada muchos meses o quizá años. Y es que es muy típico ponerse a
programar como locos durante meses y meses, y solo cuando ya creemos tener una
versión completa empezamos a compilarlo y empaquetarlo, y es entonces cuando
empezamos a encontrar todo tipo de errores, problemas de integración, etc. Por lo tanto,
uno de los objetivos que pretendemos cumplir utilizando metodologías DevOps es
mejorar la frecuencia y, por supuesto, la calidad del despliegue. Utilizando herramientas
como el "continuous delivery" o el "continuous deployment" –esto es, la entrega continua
y el despliegue continuo–, compilamos y testeamos nuestro código continuamente cada
vez que se realiza un cambio, y así, por un lado, captamos los errores tempranamente y,
por otro, tenemos siempre listas versiones entregables de nuestro "software". Mejorar el
"time to market" o nuestro tiempo de salida al mercado. Precisamente la aplicación de,
entre otras, las técnicas anteriores nos permiten salir al mercado de manera más ágil al
detectar los errores con celeridad y empezar a trabajar con productos funcionales
tempranamente. Además, la aplicación de estos ciclos de monitorización, testeo continuo
y corrección –que no nos cansaremos de repetir en el curso– nos permite capturar rápido
los errores que se nos escapan al entorno de producción y corregirlos produciendo el
menor impacto posible, reduciendo las tasas y los tiempos de error en nuestro producto.
No solo eso, sino que, además, al trabajar con menores cantidades de cambios cada vez y,
por supuesto, aprovechando toda la monitorización que realizamos, las correcciones se
realizarán en un tiempo mucho más corto al poder encontrar con más facilidad el origen
de los fallos. Los objetivos que buscamos no son triviales ni el proceso a llegar a ello
tampoco, pero una vez puesto en marcha el proceso, cada paso será más sencillo que el
anterior. Así que os animo a seguir investigando el tema.
DevOps: Analiza
Es imposible revisar todos los datos que recibimos de la monitorización; y en su mayoría,
vistos de manera global, son innecesarios. Y es, por lo tanto, imprescindible que
realicemos un buen análisis de ellos para que tengan algún sentido. El primer recurso y el
más socorrido sería utilizar medias y desviaciones estándar. Si nuestros datos de
telemetría tienen una distribución gaussiana, que la mayoría de las veces no la tienen,
podría ser una buena idea establecer una alerta cada vez que la telemetría excede en X
veces la media de nuestros datos. Y aquí nos puede llegar nuestra primera duda: ¿y con
qué datos debemos poner las alertas? Si ponemos alertas en demasiados valores,
corremos el riesgo de molestar o despertar excesivamente al personal de operaciones,
muchas veces de manera incorrecta. Y es que cuando nos ponemos a monitorizar
utilizando las medias de nuestros datos, nos encontramos el primer problema: los picos
continuos de nuestro tráfico hacen saltar las alertas continuamente y elevar el nivel de
alerta hasta un punto en el que no se produjera este problema destrozaría todo el sentido
y la utilidad de las alertas en sí mismas. Para ello, el primer método que podemos utilizar
son las medias móviles. En vez de realizar –o dibujar, más bien– una toma de datos
instantánea de cada punto de la gráfica, juntamos los valores de los últimos 5, 10 o 15 min
para realizar una media, lo que suaviza extremadamente las gráficas y nos ayuda a evitar
estos picos que nos hacen saltar falsas alarmas. Y aquí llegamos con el segundo problema:
el truco de la media móvil nos detecta picos de tráfico continuados de periodos más largos
que la media móvil que se está calculando, pero no detecta auténticas anomalías, como
podría ser el caso de esta gráfica. Como podéis ver en este tráfico de media móvil, no
tenemos picos hacia arriba, sino que tenemos tres anomalías de bajada de tráfico que
podrían coincidir con algún tipo de problema o incidencia. Para solucionar este problema,
deberíamos usar un algoritmo de detección de anomalías, ya bien un Kolmogorov-Smirnov
o, por ejemplo, la herramienta que ha liberado Twitter para la detección de anomalías. Es,
por lo tanto, importante pensar que en cualquier método de monitorización y detección
de anomalías tendremos varios campos en los que trabajar: el dónde monitorizamos, el
cómo monitorizamos y qué problemas por arriba y por abajo de la gráfica no podemos
monitorizar que sean interesantes para nuestra producción.
Herramientas DevOps
DevOps: Integración y despliegue continuos
En el centro de casi cualquier plataforma DevOps podemos encontrar herramientas de
integración continua y despliegue continuo, tanto "online" como integradas dentro de
nuestros servidores. Veamos unas cuantas. Por supuesto, la primera solución de la que os
hablo es de Jenkins, que es prácticamente el más clásico o el más conocido de los sistemas
de CI. Es "open source", es heredero de un sistema de CI más antiguo que Jenkins llamado
Hudson. Es una CI muy clásica, pero que tiene gran cantidad de "plugins" para casi
cualquier cosa: para conectar con la nube, para autoescalar, etc. Proviene del ecosistema
Java. Era muy, muy conocido y muy popular dentro de Java y además se está poniendo
muy al día con una reestructuración de código que están haciendo que se llama Blue
Ocean. Gitlab CI es un "software" "open source" que es un sistema completo para gestión
de vuestro código. Tiene el sistema de control de versiones, que está basado en Git.
Podría decir, vagamente, que es una especie de clon de GitHub, tiene sistema de gestión
de incidencias, tiene sistema de DevOps para despliegues automáticos, tiene "workers"
locales o en la nube para hacer nuestras compilaciones, tiene por supuesto la integración
continua y se puede instalar tanto en nube, puedes tener también una instalación
administrada por ellos de pago o puedes instalártelo en local. Aparte, los test para la CI
están integrados dentro del código y por lo tanto están versionados. Los test que lances
para las aplicaciones serán dependientes de la versión y por lo tanto podrán ir
personalizados para cada rama o versión que estés ejecutando. Atlassian Bamboo es un
"software" cerrado, un "software" privativo que es parte de la suite Atlassian. A día de
hoy, solo está la versión On Premises, aunque antes había una versión también de la nube
que podías pagar aparte. A día de hoy, si quieres una versión Cloud, tendrás que usar la
que está gestionada por Bitbucket Pipelines, ya que Bitbucket, que es propiedad también
de Atlassian, tiene una versión un poco más sencilla, pero "cloud" de integración continua,
que a lo mejor te puede ser suficiente. Las licencias de Atlassian Bamboo se compran por
cantidad de agentes. Circle CI es otro "software" cerrado, otro "software" privativo que lo
tienes en versiones "enterprise" On Premise o también en versiones en la nube. Corre
tanto en Linux como en OS X, por lo tanto, te permite hacer compilaciones de "software"
de OS X y te cobran las licencias ya bien por "builder", ya bien por usuario. Travis CI tiene
dos versiones: tiene On Premises o en la nube. Ambas dos son propietarias, son de
"software" cerrado, y las licencias de Travis CI se cobran por trabajos simultáneos.
DevOps: Monitorización
La monitorización, esencial para saber el estado de nuestra plataforma, debe de ser capaz
de captar información de todos nuestros servicios y mostrarla de una manera útil. Dentro
del "software" de monitorización, uno de los que más solera tiene, y quizá en algunos
ambientes sea de los más conocidos, sería Nagios o su "fork" Icinga. Es un sistema de
monitorización muy clásica orientado sobre todo a sistemas, a cacharros físicos –por
decirlo de alguna manera– y funciona con agentes que se conectan como NRPE, NRDP,
NSClient++, NCPA... y además se puede conectar a través de SNMP a servidores SNMP
para hacer extracción de datos de estado. Tiene un gran catálogo de "plugins" que puede
servir para realizar extensiones a su funcionalidad. Quizá se le tiene en mente como un
poco chapado a la antigua para lo que es el estado del arte actual de la monitorización.
Telegraf y Statsd son dos agentes ligeros, o muy ligeros casi cabría decir, que hacen
extracción de datos de los nodos y envían a bases de datos de tiempo información sobre
ellos. Telegraf funciona de manera "pull" extrayendo datos o con "plugins", aunque tiene
la opción de un "listener", es decir, de abrir un puerto para recibir información sobre estas
estadísticas. El "backend" que utiliza por defecto para almacenar la información es
InfluxDB, la base de datos de eventos de tiempo, aunque tiene "plugins" para Graphite,
Prometheus, ficheros, etc. En Statsd, quizá la orientación es un poco diferente o casi al
revés. Es un agente ligero en el que tiene un puerto, un "listener", en el que recibe
contadores directamente de las aplicaciones. Son las aplicaciones las que le mandan
información a él. El "backend" por defecto que utiliza es Graphite, pero tiene "plugins"
para InfluxDB, Mongo, StackDriver, etc. Graphite y Grafana serían las partes visuales. Lo
que hacen es conectarse a una base de datos de eventos de tiempo o una base datos en
general –soportan Graphite, InfluxDB, Prometheus, CloudWatch, etc.– y visualizarlo según
nuestras reglas, según las plantillas que nosotros creamos para poder tener visibilidad de
todos los eventos que nosotros creamos oportunos. Tiene integración con alertas y
además podemos establecer determinados niveles de alerta para visualizarlas, y tiene
soporte de un montón de "plugins" para extraer información de servicios externos que no
son su "backend" habitual como Graphite o InfluxDB. AWS CloudWatch y Google
StackDriver son dos sistemas de monitorización como servicio que están cada uno
desplegados en su respectiva nube y que están integrados con todos sus servicios.
Realizan monitorización, "logging", alertas, etc. y tienen integración con procesos
externos, tanto como para recibir datos y guardar la monitorización como para abrir sus
datos al exterior y que podamos tomar la información de sus eventos. Pingdom y
StatusCake son dos monitores clásicos de disponibilidad de páginas web, de "sites". Lo
que hacen es conectar remotamente al puerto que nosotros designemos, al 80 o al 443, y
verificar que la página está activa y no se ha caído, que sigue funcionando. Tienen varios
servicios, como monitorización de certificados SSL para evitar que nos pille el toro con el
tema de las caducidades de los certificados, control de "uptime" de los "sites", guardan
una base de datos de cuántas son las caídas, de cuánta duración y nos pueden decir el
"uptime" de funcionamiento de nuestros "sites". Tienen sondas repartidas
geográficamente. Esto es, las sondas que realizan las conexiones a nuestros "sites" para
comprobar que están activos no están localizadas solo en un sitio, sino que tienen decenas
de ellas por todo el mundo para ya bien evitar o incluso mostrar problemas de red que
nos podían evitar una falsa alarma dentro de un "site". Aparte, soportan envío de alertas
por Pushover, por SMS y algunos servicios adicionales. NewRelic y Rollbar entran en una
categoría un poco diferente de monitorización. Están más orientados a lo que se llama el
APM: "Application Performance Management", es decir, la gestión de monitorización del
"performance", del rendimiento de las aplicaciones. Monitorizan directamente el
rendimiento, tanto de "front", como de "back", como de móvil. Tienen test de percepción
de rendimiento por el usuario, por los tiempos de carga. También vigilan y tienen control
sobre los errores que tiene la aplicación. Producen "logs" de ello y además pueden volcar
alertas en el caso de pasar algún tipo de límite, de "threshold". Y además soportan
múltiples lenguajes y "frameworks" en los que se pueden integrar para extraer estos datos
de "performance".
DevOps: Alerta
Tanta monitorización no nos servirá de mucho si no tenemos un sistema de alertas que,
de día o de noche, nos haga saber si hemos perdido el control de algún servicio. Kapacitor
es un "software" que se conecta a nuestro InfluxDB para realizar extracción de datos con
"Influx Query Language". Es capaz de detectar anomalías con los diversos "plugins" que
contiene analizando los flujos de información. Es capaz de reconvertir esos flujos de
información y volver a insertarlos luego en InfluxDB. Está orientado a acciones. También
se pueden programar anomalías personalizadas con un sistema de UDF. Y es capaz de
integrarse, entre otros, con HipChat, OpsGenie, Alerta, Sensu, PagerDuty, Slack, etc.
OpsGenie, VictorOps y PagerDuty son sistemas de gestión de turnos de guardia y
operaciones. Son capaces de hacer triaje de los eventos que reciben, pueden enrutar
llamadas y alertas según horarios, preferencias, niveles, escalado, etc. Pueden
automatizar respuestas respecto a las alertas que reciben para ir creando eventos
automáticos y nos ayudan a realizar los informes "post mortem" después de una alerta o
de una operación o de una incidencia. Pushover es un sistema muy sencillo, pero muy
eficaz, de notificaciones móviles. Hace una cosa y la hace bien, que es enviar
notificaciones a Android, iOS y equipos de escritorio y gestionarlo a través de grupos.
Además, tiene un sistema que le permite integrarse con terceros para enviar estas
notificaciones.
La infraestructura como código en DevOps
Aprovechando esa fuente de la verdad única que deberíamos tener en nuestro proyecto,
podemos almacenar toda la configuración de la infraestructura y servidores en forma de
código y gestionar los cambios como si fueran versiones de nuestro "software". Ansible es
un "software" que permite automatizar el provisionamiento de "software", la gestión de
configuración, el despliegue de aplicaciones... tanto en máquinas virtuales como físicas. Es
parte de RedHat, está basado en Python, el formato que usa es el formato "push", es
decir, el cliente Ansible se conecta a los "host" que tiene que configurar y les empuja, les
envía la configuración necesaria. Puede funcionar con o sin servidor y lo puedes utilizar
tanto On Premises como en un servicio en la nube llamado Tower. Las licencias para el
servicio Tower se compran en número de bloques de nodos. Chef es otro sistema parecido
de provisionamiento, configuración y despliegue de aplicaciones que está basado en Ruby
y Erlang. en este caso el modelo es "pull", es decir, los nodos que queremos configurar
contienen un cliente Chef que se conectan al servidor y se traen la configuración y la
ejecutan. Tienen tanto instalación como On Premises, como en forma de servicio en la
nube, que se llama Chef Automate, y se pagan las licencias por número de nodos. Puppet
es aún otro sistema más de automatización y de orquestación, que está basado en C++ y
en Clojure, aunque antiguamente estaba basado en Ruby. Al igual que Chef, utiliza un
modelo tipo Pull –es decir, con un cliente en los nodos a configurar– y tiene tanto
versiones "enterprise" como "open source". Salt Stack es un sistema mixto también de
orquestación, provisionamiento, configuración, etc. que tiene tanto "push" como "pull".
Funciona de las dos maneras: empujando la configuración y tomándola desde un servidor.
Está basado en Python y dispone tanto de versiones "enterprise" como "open source".
Finalmente tenemos el "stack" HashiCorp, que nos lo puede hacer prácticamente todo.
Está basado en Go, tiene un sistema de uso "push", es decir conectándose a los sitios
necesarios para empujar la configuración. Y tiene varios módulos: Primero, Packer como
construcción de imágenes, es decir, es un "software" que se utiliza para construir todo
tipo de imágenes para máquinas virtuales, contenedores, etc. tanto en la nube: de
Amazon Web Services, Google Cloud Engine, para Azure, como para local: para Docker,
para VirtualBox, KVM, etc. Tenemos también Terraform, que es un constructor,
orquestador de infraestructura. Tiene una serie de "providers", de "plugins" que puedes
conectar a diferentes nubes: Google Cloud, Amazon, etc. y nos permite, partiendo de unas
plantillas basadas en unos ficheros de configuración que nosotros podemos mantener en
el código fuente, desplegar y mantener automáticamente toda la infraestructura de uno
de nuestros proyectos. Podemos mantenerlo en nuestro repositorio de código, ejecutar
los cambios directamente en estas plantillas cuando agregamos una máquina, cuando
cambiamos la cantidad de un escalado... Podemos aplicarlo con Terraform y él
automáticamente se encargará de conectarse a la API del servicio que estemos utilizando,
de preocuparse que todo está exactamente igual, que la receta, que la plantilla que
tenemos hecho... y si no está igual, de llegar a ese estado como haga falta. Consul es un
servicio relativamente pequeño que se utiliza para descubrir otros servicios. Lo que hace
es recibir conexiones de servicios que están públicos o que quieren ser públicos, que
informan, se anuncian para saber dónde están sus conexiones, dónde está su IP, dónde
está su puerto, cuáles son sus valores de configuración. Al mismo tiempo, otros servicios
que quieren conectarse a ellos, lo que hacen es consultar a Consul y utilizarlo como una
especie de guía, de páginas amarillas para saber qué servicios están disponibles, cuándo
aparecen, cuándo desparecen y cómo se pueden conectar a ellos. Y por último, tenemos
Vault como gran almacén de "secretos". Permite almacenar de manera cifrada y
conectado a muchos sistemas diferentes de nube, de gestión de claves nuestras
contraseñas, nuestras claves, nuestros certificados, etc. para tenerlos gestionados de
manera segura. Todo este "software" dispone tanto como de versiones "open source"
como de versiones de servicio en la nube.
Comunicación y ChatOps
Las herramientas de comunicación nos van a permitir que los trabajadores se comuniquen
eficientemente y que, gracias a ChatOps, puedan también tener "feedback" desde los
procesos o incluso lanzar operaciones desde el chat. Si queréis realizar algún tipo de "bot"
para ChatOps o para mantenimientos, quizá un buen punto para arrancar sería Hubot.
Hubot es un "bot" que se originó en GitHub, lo programaron ellos y lo utilizaron para sus
servicios internos. Es "open source". Se puede extender con muchos "plugins", y de hecho
lleva unos cuantos, integrados para gestión de imágenes, para integrarse con Google
Maps y con otros procesos, y se puede conectar con muchos servicios externos: con
HipChat, Slack, Gitter, XMPP, etc. Atlassian Stride viene a ser lo que es el antiguo HipChat,
que está desapareciendo o ya casi ha desaparecido del todo y este es su sustituto, que
tiene unas cuantas funcionalidades que nos pueden venir muy bien. Por un lado, tiene API,
por lo tanto, podemos realizar nuestras integraciones. Y tiene un MarketPlace en el que
podemos localizar integraciones, aplicaciones, etc. que se conectan a nuestro Stride. Por
supuesto, dispone de "bots" –tiene compatibilidad con ellos–, de integraciones –por
supuesto, teniendo API– y lo podemos usar en la nube como servicio, no lo podemos
instalar. Slack vendría a ser el más conocido de todos, seguramente. Tiene una famosa API
Web con la que nos podemos integrar externamente. Tiene "apps" para su uso en
móviles. Tiene la facilidad de tener "bots", ya bien porque se los programes tú o porque
utilices uno de los que ya existen, y de hacer integraciones con mucho "software" externo.
Y solamente se puede utilizar en la nube como servicio, no puedes instalártelo tampoco
en tu máquina. Finalmente tenemos Mattermost, que sería, digamos, la versión "open
source" de todos estos anteriores. Tiene una API Web, dispone de "apps" para móvil. Los
"webhooks" a Mattermost para lanzar integraciones son compatibles con los de Slack, por
lo tanto, una migración puede resultar bastante sencilla. Dispone de "bots", puedes
realizar tus propias integraciones o utilizar algunas de las que ya existen. Lo puedes
instalar On Premises o, por supuesto, en una nube, en una máquina virtual tuya. Y si
instalas Gitlab –está disponible en el interior–, solo necesitas activarlo para poder
utilizarlo. Mattermost es "open source", pero también dispones de dos versiones
"enterprise" que puedes usar con un poquito más de funcionalidad.