No es falso decir que las mejores personas
ganar alegr铆a a trav茅s del sufrimiento.
Ludwig van Beethoven

Soy Sergey, trabajo en Yandex. Dinero en un equipo de investigaci贸n de rendimiento. Quiero contarles el comienzo de una historia sobre nuestro camino hacia el uso de la orquestaci贸n: c贸mo elegimos los instrumentos y lo que tomamos en cuenta. Todos los eventos del art铆culo tienen lugar en tiempo real, por lo que ustedes, queridos lectores, siguen el desarrollo de la situaci贸n casi en vivo.
驴Por qu茅 necesitamos un conductor en el equipo?
驴Qui茅n es un conductor? De fr. diriger - administrar, dirigir, liderar - en el mundo de la m煤sica - esta es una persona, el l铆der del aprendizaje y la interpretaci贸n de la m煤sica de conjunto. En nuestro caso, este lugar est谩 ocupado por sistemas de orquestaci贸n y automatizaci贸n.
Su papel no es diferente del papel del director de orquesta en la m煤sica: son necesarios para ayudar al equipo, dirigir y organizar su obra.
Como regla general, un equipo tiene un cierto conjunto de capacidades, llam茅mosles servidores en los que implementan sus proyectos.
El enfoque para obtener y operar estos servidores es diverso. Algunos ejemplos
- El equipo realiza una solicitud, por ejemplo, al grupo de operaciones, para proporcionarles recursos con ciertos par谩metros.
- El grupo de operaci贸n les proporciona la cantidad requerida (nube o metal desnudo ("metal desnudo") y se compromete a mantenerlos en buenas condiciones de acuerdo con el SLA. El ajuste tambi茅n lo realiza el equipo de operaciones.
- El equipo recibe solo recursos en la nube o bare metal del grupo de operaci贸n; realiza su propia configuraci贸n.
- El equipo mismo "compra" recursos y los apoya / configura de forma completamente independiente.
Nuestro equipo utiliza servidores que necesitan soporte: actualice el sistema operativo, instale nuevos paquetes, etc.
Para nosotros, los distinguimos en dos tipos principales:
- grupo de tanques
- grupo de servicio
El grupo de tanques consta de hosts con Yandex.Tank.
El grupo de servicios incluye todo lo relacionado con el mantenimiento: estos son varios servicios para proporcionar soporte para el ciclo de lanzamiento, generar informes autom谩ticos, etc.
En un momento, todo se volvi贸 inconveniente para administrar todo esto manualmente, y pensamos en automatizar todo el proceso, comenzando por "cargar" los servidores y terminando con el desarrollo, dise帽o y lanzamiento de nuestro servicio interno.
驴Por qu茅 se necesita un director, incluso si la orquesta misma puede tocar?
Para empezar, dominamos Ansible y comenzamos a "verter" nuestros servidores b谩sicos para que sean menos dependientes de los administradores del sistema: todos ganan aqu铆, adquirimos nuevas habilidades y liberamos a los administradores de la parte del trabajo que siempre tienen sin nosotros. Nos esforzamos por desarrollar nuestro equipo fuera de nuestra especialidad y autonom铆a tanto como sea posible.
La compa帽铆a ha estado trabajando con Ansible durante mucho tiempo ya establecida y regulada, por lo que integramos f谩cilmente nuestra soluci贸n en este proceso.
El alojamiento ahora consta de tres roles de Ansible:
- el primer rol instala el sistema operativo,
- el segundo despliega la configuraci贸n b谩sica para el host, la autorizaci贸n LDAP, por ejemplo,
- y el tercero instala Yandex.Tank y las dependencias relacionadas en el contenedor docker.
Pasemos a los servicios que usamos dentro del equipo.
Para nuestras tareas, utilizamos igualmente Kotlin y Python, y un poco m谩s de Golang. Para unificar el desarrollo y la implementaci贸n de nuestros servicios, decidimos empacarlos en contenedores acoplables. Esto le da libertad para elegir un lenguaje de programaci贸n y al mismo tiempo regula el formato de entrega uniforme de su aplicaci贸n.
Algunos de los servicios con los que interactuamos est谩n disponibles solo a trav茅s de ipv6, por lo que tuve que descubrir c贸mo hacer ipv6 para contenedores.
De acuerdo con la documentaci贸n para ipv6 en el sitio web oficial de Docker, ipv6 se habilita agregando par谩metros a daemon.json:
{ "ipv6": true, "fixed-cidr-v6": "2001:db8:1::/64" }
En este caso, el proveedor debe emitir la subred ipv6, que fixed-cidr-v6.
en fixed-cidr-v6.
Sin embargo, elegimos otra opci贸n: ipv6 NAT, y he aqu铆 por qu茅:
- Ahora docker no se puede usar solo con ipv6.
- La presencia de una direcci贸n globalmente enrutable en cada contenedor significa que todos los puertos (incluso los no publicados) estar谩n disponibles para todos si no se realiza un filtrado adicional.
- proxy de userland para puertos de publicaci贸n, iptables solo para ipv4 .
ipv6 NAT es un contenedor acoplable que administra las reglas en ip6tables y las edita cuando se agrega un nuevo contenedor.
Para que esta soluci贸n funcione correctamente, se tuvieron que realizar varias manipulaciones. Aseg煤rese de inicializar ip6table_nat en el sistema. La presencia de un m贸dulo instalado en el sistema no garantiza que, al inicio, el m贸dulo se cargar谩 en el n煤cleo. Nos encontramos con esto cuando recibimos este error al iniciar un contenedor con NAT en un host nuevo:
2019/01/22 14:59:54 running [/sbin/ip6tables -t filter -N DOCKER --wait]: exit status 3: modprobe: can't change directory to '/lib/modules': No such file or directory ip6tables v1.6.2: can't initialize ip6tables table `filter': Table does not exist (do you need to insmod?)
El problema se resolvi贸 despu茅s de agregar la inicializaci贸n a la funci贸n Ansible usando el m贸dulo modprobe y cargarlo al inicio usando lineinfile:
- name: Add ip6table_nat module modprobe: name: ip6table_nat state: present - name: Add ip6table_nat to boot lineinfile: path: /etc/modules line: 'ip6table_nat'
Por cierto, hay un buen art铆culo sobre Haber, que describe breve y claramente las ventajas y desventajas de un m茅todo particular para trabajar con ipv6 en Docker.
Pero volviendo a nuestra pregunta formulada al principio:
驴Por qu茅 se necesita un director, incluso si la orquesta misma puede tocar?
Ahora todos saben c贸mo jugar en nuestro equipo:
- se crea el proceso de "llenar" los servidores,
- El desarrollo y despliegue de servicios est谩n unificados.
Surge una pregunta razonable: 驴c贸mo implementar, actualizar y controlar nuestros servicios en contenedores acoplables de manera eficiente y lo m谩s automatizada posible?
A pesar de que cada miembro de la orquesta conoce su propia parte, puede extraviarse, alejarse de la idea original. Aqu铆 llegamos al hecho de que sin un director de orquesta, nuestra orquesta no ensayar谩 y tocar谩 armoniosamente. El conductor es responsable de todos los par谩metros de rendimiento, para garantizar que todo est茅 unido por un solo ritmo y estado de 谩nimo.
驴C贸mo conseguir un buen conductor con una inversi贸n m铆nima?
El tema de la orquestaci贸n est谩 bien desarrollado en el mercado. Pero primero, hablemos sobre las herramientas de apoyo que pueden ayudar al conductor.
Consul es un sistema que proporciona dos funciones principales:
- descubrimiento de servicio
- almacenamiento distribuido de valor-clave.
En nuestra orquesta, el C贸nsul ser谩 responsable de registrar los servicios y almacenar sus configuraciones. Hay dos opciones de registro:
- Activo: esto es cuando el servicio en s铆 se registra utilizando la API HTTP;
- Pasivo: el servicio debe registrarse manualmente.
Vault es un repositorio que estandariza y unifica el almacenamiento seguro y trabaja con secretos: contrase帽as, certificados.
Estos son los beneficios que obtendremos con esta herramienta:
- Un 煤nico centro para crear y guardar secretos, gestionando su ciclo de vida a trav茅s de la API HTTP.
- Transit Secrets Engine: cifrado-descifrado de datos sin guardarlos. La capacidad de transmitir datos en forma cifrada a trav茅s de canales de comunicaci贸n no seguros.
- Pol铆ticas de acceso convenientes para configurar.
- Auditar el acceso a los secretos.
- Capacidad para crear su propia CA (Autoridad de certificaci贸n) para administrar certificados autofirmados dentro de su infraestructura.
Teniendo en cuenta todos nuestros requisitos, dos opciones se adaptaron al papel de director: Kubernetes y Nomad.
Kubernetes
Cu谩ntos art铆culos y libros ya se han escrito sobre 茅l (este, por ejemplo), se han informado informes que escribir茅 en resumen: esta es una combinaci贸n universal que puede hacer casi cualquier cosa. Pagar por ello no siempre es f谩cil de configurar y soportar un cl煤ster en Kubernetes.
N贸mada
La herramienta es de HashiCorp, una compa帽铆a conocida por el c贸nsul y la b贸veda mencionados anteriormente.
Nomad nos pareci贸 bastante simple de instalar y configurar que Kubernetes. Un archivo binario funciona tanto en modo servidor como en modo cliente. Al mismo tiempo, Nomad cubre la lista completa de tareas que queremos que resuelva: administraci贸n de cl煤steres, planificador r谩pido, soporte para centros m煤ltiples. Adem谩s, cuando usamos c贸nsul y b贸veda, obtenemos una integraci贸n m谩s estrecha para orquestar nuestros servicios.
Lo que ahora est谩 en el trabajo:
- prepar贸 los servidores para el despliegue de c贸nsul,
- la configuraci贸n del cl煤ster n贸mada se ingresar谩 en C贸nsul, con lo cual el n贸mada se implementar谩 autom谩ticamente,
- Paralelamente, instalaremos una b贸veda para guardar secretos.
La pregunta en la sala es si vale la pena tener un director para tales tareas o si una orquesta es buena sin ella. Cu茅ntanos en los comentarios lo que piensas sobre esto.
Suscr铆base a nuestro blog y mant茅ngase en contacto: pronto le diremos qu茅 sucedi贸 al final y si configuramos el cl煤ster n贸mada, como quer铆amos.
Visite nuestra acogedora sala de chat de telegramas donde siempre puede pedir consejos, ayudar a colegas y simplemente hablar sobre investigaci贸n de desempe帽o y m谩s.