{"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\/it\/blog\/administrirovanie\/istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom","title":{"rendered":"La storia della creazione di un servizio cloud, arricchita da elementi cyberpunk","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"La storia della creazione di un servizio cloud, arricchita da elementi cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/d1cad1dfa3513b5794c7be916a9dbb4b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Con l'aumentare dell'esperienza nel settore IT, inizi a notare che i sistemi hanno un loro carattere. Possono essere docili, silenziosi, capricciosi, severi. Possono attrarre o respingere. In un modo o nell'altro, bisogna 'contrattare' con loro, districarsi tra 'pietre miliari' e costruire catene di interazione.<\/p>\n<p><\/p>\n<p>Ebbene, anche a noi \u00e8 toccato l'onore di costruire una piattaforma cloud, e per questo \u00e8 stato necessario 'convincere' un paio di sottosistemi a lavorare con noi. Fortunatamente, abbiamo 'il linguaggio API', mani esperte e un sacco di entusiasmo. <\/p>\n<p><\/p>\n<p>In questo articolo non ci saranno dettagli tecnici hardcore, ma descriver\u00f2 i problemi con cui ci siamo trovati ad affrontare durante la costruzione del cloud. Ho deciso di raccontare il nostro percorso sotto forma di una leggenda tecnica leggera su come abbiamo cercato un linguaggio comune con i sistemi e cosa ne \u00e8 venuto fuori. <\/p>\n<p><\/p>\n<p>Benvenuti sotto il tag.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><\/p>\n<h3 id=\"nachalo-puti\">Inizio del percorso<\/h3>\n<p><\/p>\n<p>Qualche tempo fa, al nostro team \u00e8 stato assegnato il compito di avviare una piattaforma cloud per i nostri clienti. Avevamo a disposizione il supporto della direzione, risorse, una infrastruttura hardware e libert\u00e0 nella scelta delle tecnologie per realizzare la parte software del servizio.<\/p>\n<p><\/p>\n<p>C'erano anche alcuni requisiti:<\/p>\n<p><\/p>\n<ul>\n<li>il servizio ha bisogno di un'interfaccia utente comoda;<\/li>\n<li>la piattaforma deve essere integrata con il sistema di billing esistente;<\/li>\n<li>parte software e hardware: OpenStack + Tungsten Fabric (Open Contrail), che i nostri ingegneri hanno imparato a 'preparare' abbastanza bene.<\/li>\n<\/ul>\n<p><\/p>\n<p>Racconteremo di come \u00e8 stata formata la squadra, \u00e8 stato sviluppato l'interfaccia dell'area personale e sono state prese decisioni di design in un'altra occasione, se ci sar\u00e0 interesse da parte della comunit\u00e0 di Habra.<br \/>\nStrumenti che abbiamo deciso di utilizzare:<\/p>\n<p><\/p>\n<ul>\n<li>Python + Flask + Swagger + SQLAlchemy - un set Python piuttosto standard;<\/li>\n<li>Vue.js per il frontend;<\/li>\n<li>l'interazione tra componenti e servizi \u00e8 stata realizzata tramite Celery sopra AMQP.<\/li>\n<\/ul>\n<p><\/p>\n<p>Anticipando le domande sulla scelta di Python, spiego. Il linguaggio ha trovato la sua nicchia nella nostra azienda e intorno ad esso si \u00e8 sviluppata una piccola, ma pur sempre presente, cultura. Pertanto, \u00e8 stato deciso di iniziare a costruire il servizio proprio su di esso. Del resto, in queste situazioni, la velocit\u00e0 di sviluppo spesso fa la differenza. <\/p>\n<p><\/p>\n<p>Dunque, iniziamo la nostra conoscenza.<\/p>\n<p><\/p>\n<h3 id=\"molchalivyy-bill--billing\">Bill il silenzioso - billing<\/h3>\n<p><\/p>\n<p><em>Con questo ragazzo ci conoscevamo da tempo. Si sedeva sempre vicino e contava qualcosa in silenzio. A volte ci inoltrava le richieste degli utenti, gestiva le fatture dei clienti e amministrava i servizi. Un ragazzo normale e lavoratore. Tuttavia, ci sono state delle difficolt\u00e0. Era silenzioso, a volte pensieroso e spesso \u2014 pensava per conto suo.<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"La storia della creazione di un servizio cloud, arricchita da elementi cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/262bb5c9d6234041d264f8e041e647fe.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il billing \u00e8 stato il primo sistema con cui abbiamo cercato di fare amicizia. E il primo problema che abbiamo incontrato \u00e8 stato durante l'elaborazione dei servizi.<\/p>\n<p><\/p>\n<p>Ad esempio, quando creiamo o eliminiamo, il compito finisce in una coda interna di billing. Cos\u00ec \u00e8 stata implementata una sistema di lavoro asincrono con i servizi. Per elaborare i nostri tipi di servizio, dovevamo \"mettere\" le nostre attivit\u00e0 in questa coda. E qui ci siamo imbattuti in un problema: la mancanza di documentazione. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"La storia della creazione di un servizio cloud, arricchita da elementi cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/4d96251df014e315308c94f848bc6cd0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A giudicare dalla descrizione dell'API software, alla fine, \u00e8 possibile risolvere questo problema, ma non avevamo tempo per dedicarci al reverse engineering, quindi abbiamo estratto la logica all'esterno e organizzato una coda di compiti sopra RabbitMQ. L'operazione sul servizio \u00e8 avviata dal cliente dal pannello di controllo, avvolta in un \"compito\" Celery sul backend e eseguita dal billing e da OpenStack. Celery consente di gestire molto comodamente i compiti, organizzare i ripetizioni e monitorare lo stato. Ulteriori informazioni su \"celery\" possono essere lette, ad esempio, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/433476\/\">qui<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Inoltre, il billing non ha fermato il progetto in cui i soldi erano finiti. Parlando con gli sviluppatori, abbiamo scoperto che nel conteggio della statistica (e noi abbiamo bisogno di implementare esattamente questa logica) c'\u00e8 una complessa interrelazione delle regole di arresto. Ma questi modelli non si adattano bene alle nostre realt\u00e0. Abbiamo anche implementato attraverso compiti su Celery, portando sul lato del backend la logica di gestione dei servizi. <\/p>\n<p><\/p>\n<p>Entrambi i problemi sopra menzionati hanno portato a un po' di espansione del codice e in futuro dovremo dedicarci al refactoring, per estrarre in un servizio separato la logica di lavoro con i compiti. Dobbiamo anche conservare parte delle informazioni sugli utenti e sui loro servizi nei nostri database, per mantenere questa logica.<\/p>\n<p><\/p>\n<p>Un altro problema \u00e8 il silenzio.<\/p>\n<p><\/p>\n<p>In risposta a parte delle richieste all'API, Billy risponde silenziosamente \"Ok\". Ad esempio, \u00e8 successo quando abbiamo effettuato accrediti di pagamenti promessi durante il test (di cui parler\u00f2 pi\u00f9 avanti). Le richieste sono state eseguite correttamente e non abbiamo visto errori. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"La storia della creazione di un servizio cloud, arricchita da elementi cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/d03f2c381fd39dbf33f2a0c3eeb1294d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ho dovuto esaminare i log mentre lavoravo con il sistema tramite l'interfaccia utente. Si \u00e8 scoperto che la stessa fatturazione esegue tali richieste, cambiando il scope su un utente specifico, ad esempio, admin, passando il parametro su di esso.<\/p>\n<p><\/p>\n<p>In generale, nonostante le lacune nella documentazione e alcuni piccoli difetti nell'API, tutto \u00e8 andato piuttosto bene. I log sono leggibili anche sotto carichi elevati, se si capisce come sono strutturati e cosa cercare. La struttura del database \u00e8 complessa, ma abbastanza logica e persino attraente in alcune cose.<\/p>\n<p><\/p>\n<p>Quindi, per riassumere, i principali problemi che abbiamo incontrato durante l'interazione sono legati alle peculiarit\u00e0 dell'implementazione di un sistema specifico: <\/p>\n<p><\/p>\n<ul>\n<li>funzioni non documentate che ci hanno colpito in un modo o nell'altro;<\/li>\n<li>codici sorgente chiusi (la fatturazione \u00e8 scritta in C++), di conseguenza, impossibilit\u00e0 di risolvere il problema 1 in alcun modo, tranne che con il \"metodo dell'approccio e degli errori\".<\/li>\n<\/ul>\n<p><\/p>\n<p>Per fortuna, il prodotto ha un API piuttosto ampia e abbiamo integrato nel nostro pannello personale i seguenti sottomoduli:<\/p>\n<p><\/p>\n<ul>\n<li>modulo di supporto tecnico \u2014 le richieste dal pannello personale vengono \"proxificate\" nella fatturazione in modo trasparente per i clienti del servizio;<\/li>\n<li>modulo finanziario \u2014 consente di emettere fatture ai clienti attuali, effettuare addebiti e generare documenti di pagamento;<\/li>\n<li>modulo di gestione dei servizi \u2014 per questo abbiamo dovuto implementare il nostro gestore. L'espandibilit\u00e0 del sistema ci ha aiutato e abbiamo \"formato\" Billy a un nuovo tipo di servizi.<br \/>\nCi \u00e8 voluto un po' di impegno, ma penso che con Billy ci troveremo bene.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"progulki-po-volframovym-polyam--tungsten-fabric\">Passeggiate nei campi di tungsteno \u2014 Tungsten Fabric<\/h3>\n<p><\/p>\n<p><em>Campi di tungsteno, disseminati di centinaia di cavi, che fanno passare attraverso di loro migliaia di bit di informazioni. Le informazioni vengono raccolte in \"pacchetti\", analizzate, costruendo percorsi complessi, come per magia.<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"La storia della creazione di un servizio cloud, arricchita da elementi cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/9b6dd46d9f15e0e3393a8c1222abbf2f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questo \u00e8 il dominio del secondo sistema, con cui abbiamo dovuto interagire \u2014 Tungsten Fabric (TF), precedentemente OpenContrail. Il suo compito \u00e8 gestire l'hardware di rete, fornendo un'astrazione software a noi, come utenti. TF \u2014 SDN, incapsula in s\u00e9 una logica complessa di interazione con l'hardware di rete. Ci sono articoli decenti sulla tecnologia stessa, ad esempio, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/muk\/blog\/251959\/\">qui<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Il sistema \u00e8 integrato con OpenStack (di cui parleremo pi\u00f9 avanti) tramite il plugin di Neutron. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"La storia della creazione di un servizio cloud, arricchita da elementi cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/5abe3992efaab3e016a0c51dc0070a94.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Interazione dei servizi OpenStack.<\/em><\/p>\n<p><\/p>\n<p>Questo sistema ci \u00e8 stato presentato dai ragazzi del dipartimento operativo. Utilizziamo l'API del sistema per gestire lo stack di rete dei nostri servizi. Finora non ci ha causato seri problemi o inconvenienti (non mi prender\u00f2 la responsabilit\u00e0 di parlare per i ragazzi dell'OE), ma ci sono stati alcuni eventi curiosi durante l'interazione.<\/p>\n<p><\/p>\n<p>Il primo si \u00e8 presentato cos\u00ec: i comandi che richiedevano di stampare un grande volume di dati sulla console dell'istanza durante la connessione SSH semplicemente 'congelavano' la connessione, mentre su VNC tutto funzionava correttamente.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"La storia della creazione di un servizio cloud, arricchita da elementi cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/02bc97d63a1299e1dda08fce0f10fb97.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Per coloro che non sono familiari con il problema, sembra piuttosto divertente: ls \/root funziona correttamente, mentre, ad esempio, top 'si blocca' completamente. Per fortuna, abbiamo gi\u00e0 affrontato problemi simili. Si \u00e8 risolto ottimizzando il MTU sul percorso dai nodi di calcolo ai router. A proposito, questo non \u00e8 un problema di TF.<\/p>\n<p><\/p>\n<p>Il problema successivo ci aspettava dietro l'angolo. In un 'bellissimo' momento, la magia della routing \u00e8 scomparsa, cos\u00ec, all'improvviso. TF ha smesso di gestire il routing sulle apparecchiature.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"La storia della creazione di un servizio cloud, arricchita da elementi cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/db2a75ffdf2940b2ca90f73835f7a321.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Abbiamo lavorato con OpenStack a livello di admin e successivamente siamo passati al livello dell'utente necessario. Sembra che SDN 'catturi' lo scope dell'utente con cui vengono eseguite le azioni. Il fatto \u00e8 che questo stesso account da admin \u00e8 utilizzato per la comunicazione tra TF e OpenStack. Durante il passaggio al conto dell'utente, la 'magia' svaniva. \u00c8 stato deciso di creare un account separato per lavorare con il sistema. Questo ha permesso di lavorare senza compromettere la funzionalit\u00e0 dell'integrazione.<\/p>\n<p><\/p>\n<h3 id=\"silikonovye-formy-zhizni--openstack\">Forme di vita siliconiche \u2014 OpenStack<\/h3>\n<p><\/p>\n<p><em>Una creatura siliconica di forma bizzarra vive vicino ai campi di tungsteno. Assomiglia a un bambino cresciuto, che con un solo colpo potrebbe schiacciarci, ma non mostra aggressivit\u00e0 evidente. Non incute paura, ma le sue dimensioni destano preoccupazione. Cos\u00ec come la complessit\u00e0 di ci\u00f2 che accade intorno.<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"La storia della creazione di un servizio cloud, arricchita da elementi cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/8622d43e0cb963bc9ef2a2ce59a32499.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>OpenStack \u00e8 il nucleo della nostra piattaforma.<\/p>\n<p><\/p>\n<p>OpenStack ha diversi sottosistemi, dei quali al momento utilizziamo principalmente Nova, Glance e Cinder. Ognuno di essi ha la propria API. Nova si occupa delle risorse di calcolo e della creazione di istanze, Cinder gestisce i volumi e le loro istantanee, Glance \u00e8 il servizio di immagini che gestisce i modelli del sistema operativo e le relative informazioni meta.<\/p>\n<p><\/p>\n<p>Ogni servizio viene eseguito in un contenitore, con RabbitMQ come broker dei messaggi.<\/p>\n<p><\/p>\n<p>Questo sistema ci ha causato pi\u00f9 grattacapi inaspettati.<\/p>\n<p><\/p>\n<p>E il primo problema non ha tardato ad arrivare, quando abbiamo cercato di collegare un volume aggiuntivo al server. L'API di Cinder si \u00e8 categoricamente rifiutata di eseguire questa operazione. Piuttosto, se si crede a OpenStack stesso, la connessione viene stabilita, tuttavia all'interno del server virtuale il dispositivo disco \u00e8 assente.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"La storia della creazione di un servizio cloud, arricchita da elementi cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/b4755d893f3f8ad7d7aeab3af69f35cf.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Abbiamo deciso di \"andare per le lunghe\" e abbiamo richiesto la stessa azione all'API di Nova. Risultato: il dispositivo viene connesso correttamente ed \u00e8 accessibile all'interno del server. Sembra che il problema sorga quando lo storage block non risponde a Cinder.<\/p>\n<p><\/p>\n<p>Un'altra difficolt\u00e0 ci aspettava nel lavoro con i dischi. Non siamo riusciti a scollegare il volume di sistema dal server.<\/p>\n<p><\/p>\n<p>Ancora una volta, OpenStack \"giura\" di aver distrutto la connessione e ora \u00e8 possibile lavorare correttamente con il volume separatamente. Ma l'API categoricamente non desiderava eseguire operazioni sul disco. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"La storia della creazione di un servizio cloud, arricchita da elementi cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/952fd7cd11181605c52a7df71cd4f69f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qui abbiamo deciso di non combattere particolarmente, ma di cambiare il nostro modo di vedere la logica di funzionamento del servizio. Se c'\u00e8 un'istanza, deve esserci anche un volume di sistema. Pertanto, l'utente al momento non pu\u00f2 eliminare o disattivare il \"disco\" di sistema senza prima eliminare il \"server\".<\/p>\n<p><\/p>\n<p>OpenStack \u00e8 un complesso sistema piuttosto difficile con la propria logica di interazione e un'API tortuosa. Ci aiuta una documentazione abbastanza dettagliata e, naturalmente, il metodo di prova ed errore (dove andremmo senza di esso?).<\/p>\n<p><\/p>\n<h3 id=\"testovyy-zapusk\">Esecuzione del test<\/h3>\n<p><\/p>\n<p>Abbiamo condotto l'esecuzione del test a dicembre dello scorso anno. L'obiettivo principale era verificare, dal punto di vista tecnico e dell'UX, il nostro progetto in modalit\u00e0 operativa. Abbiamo invitato un pubblico selezionato e il test \u00e8 stato chiuso. Tuttavia, abbiamo anche lasciato la possibilit\u00e0 di richiedere l'accesso al test sul nostro sito.<\/p>\n<p><\/p>\n<p>Il test stesso, naturalmente, non \u00e8 passato senza momenti curiosi, poich\u00e9 le nostre avventure cominciano qui. <\/p>\n<p><\/p>\n<p>Innanzitutto, abbiamo sottovalutato l'interesse per il progetto e abbiamo dovuto aggiungere nodi di calcolo rapidamente durante il test. Un caso normale per un cluster, tuttavia anche qui ci sono state delle peculiarit\u00e0. Nella documentazione per la versione specifica di TF \u00e8 indicata una versione specifica del kernel su cui \u00e8 stata testata la funzionalit\u00e0 con vRouter. Abbiamo deciso di avviare nodi con kernel pi\u00f9 recenti. Il risultato: TF non ha ricevuto rotte dai nodi. Abbiamo dovuto tornare indietro ai kernel precedenti.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"La storia della creazione di un servizio cloud, arricchita da elementi cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/377208246d5e396317fb934a35ed1227.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un altro momento curioso riguarda la funzionalit\u00e0 del pulsante \"cambia password\" nel pannello personale. <\/p>\n<p><\/p>\n<p>Abbiamo deciso di utilizzare JWT per gestire l'accesso all'area riservata, evitando di lavorare con sessioni. Poich\u00e9 i sistemi sono molto diversi e ampiamente distribuiti, gestiamo il nostro token, nel quale \"incapsuliamo\" le sessioni di billing e il token da OpenStack. Quando viene cambiata la password, il token, ovviamente, \"scade\", poich\u00e9 i dati dell'utente non sono pi\u00f9 validi e deve essere riemesso. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"La storia della creazione di un servizio cloud, arricchita da elementi cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/daa27256d0b888b2c59d4bc6129f600d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Abbiamo trascurato questo aspetto, e ci sono stati semplicemente pochi risorse per completare rapidamente questo pezzo. Abbiamo dovuto tagliare funzionalit\u00e0 giusto prima del lancio del test.<br \/>\nAttualmente eseguiamo il logout dell'utente se la password \u00e8 stata cambiata.<\/p>\n<p><\/p>\n<p>Nonostante queste sfide, il test \u00e8 andato bene. In poche settimane, circa 300 persone ci hanno visitato. Siamo riusciti a vedere il prodotto attraverso gli occhi degli utenti, a testarlo in azione e a raccogliere feedback di qualit\u00e0. <\/p>\n<p><\/p>\n<h3 id=\"prodolzhenie-sleduet\">Continua<\/h3>\n<p><\/p>\n<p>Per molti di noi, questo \u00e8 il primo progetto di tale portata. Abbiamo appreso diverse lezioni preziose su come lavorare in team, prendere decisioni architettoniche e di design. Come integrare sistemi complessi con risorse limitate e portarli in produzione. <\/p>\n<p><\/p>\n<p>Naturalmente, c'\u00e8 molto su cui lavorare sia nel codice che nei punti di integrazione tra i sistemi. Il progetto \u00e8 ancora giovane, ma siamo pieni di ambizioni di farne un servizio affidabile e comodo.<\/p>\n<p><\/p>\n<p>Le sistemi sono gi\u00e0 riusciti a prendere accordi. Bill si occupa diligentemente di conteggi, fatturazione e richieste degli utenti nel suo ufficio. La \"magia\" dei campi di tungsteno ci garantisce una connessione stabile. Solo OpenStack a volte fa i capricci, esclamando qualcosa come \"'WSREP non ha ancora preparato il nodo per l'uso dell'applicazione\". Ma questa \u00e8 un'altra storia...<\/p>\n<p><\/p>\n<p>Recentemente abbiamo lanciato il servizio.<br \/>\nPuoi scoprire tutti i dettagli sul nostro <noindex><a rel=\"nofollow\" href=\"https:\/\/clo.ru?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=product&amp;utm_term=first_clo\">sito<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"La storia della creazione di un servizio cloud, arricchita da elementi cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/32550980b529a5d7b395b3962218e53e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Team di sviluppo CLO<\/em><\/p>\n<p><\/p>\n<p>                        <b class=\"spoiler_title\">Link utili<\/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>Fonte: <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.1.1 - 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\/it\/blog\/administrirovanie\/istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/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\udd47Storia della creazione di un servizio cloud, con un pizzico di cyberpunk | ProHoster","description":"Con l'aumentare dell'esperienza.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/79153","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=79153"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/79153\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/79154"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=79153"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=79153"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=79153"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}