{"id":79153,"date":"2020-04-24T19:42:43","date_gmt":"2020-04-24T17:42:43","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom"},"modified":"2020-04-24T19:42:43","modified_gmt":"2020-04-24T17:42:43","slug":"istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom","title":{"rendered":"Historia de la creaci\u00f3n del servicio en la nube, sazonada con ciberpunk","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Historia de la creaci\u00f3n del servicio en la nube, sazonada con ciberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/d1cad1dfa3513b5794c7be916a9dbb4b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A medida que creces en tu carrera en TI, comienzas a notar que los sistemas tienen su propio car\u00e1cter. Pueden ser complacientes, silenciosos, temperamentales o severos. Pueden atraerte o repelerte. De una forma u otra, tienes que \"negociar\" con ellos, maniobrar entre los \"escollos\" y construir las cadenas de su interacci\u00f3n.<\/p>\n<p><\/p>\n<p>As\u00ed que nos ha tocado la tarea de construir una plataforma en la nube, y para ello necesit\u00e1bamos \"convencer\" a un par de subsistemas para que trabajaran con nosotros. Afortunadamente, tenemos un \"lenguaje API\", manos h\u00e1biles y un mont\u00f3n de entusiasmo. <\/p>\n<p><\/p>\n<p>En este art\u00edculo no habr\u00e1 hardcore t\u00e9cnico, pero s\u00ed una descripci\u00f3n de los problemas que enfrentamos al construir la nube. Decid\u00ed narrar nuestro camino como una suave fantas\u00eda t\u00e9cnica sobre c\u00f3mo buscamos un lenguaje com\u00fan con los sistemas y qu\u00e9 result\u00f3 de ello. <\/p>\n<p><\/p>\n<p>Bienvenido debajo del corte.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><\/p>\n<h3 id=\"nachalo-puti\">El comienzo del camino<\/h3>\n<p><\/p>\n<p>Hace alg\u00fan tiempo, nuestro equipo enfrent\u00f3 el desaf\u00edo de lanzar una plataforma en la nube para nuestros clientes. Cont\u00e1bamos con el apoyo de la direcci\u00f3n, recursos, una infraestructura de hardware y libertad en la elecci\u00f3n de tecnolog\u00edas para implementar la parte de software del servicio.<\/p>\n<p><\/p>\n<p>Tambi\u00e9n hab\u00eda una serie de requisitos:<\/p>\n<p><\/p>\n<ul>\n<li>el servicio necesita un panel de usuario conveniente;<\/li>\n<li>la plataforma debe estar integrada en el sistema de facturaci\u00f3n existente;<\/li>\n<li>la parte de software y hardware: OpenStack + Tungsten Fabric (Open Contrail), que nuestros ingenieros aprendieron a \"preparar\" bastante bien.<\/li>\n<\/ul>\n<p><\/p>\n<p>Sobre c\u00f3mo se form\u00f3 el equipo, se desarroll\u00f3 la interfaz del panel de usuario y se tomaron decisiones de dise\u00f1o, hablaremos en otra ocasi\u00f3n, si la comunidad de Habr tiene inter\u00e9s.<br \/>\nLas herramientas que decidimos usar:<\/p>\n<p><\/p>\n<ul>\n<li>Python + Flask + Swagger + SQLAlchemy: un conjunto de Python bastante est\u00e1ndar;<\/li>\n<li>Vue.js para el frontend;<\/li>\n<li>decidimos gestionar la interacci\u00f3n entre componentes y servicios usando Celery sobre AMQP.<\/li>\n<\/ul>\n<p><\/p>\n<p>Anticipando preguntas sobre por qu\u00e9 elegimos Python, aclaro. El lenguaje ha encontrado su nicho en nuestra empresa y alrededor de \u00e9l se ha formado una peque\u00f1a, pero significativa cultura. Por lo tanto, se decidi\u00f3 empezar a construir el servicio precisamente en \u00e9l. Adem\u00e1s, la velocidad de desarrollo en tales tareas, a menudo, es decisiva. <\/p>\n<p><\/p>\n<p>As\u00ed que, comencemos nuestra introducci\u00f3n.<\/p>\n<p><\/p>\n<h3 id=\"molchalivyy-bill--billing\">Silencioso Bill - facturaci\u00f3n<\/h3>\n<p><\/p>\n<p><em>Con este chico nos conoc\u00edamos desde hace tiempo. Siempre se sentaba al lado y contaba algo en silencio. A veces nos reenviaba las solicitudes de los usuarios, emit\u00eda las facturas a los clientes, gestionaba los servicios. Un chico trabajador normal. Sin embargo, hab\u00eda complicaciones. Era callado, a veces pensativo y a menudo \u2014 en su mundo.<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia de la creaci\u00f3n del servicio en la nube, sazonada con ciberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/262bb5c9d6234041d264f8e041e647fe.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La facturaci\u00f3n fue el primer sistema con el que intentamos establecer una relaci\u00f3n. Y la primera dificultad se nos present\u00f3 al procesar los servicios.<\/p>\n<p><\/p>\n<p>Por ejemplo, al crear o eliminar, la tarea se coloca en la cola interna de facturaci\u00f3n. De este modo se implementa un sistema de trabajo as\u00edncrono con los servicios. Para procesar nuestros tipos de servicios, necesit\u00e1bamos \"apilar\" nuestras tareas en esta cola. Y aqu\u00ed nos encontramos con el problema: la falta de documentaci\u00f3n. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia de la creaci\u00f3n del servicio en la nube, sazonada con ciberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/4d96251df014e315308c94f848bc6cd0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Seg\u00fan la descripci\u00f3n de la API del software, la tarea se puede resolver, pero no ten\u00edamos tiempo para realizar ingenier\u00eda inversa, as\u00ed que sacamos la l\u00f3gica al exterior y organizamos una cola de tareas sobre RabbitMQ. La operaci\u00f3n sobre el servicio es iniciada por el cliente desde su panel personal, se envuelve en una \"tarea\" de Celery en el backend y se ejecuta en el lado de facturaci\u00f3n y OpenStack. Celery permite gestionar las tareas de forma bastante c\u00f3moda, organizar repeticiones y seguir el estado. Se puede leer m\u00e1s sobre \"Celery\", por ejemplo, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/433476\/\">aqu\u00ed<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Adem\u00e1s, la facturaci\u00f3n no detuvo el proyecto cuando se acabaron los fondos. Al hablar con los desarrolladores, descubrimos que al calcular la estad\u00edstica (y necesitamos implementar exactamente esta l\u00f3gica) hay una compleja interrelaci\u00f3n de las reglas de detenci\u00f3n. Pero estos modelos no se ajustan bien a nuestra realidad. Tambi\u00e9n lo implementamos a trav\u00e9s de tareas en Celery, llevando la l\u00f3gica de gesti\u00f3n de servicios al backend. <\/p>\n<p><\/p>\n<p>Ambos problemas mencionados anteriormente llevaron a que el c\u00f3digo se inflara un poco y en el futuro tendremos que hacer refactorizaci\u00f3n para separar la l\u00f3gica del trabajo con las tareas en un servicio independiente. Tambi\u00e9n necesitamos almacenar parte de la informaci\u00f3n sobre los usuarios y sus servicios en nuestras tablas para mantener esta l\u00f3gica.<\/p>\n<p><\/p>\n<p>Otro problema es el silencio.<\/p>\n<p><\/p>\n<p>A algunas solicitudes a la API, Billy simplemente responde \"Ok\". Por ejemplo, esto sucedi\u00f3 cuando realizamos ingresos de pagos prometidos durante la prueba (de la que hablaremos m\u00e1s adelante). Las solicitudes se ejecutaron correctamente y no vimos errores. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia de la creaci\u00f3n del servicio en la nube, sazonada con ciberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/d03f2c381fd39dbf33f2a0c3eeb1294d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tuve que estudiar los registros mientras trabajaba con el sistema a trav\u00e9s de la interfaz de usuario. Result\u00f3 que la facturaci\u00f3n realiza tales consultas modificando el \u00e1mbito a un usuario espec\u00edfico, como admin, pasando este como par\u00e1metro su.<\/p>\n<p><\/p>\n<p>En general, a pesar de las brechas en la documentaci\u00f3n y algunos errores menores en la API, todo sali\u00f3 bastante bien. Los registros se pueden leer incluso bajo alta carga, si se entiende c\u00f3mo est\u00e1n estructurados y qu\u00e9 se necesita buscar. La estructura de la base de datos es enrevesada, pero bastante l\u00f3gica y en algunos aspectos incluso atractiva.<\/p>\n<p><\/p>\n<p>Por lo tanto, resumiendo, los principales problemas que enfrentamos en la etapa de interacci\u00f3n est\u00e1n relacionados con las peculiaridades de la implementaci\u00f3n de un sistema espec\u00edfico: <\/p>\n<p><\/p>\n<ul>\n<li>caracter\u00edsticas no documentadas que nos afectaron de una forma u otra;<\/li>\n<li>c\u00f3digo fuente cerrado (la facturaci\u00f3n est\u00e1 escrita en C++), como consecuencia, la imposibilidad de resolver el problema 1 de ninguna manera, excepto mediante el 'm\u00e9todo de prueba y error'.<\/li>\n<\/ul>\n<p><\/p>\n<p>Afortunadamente, el producto cuenta con una API bastante extensa y hemos integrado en nuestro panel personal los siguientes subsistemas:<\/p>\n<p><\/p>\n<ul>\n<li>m\u00f3dulo de soporte t\u00e9cnico: las solicitudes desde el panel personal se 'proporcionan' a la facturaci\u00f3n de manera transparente para los clientes del servicio;<\/li>\n<li>m\u00f3dulo financiero: permite emitir facturas a los clientes actuales, realizar deducciones y generar documentos de pago;<\/li>\n<li>m\u00f3dulo de gesti\u00f3n de servicios: para esto tuvimos que implementar nuestro propio procesador. La ampliabilidad del sistema jug\u00f3 a nuestro favor y 'ense\u00f1amos' a Billy un nuevo tipo de servicio.<br \/>\nTuve que dedicarle tiempo, pero de una forma u otra, creo que con Billy nos llevaremos bien.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"progulki-po-volframovym-polyam--tungsten-fabric\">Paseos por campos de tungsteno \u2014 Tungsten Fabric<\/h3>\n<p><\/p>\n<p><em>Campos de tungsteno, cubiertos por cientos de cables que transportan miles de bits de informaci\u00f3n. La informaci\u00f3n se agrupa en 'paquetes', se analiza y se construyen rutas complejas, como por arte de magia.<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia de la creaci\u00f3n del servicio en la nube, sazonada con ciberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/9b6dd46d9f15e0e3393a8c1222abbf2f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Este es el dominio de un segundo sistema con el que tuvimos que familiarizarnos \u2014 Tungsten Fabric (TF), anteriormente OpenContrail. Su misi\u00f3n es gestionar el hardware de red, proporcionando una abstracci\u00f3n program\u00e1tica a nosotros, los usuarios. TF \u2014 SDN, encapsula una l\u00f3gica compleja para trabajar con el hardware de red. Hay un buen art\u00edculo sobre la tecnolog\u00eda en s\u00ed, por ejemplo, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/muk\/blog\/251959\/\">aqu\u00ed<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>El sistema est\u00e1 integrado con OpenStack (del cual hablaremos m\u00e1s adelante) a trav\u00e9s del plugin de Neutron. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia de la creaci\u00f3n del servicio en la nube, sazonada con ciberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/5abe3992efaab3e016a0c51dc0070a94.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Interacci\u00f3n de los servicios de OpenStack.<\/em><\/p>\n<p><\/p>\n<p>Este sistema fue presentado por los chicos del departamento de operaciones. Utilizamos la API del sistema para gestionar el stack de red de nuestros servicios. Hasta ahora, no hemos tenido serios problemas o inconvenientes con \u00e9l (no me atrevo a hablar por los chicos de Operaciones), aunque ha habido algunos curiosos malentendidos en la interacci\u00f3n.<\/p>\n<p><\/p>\n<p>El primero se ve\u00eda as\u00ed: los comandos que requer\u00edan la salida de una gran cantidad de datos en la consola de la instancia al conectarse por SSH simplemente \u00abcolgaban\u00bb la conexi\u00f3n, mientras que por VNC todo funcionaba correctamente.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia de la creaci\u00f3n del servicio en la nube, sazonada con ciberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/02bc97d63a1299e1dda08fce0f10fb97.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Para quienes no est\u00e1n familiarizados con el problema, esto resulta bastante divertido: ls \/root funciona correctamente, mientras que, por ejemplo, top se \u00abcongela\u00bb por completo. Afortunadamente, ya hab\u00edamos enfrentado problemas similares. Se resolvi\u00f3 ajustando el MTU en la ruta desde los nodos de computaci\u00f3n hasta los enrutadores. Cabe decir que esto no representa un problema para TF.<\/p>\n<p><\/p>\n<p>El siguiente problema estaba a la vuelta de la esquina. En un \u00abhermoso\u00bb momento, la magia del enrutamiento desapareci\u00f3, as\u00ed, de la nada. TF dej\u00f3 de gestionar el enrutamiento en el hardware.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia de la creaci\u00f3n del servicio en la nube, sazonada con ciberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/db2a75ffdf2940b2ca90f73835f7a321.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Trabajamos con OpenStack desde el nivel de admin y despu\u00e9s pasamos al nivel de usuario requerido. SDN, al parecer, \u00abintercepta\u00bb el alcance del usuario con el que se realizan las acciones. El problema es que esta misma cuenta de administrador se utiliza para la comunicaci\u00f3n entre TF y OpenStack. En el paso de cambiar al usuario, la \u00abmagia\u00bb desaparec\u00eda. Se decidi\u00f3 crear una cuenta separada para trabajar con el sistema. Esto permiti\u00f3 trabajar sin romper la funcionalidad de integraci\u00f3n.<\/p>\n<p><\/p>\n<h3 id=\"silikonovye-formy-zhizni--openstack\">Formas de vida de silicona \u2014 OpenStack<\/h3>\n<p><\/p>\n<p><em>Una entidad de silicona de forma peculiar habita cerca de los campos de tungsteno. Se parece m\u00e1s a un ni\u00f1o gigante que con un solo movimiento podr\u00eda aplastarnos, pero no emite agresi\u00f3n evidente. No causa miedo, pero su tama\u00f1o inspira inquietud. Al igual que la complejidad de lo que ocurre a su alrededor.<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia de la creaci\u00f3n del servicio en la nube, sazonada con ciberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/8622d43e0cb963bc9ef2a2ce59a32499.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>OpenStack es el n\u00facleo de nuestra plataforma.<\/p>\n<p><\/p>\n<p>OpenStack cuenta con varios subsistemas, de los cuales hasta ahora hemos utilizado m\u00e1s activamente Nova, Glance y Cinder. Cada uno tiene su propia API. Nova se encarga de los recursos de computaci\u00f3n y la creaci\u00f3n de instancias, Cinder gestiona vol\u00famenes y sus instant\u00e1neas, Glance es el servicio de im\u00e1genes que maneja las plantillas del sistema operativo y la meta informaci\u00f3n relacionada.<\/p>\n<p><\/p>\n<p>Cada servicio se ejecuta en un contenedor, y el broker de mensajes es el \u00abconejo blanco\u00bb \u2014 RabbitMQ.<\/p>\n<p><\/p>\n<p>Este sistema nos ha presentado m\u00e1s problemas inesperados.<\/p>\n<p><\/p>\n<p>Y el primer problema no tard\u00f3 en aparecer cuando intentamos conectar un volumen adicional al servidor. La API de Cinder se neg\u00f3 a llevar a cabo esta tarea. M\u00e1s bien, si creemos en OpenStack, la conexi\u00f3n se establece, pero dentro del servidor virtual el dispositivo de disco est\u00e1 ausente.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia de la creaci\u00f3n del servicio en la nube, sazonada con ciberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/b4755d893f3f8ad7d7aeab3af69f35cf.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Decidimos \"tomar un desv\u00edo\" y solicitamos la misma acci\u00f3n a la API de Nova. El resultado: el dispositivo se conecta correctamente y est\u00e1 disponible dentro del servidor. Parece que el problema surge cuando el almacenamiento en bloque no responde a Cinder.<\/p>\n<p><\/p>\n<p>Otra dificultad nos esperaba al trabajar con discos. No fue posible desconectar el volumen del sistema del servidor.<\/p>\n<p><\/p>\n<p>Una vez m\u00e1s, OpenStack \"jura\" que la conexi\u00f3n ha sido eliminada y ahora se puede trabajar correctamente con el volumen por separado. Pero la API se negaba categ\u00f3ricamente a realizar operaciones en el disco. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia de la creaci\u00f3n del servicio en la nube, sazonada con ciberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/952fd7cd11181605c52a7df71cd4f69f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aqu\u00ed decidimos no pelear demasiado y cambiar nuestra perspectiva sobre la l\u00f3gica de funcionamiento del servicio. Si hay una instancia, debe haber un volumen del sistema. Por lo tanto, el usuario no puede eliminar o desconectar el \"disco\" del sistema sin eliminar primero el \"servidor\".<\/p>\n<p><\/p>\n<p>OpenStack es un complejo sistema bastante complicado con su propia l\u00f3gica de interacci\u00f3n y una API intrincada. Nos ayuda la documentaci\u00f3n bastante detallada y, por supuesto, el m\u00e9todo de prueba y error (\u00bfc\u00f3mo podr\u00eda ser de otro modo?).<\/p>\n<p><\/p>\n<h3 id=\"testovyy-zapusk\">Ejercicio de prueba<\/h3>\n<p><\/p>\n<p>Realizamos el ejercicio de prueba en diciembre del a\u00f1o pasado. El objetivo principal era verificar en modo real nuestro proyecto desde el punto de vista t\u00e9cnico y de experiencia de usuario (UX). La audiencia fue invitada de manera selectiva y la prueba fue cerrada. Sin embargo, tambi\u00e9n dejamos la posibilidad de solicitar acceso a la prueba en nuestro sitio web.<\/p>\n<p><\/p>\n<p>La prueba, por supuesto, no estuvo exenta de momentos curiosos, ya que nuestras aventuras apenas comienzan. <\/p>\n<p><\/p>\n<p>En primer lugar, subestimamos el inter\u00e9s en el proyecto y tuvimos que agregar nodos de computaci\u00f3n r\u00e1pidamente durante la prueba. Un caso habitual para un cl\u00faster, aunque tambi\u00e9n hubo matices. En la documentaci\u00f3n para la versi\u00f3n espec\u00edfica de TF se indica una versi\u00f3n espec\u00edfica del n\u00facleo, en la que se prob\u00f3 el trabajo con vRouter. Decidimos lanzar nodos con n\u00facleos m\u00e1s recientes. Como resultado, TF no recibi\u00f3 rutas de los nodos. Tuvimos que revertir los n\u00facleos de emergencia.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia de la creaci\u00f3n del servicio en la nube, sazonada con ciberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/377208246d5e396317fb934a35ed1227.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Otro momento curioso est\u00e1 relacionado con la funcionalidad del bot\u00f3n \"cambiar contrase\u00f1a\" en el panel de usuario. <\/p>\n<p><\/p>\n<p>Decidimos utilizar JWT para organizar el acceso al panel personal, para no trabajar con sesiones. Dado que los sistemas son diversos y est\u00e1n ampliamente distribuido, gestionamos nuestro propio token, en el que \"envuelvemos\" las sesiones del billing y el token de OpenStack. Al cambiar la contrase\u00f1a, el token, por supuesto, \"caduca\", ya que los datos del usuario ya no son v\u00e1lidos y necesita ser reemitido. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia de la creaci\u00f3n del servicio en la nube, sazonada con ciberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/daa27256d0b888b2c59d4bc6129f600d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pasamos por alto este aspecto y no tuvimos recursos para escribir este fragmento r\u00e1pidamente. Tuvimos que recortar funcionalidad justo antes del lanzamiento de la prueba.<br \/>\nActualmente estamos desconectando al usuario si se cambia la contrase\u00f1a.<\/p>\n<p><\/p>\n<p>A pesar de estos matices, las pruebas transcurrieron bien. Durante un par de semanas, alrededor de 300 personas nos visitaron. Pudimos ver el producto desde la perspectiva de los usuarios, probarlo en acci\u00f3n y recopilar comentarios de calidad. <\/p>\n<p><\/p>\n<h3 id=\"prodolzhenie-sleduet\">Continuar\u00e1<\/h3>\n<p><\/p>\n<p>Para muchos de nosotros, este es el primer proyecto de tal magnitud. Hemos aprendido varias lecciones valiosas sobre c\u00f3mo trabajar en equipo, tomar decisiones arquitect\u00f3nicas y de dise\u00f1o. C\u00f3mo integrar sistemas complejos con recursos limitados y lanzarlos a producci\u00f3n. <\/p>\n<p><\/p>\n<p>Por supuesto, hay mucho que mejorar tanto en el c\u00f3digo como en las interfaces de integraci\u00f3n de sistemas. El proyecto es bastante joven, pero estamos llenos de ambici\u00f3n para convertirlo en un servicio confiable y conveniente.<\/p>\n<p><\/p>\n<p>Ya hemos logrado convencer a los sistemas. Bill pacientemente se encarga de los c\u00e1lculos, las facturas y las solicitudes de los usuarios en su peque\u00f1o despacho. La \"magia\" de los campos de tungsteno nos proporciona una conexi\u00f3n estable. Y solo OpenStack a veces act\u00faa de manera caprichosa, gritando algo como \"'WSREP a\u00fan no ha preparado el nodo para el uso de la aplicaci\u00f3n\". Pero esa es otra historia...<\/p>\n<p><\/p>\n<p>Hace poco lanzamos el servicio.<br \/>\nPuedes encontrar todos los detalles en nuestro <noindex><a rel=\"nofollow\" href=\"https:\/\/clo.ru?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=product&amp;utm_term=first_clo\">el sitio web<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Historia de la creaci\u00f3n del servicio en la nube, sazonada con ciberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/32550980b529a5d7b395b3962218e53e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Equipo de desarrollo de CLO<\/em><\/p>\n<p><\/p>\n<p>                        <b class=\"spoiler_title\">Enlaces \u00fatiles<\/b><\/p>\n<p><strong>OpenStack<\/strong><\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.openstack.org\/nova\/latest\/\">https:\/\/docs.openstack.org\/nova\/latest\/<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.openstack.org\/keystone\/latest\/\">https:\/\/docs.openstack.org\/keystone\/latest\/<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.openstack.org\/cinder\/latest\/\">https:\/\/docs.openstack.org\/cinder\/latest\/<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.openstack.org\/glance\/latest\/\">https:\/\/docs.openstack.org\/glance\/latest\/<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Tungsten Fabric<\/strong><\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/docs.tungsten.io\/en\/latest\/user\/getting-started\/index.html\">http:\/\/docs.tungsten.io\/en\/latest\/user\/getting-started\/index.html<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.juniper.net\/documentation\/en_US\/contrail-cloud10.0\/topics\/concept\/contrail-cloud-openstack-integration-overview.html\">https:\/\/www.juniper.net\/documentation\/en_US\/contrail-cloud10.0\/topics\/concept\/contrail-cloud-openstack-integration-overview.html<\/a><\/noindex><\/li>\n<\/ul>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/first\/blog\/493606\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421 \u0440\u043e\u0441\u0442\u043e\u043c \u0441\u0442\u0430\u0436\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 IT \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0448\u044c \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u044c, \u0447\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438\u043c\u0435\u044e\u0442 \u0441\u0432\u043e\u0439 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440. \u041e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043a\u043b\u0430\u0434\u0438\u0441\u0442\u044b\u043c\u0438, \u043c\u043e\u043b\u0447\u0430\u043b\u0438\u0432\u044b\u043c\u0438, \u0432\u0437\u0431\u0430\u043b\u043c\u043e\u0448\u043d\u044b\u043c\u0438, \u0441\u0443\u0440\u043e\u0432\u044b\u043c\u0438. \u041c\u043e\u0433\u0443\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c \u043a \u0441\u0435\u0431\u0435 \u0438\u043b\u0438 \u043e\u0442\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c. \u0422\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u00ab\u0434\u043e\u0433\u043e\u0432\u0430\u0440\u0438\u0432\u0430\u0442\u044c\u0441\u044f\u00bb \u0441 \u043d\u0438\u043c\u0438, \u043b\u0430\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u00ab\u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u043c\u0438 \u043a\u0430\u043c\u043d\u044f\u043c\u0438\u00bb \u0438 \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0438\u0445 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u0412\u043e\u0442 \u0438 \u043d\u0430\u043c \u0432\u044b\u043f\u0430\u043b\u0430 \u0447\u0435\u0441\u0442\u044c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043e\u0431\u043b\u0430\u0447\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443, \u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u00ab\u0443\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u00bb [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":79154,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-79153","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0421 \u0440\u043e\u0441\u0442\u043e\u043c \u0441\u0442\u0430\u0436\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043f\u0440\u0438\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u043a\u0438\u0431\u0435\u0440\u043f\u0430\u043d\u043a\u043e\u043c | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0421 \u0440\u043e\u0441\u0442\u043e\u043c \u0441\u0442\u0430\u0436\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-04-24T17:42:43+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-04-24T17:42:43+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Historia de la creaci\u00f3n del servicio en la nube, sazonada con ciberpunk | ProHoster","description":"Con el aumento de la experiencia.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043f\u0440\u0438\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u043a\u0438\u0431\u0435\u0440\u043f\u0430\u043d\u043a\u043e\u043c | ProHoster","og:description":"\u0421 \u0440\u043e\u0441\u0442\u043e\u043c \u0441\u0442\u0430\u0436\u0430.","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-04-24T17:42:43+00:00","article:modified_time":"2020-04-24T17:42:43+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"79153","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:43:24","updated":"2022-10-02 03:25:48","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/79153","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=79153"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/79153\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/79154"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=79153"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=79153"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=79153"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}