{"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\/ro\/blog\/administrirovanie\/istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom","title":{"rendered":"Povestea cre\u0103rii serviciului de cloud, condimentat\u0103 cu cyberpunk","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Povestea cre\u0103rii serviciului de cloud, condimentat\u0103 cu cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/d1cad1dfa3513b5794c7be916a9dbb4b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pe m\u0103sur\u0103 ce acumulezi experien\u021b\u0103 \u00een IT, \u00eencepi s\u0103 observi c\u0103 sistemele au propriul caracter. Ele pot fi docile, t\u0103cute, capricioase, dure. Pot fi primitoare sau resping\u0103toare. Oricum, trebuie s\u0103 'ne \u00een\u021belegem' cu ele, s\u0103 navig\u0103m printre 'capcanele ascunse' \u0219i s\u0103 construim lan\u021buri de interac\u021biune.<\/p>\n<p><\/p>\n<p>Iat\u0103 c\u0103 ne-a revenit onoarea de a construi o platform\u0103 de cloud, iar pentru asta a fost nevoie s\u0103 'convingem' c\u00e2teva subsisteme s\u0103 colaboreze cu noi. Din fericire, avem 'limbajul API', m\u00e2ini pricepute \u0219i mult entuziasm. <\/p>\n<p><\/p>\n<p>\u00cen acest articol nu va fi vorba despre tehnici avansate, dar voi descrie problemele cu care ne-am confruntat \u00een construirea cloud-ului. Am decis s\u0103 povestim c\u0103l\u0103toria noastr\u0103 sub forma unei fantezii tehnice u\u0219oare, despre cum am c\u0103utat un teren comun cu sistemele \u0219i ce a rezultat din asta. <\/p>\n<p><\/p>\n<p>Bun venit sub cat.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><\/p>\n<h3 id=\"nachalo-puti\">\u00cenceputul c\u0103l\u0103toriei<\/h3>\n<p><\/p>\n<p>Cu ceva timp \u00een urm\u0103, echipa noastr\u0103 a primit sarcina de a lansa o platform\u0103 de cloud pentru clien\u021bii no\u0219tri. La dispozi\u021bia noastr\u0103 au fost suportul conducerii, resursele, infrastructura hardware \u0219i libertatea de a alege tehnologiile pentru implementarea p\u0103r\u021bii software a serviciului.<\/p>\n<p><\/p>\n<p>De asemenea, au fost \u0219i o serie de cerin\u021be:<\/p>\n<p><\/p>\n<ul>\n<li>serviciul trebuie s\u0103 aib\u0103 un panou de administrare prietenos;<\/li>\n<li>platforma trebuie s\u0103 fie integrat\u0103 \u00een sistemul existent de facturare;<\/li>\n<li>partea software-hardware: OpenStack + Tungsten Fabric (Open Contrail), pe care inginerii no\u0219tri au \u00eenv\u0103\u021bat s\u0103 le 'prepare' destul de bine.<\/li>\n<\/ul>\n<p><\/p>\n<p>Despre cum s-a adunat echipa, cum a fost dezvoltat\u0103 interfa\u021ba panoului de administrare \u0219i ce decizii de design au fost luate, vom povesti alt\u0103dat\u0103, dac\u0103 comunitatea Habr va fi interesat\u0103.<br \/>\nInstrumentele pe care am decis s\u0103 le folosim:<\/p>\n<p><\/p>\n<ul>\n<li>Python + Flask + Swagger + SQLAlchemy \u2014 un set destul de standard pentru Python;<\/li>\n<li>Vue.js pentru frontend;<\/li>\n<li>comunicarea \u00eentre componente \u0219i servicii a fost realizat\u0103 prin Celery deasupra AMQP.<\/li>\n<\/ul>\n<p><\/p>\n<p>Anticip\u00e2nd \u00eentreb\u0103rile legate de alegerea limbajului Python, vreau s\u0103 explic. Limbajul \u0219i-a g\u0103sit locul \u00een compania noastr\u0103 \u0219i \u00een jurul s\u0103u s-a dezvoltat o mic\u0103, dar totu\u0219i, cultur\u0103. De aceea, s-a decis s\u0103 \u00eencepem construirea serviciului pe baza lui. Mai ales c\u0103 viteza de dezvoltare este adesea crucial\u0103 \u00een astfel de sarcini. <\/p>\n<p><\/p>\n<p>A\u0219adar, s\u0103 \u00eencepem cunoa\u0219terea noastr\u0103.<\/p>\n<p><\/p>\n<h3 id=\"molchalivyy-bill--billing\">Bill t\u0103cut \u2014 facturare<\/h3>\n<p><\/p>\n<p><em>Ne cunoa\u0219tem acest b\u0103iat de mult timp. El st\u0103tea mereu al\u0103turi \u0219i num\u0103ra ceva \u00een t\u0103cere. Uneori ne redirec\u021biona cererile utilizatorilor, emitea facturi pentru clien\u021bi, gestiona serviciile. Un tip obi\u0219nuit, muncitor. Adev\u0103rul este c\u0103 au existat dificult\u0103\u021bi. Era t\u0103cut, uneori contemplativ \u0219i adesea \u2014 cu capul \u00een alt\u0103 parte.<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea cre\u0103rii serviciului de cloud, condimentat\u0103 cu cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/262bb5c9d6234041d264f8e041e647fe.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Billing-ul a fost primul sistem cu care am \u00eencercat s\u0103 ne \u00eemprietenim. \u0218i prima dificultate s-a ivit c\u00e2nd am \u00eenceput s\u0103 proces\u0103m serviciile.<\/p>\n<p><\/p>\n<p>De exemplu, c\u00e2nd cre\u0103m sau \u0219tergem, sarcina ajunge \u00een coada intern\u0103 a billing-ului. Astfel este implementat sistemul de lucru asincron cu serviciile. Pentru a procesa tipurile noastre de servicii, a trebuit s\u0103 \"adun\u0103m\" sarcinile noastre \u00een aceast\u0103 coad\u0103. \u0218i aici ne-am confruntat cu problema: lipsa documenta\u021biei. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea cre\u0103rii serviciului de cloud, condimentat\u0103 cu cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/4d96251df014e315308c94f848bc6cd0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Judec\u00e2nd dup\u0103 descrierea API-ului software, aceast\u0103 problem\u0103 poate fi totu\u0219i rezolvat\u0103, dar nu aveam timp s\u0103 ne ocup\u0103m de ingineria invers\u0103, a\u0219a c\u0103 am mutat logica \u00een exterior \u0219i am organizat o coad\u0103 de sarcini deasupra RabbitMQ. Opera\u021biunea asupra serviciului este ini\u021biat\u0103 de client din contul personal, este encapsulat\u0103 \u00eentr-o \"sarcin\u0103\" Celery pe backend \u0219i se execut\u0103 pe partea de billing \u0219i OpenStack. Celery permite gestionarea convenabil\u0103 a sarcinilor, organizarea repet\u0103rilor \u0219i monitorizarea st\u0103rii. Detalii despre \"apio\u0219\" pot fi citite, de exemplu, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/433476\/\">aici<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>De asemenea, billing-ul nu a oprit proiectul care a r\u0103mas f\u0103r\u0103 bani. Discut\u00e2nd cu dezvoltatorii, am aflat c\u0103 la calcularea statisticii (iar noi trebuie s\u0103 implement\u0103m exact aceast\u0103 logic\u0103) exist\u0103 o interac\u021biune complex\u0103 a regulilor de stopare. Dar aceste modele nu se potrivesc bine cu realit\u0103\u021bile noastre. De asemenea, am implementat prin sarcini pe Celery, prelu\u00e2nd pe backend logica de gestionare a serviciilor. <\/p>\n<p><\/p>\n<p>Ambele probleme men\u021bionate mai sus au dus la faptul c\u0103 codul s-a umflat pu\u021bin \u0219i va trebui s\u0103 ne ocup\u0103m de refactorizare \u00een viitor pentru a muta logica de lucru cu sarcinile \u00eentr-un serviciu separat. De asemenea, trebuie s\u0103 stoc\u0103m o parte din informa\u021biile despre utilizatori \u0219i serviciile lor \u00een propriile noastre tabele, pentru a sus\u021bine aceast\u0103 logic\u0103.<\/p>\n<p><\/p>\n<p>O alt\u0103 problem\u0103 - t\u0103cerea.<\/p>\n<p><\/p>\n<p>La unele cereri c\u0103tre API, Billy r\u0103spunde t\u0103cut cu \"OK\". A\u0219a a fost, de exemplu, c\u00e2nd f\u0103ceam \u00eenregistr\u0103ri ale pl\u0103\u021bilor promise pentru o perioad\u0103 de testare (despre care vom vorbi mai t\u00e2rziu). Cererile erau executate corect \u0219i nu am observat erori. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea cre\u0103rii serviciului de cloud, condimentat\u0103 cu cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/d03f2c381fd39dbf33f2a0c3eeb1294d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A fost necesar s\u0103 studiem jurnalele, lucr\u00e2nd cu sistemul prin UI. S-a dovedit c\u0103 billingul face astfel de solicit\u0103ri, schimb\u00e2nd scope-ul la un utilizator specific, de exemplu, admin, transmitem-l ca parametru su.<\/p>\n<p><\/p>\n<p>\u00cen general, \u00een ciuda lacunelor din documenta\u021bie \u0219i a unor mici erori ale API-ului, totul a decurs destul de bine. Jurnalele pot fi citite chiar \u0219i \u00een condi\u021bii de mare \u00eenc\u0103rcare, dac\u0103 \u00een\u021belegem cum sunt structurate \u0219i ce trebuie s\u0103 c\u0103ut\u0103m. Structura bazei de date este complicat\u0103, dar destul de logic\u0103 \u0219i, \u00een unele aspecte, chiar atractiv\u0103.<\/p>\n<p><\/p>\n<p>A\u0219adar, concluzion\u00e2nd, principalele probleme cu care ne-am confruntat \u00een etapa de interac\u021biune sunt legate de particularit\u0103\u021bile implement\u0103rii sistemului specific: <\/p>\n<p><\/p>\n<ul>\n<li>func\u021bionalit\u0103\u021bi nedocumentate care ne-au afectat \u00eentr-un fel sau altul;<\/li>\n<li>surs\u0103 \u00eenchis\u0103 (billingul este scris \u00een C++), ca urmare, imposibilitatea de a rezolva problema 1 \u00een alt mod dec\u00e2t prin \u201emetoda \u00eencerc\u0103rilor \u0219i gre\u0219elilor\u201d.<\/li>\n<\/ul>\n<p><\/p>\n<p>Din fericire, produsul are un API destul de amplu \u0219i am integrat \u00een contul nostru personal urm\u0103toarele subsisteme:<\/p>\n<p><\/p>\n<ul>\n<li>modul de suport tehnic \u2014 cererile din contul personal sunt 'proxies' \u00een billing \u00een mod transparent pentru clien\u021bii serviciului;<\/li>\n<li>modul financiar \u2014 permite emiterea facturilor c\u0103tre clien\u021bii actuali, efectuarea de debite \u0219i generarea documentelor de plat\u0103;<\/li>\n<li>modul de gestionare a serviciilor \u2014 pentru acesta a fost nevoie s\u0103 implement\u0103m propriul nostru handler. Extensibilitatea sistemului ne-a fost de ajutor \u0219i am '\u00eenv\u0103\u021bat' Billingul un nou tip de servicii.<br \/>\nA fost necesar s\u0103 ne ocup\u0103m de el, dar, \u00eentr-un fel sau altul, cred c\u0103 ne vom \u00een\u021belege cu Billing.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"progulki-po-volframovym-polyam--tungsten-fabric\">Plimb\u0103ri pe c\u00e2mpurile de tungsten \u2014 Tungsten Fabric<\/h3>\n<p><\/p>\n<p><em>C\u00e2mpuri de tungsten, pres\u0103rate cu o sut\u0103 de cabluri, care transport\u0103 mii de bi\u021bi de informa\u021bie. Informa\u021bia este colectat\u0103 \u00een 'pachete', apoi procesat\u0103, construind trasee complexe, ca prin magie.<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea cre\u0103rii serviciului de cloud, condimentat\u0103 cu cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/9b6dd46d9f15e0e3393a8c1222abbf2f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aceasta este zona de responsabilitate a celei de-a doua sisteme cu care a trebuit s\u0103 ne \u00eemprietenim \u2014 Tungsten Fabric (TF), fostul OpenContrail. Sarcina sa este de a gestiona echipamentele de re\u021bea, oferind o abstrac\u021bie software pentru noi, ca utilizatori. TF \u2014 SDN, \u00eencorporeaz\u0103 o logic\u0103 complex\u0103 de lucru cu echipamentele de re\u021bea. Exist\u0103 un articol destul de bun despre tehnologie, de exemplu, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/muk\/blog\/251959\/\">aici<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Sistemul este integrat cu OpenStack (despre care vom discuta mai jos) prin pluginul Neutron. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea cre\u0103rii serviciului de cloud, condimentat\u0103 cu cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/5abe3992efaab3e016a0c51dc0070a94.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Interac\u021biunea serviciilor OpenStack.<\/em><\/p>\n<p><\/p>\n<p>Aceast\u0103 sistem\u0103 ne-a fost prezentat\u0103 de colegii din departamentul de operare. Folosim API-ul sistemului pentru a gestiona stiva de re\u021bea a serviciilor noastre. P\u00e2n\u0103 acum nu ne-a cauzat probleme serioase sau nepl\u0103ceri (nu m\u0103 voi pronun\u021ba \u00een numele colegilor din OEP), totu\u0219i au fost \u0219i unele momente amuzante \u00een interac\u021biune.<\/p>\n<p><\/p>\n<p>Primul a ar\u0103tat astfel: comenzile care necesit\u0103 afi\u0219area unui volum mare de date pe consola instan\u021bei la conectarea prin SSH pur \u0219i simplu \"blocheaz\u0103\" conexiunea, \u00een timp ce totul func\u021biona corect prin VNC.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea cre\u0103rii serviciului de cloud, condimentat\u0103 cu cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/02bc97d63a1299e1dda08fce0f10fb97.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pentru cei care nu sunt familiariza\u021bi cu problema, aceasta poate p\u0103rea destul de amuzant\u0103: ls \/root func\u021bioneaz\u0103 corect, \u00een timp ce, de exemplu, top \"se blocheaz\u0103\" complet. Din fericire, ne-am mai confruntat cu probleme de genul. S-a rezolvat prin optimizarea MTU-ului pe ruta de la nodurile compute la routere. Ca s\u0103 zic a\u0219a, aceasta nu este o problem\u0103 TF.<\/p>\n<p><\/p>\n<p>Urm\u0103toarea problem\u0103 ne-a a\u0219teptat dup\u0103 col\u021b. \u00centr-un moment \"minunat\", magia rut\u0103rii a disp\u0103rut, pur \u0219i simplu. TF a \u00eencetat s\u0103 mai gestioneze rutarea pe echipament.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea cre\u0103rii serviciului de cloud, condimentat\u0103 cu cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/db2a75ffdf2940b2ca90f73835f7a321.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Am lucrat cu OpenStack la nivel de admin \u0219i de acolo am trecut la nivelul utilizatorului necesar. SDN pare s\u0103 \"preia\" domeniul utilizatorului cu care se efectueaz\u0103 ac\u021biunile. Problema este c\u0103 acela\u0219i cont de admin este folosit pentru comunicarea dintre TF \u0219i OpenStack. La pasul de schimbare la utilizator, \"magia\" disp\u0103rea. S-a decis s\u0103 se creeze un cont separat pentru lucrarea cu sistemul. Acest lucru a permis s\u0103 lucr\u0103m f\u0103r\u0103 a rupe func\u021bionalitatea integr\u0103rii.<\/p>\n<p><\/p>\n<h3 id=\"silikonovye-formy-zhizni--openstack\">Formele de via\u021b\u0103 din siliciu \u2014 OpenStack<\/h3>\n<p><\/p>\n<p><em>Creatura de siliciu cu o form\u0103 ciudat\u0103 tr\u0103ie\u0219te aproape de c\u00e2mpurile de tungsten. Cel mai mult seam\u0103n\u0103 cu un copil crescut, care cu un singur gest ne-ar putea zdrobi, dar nu emite agresivitate evident\u0103. Nu provoac\u0103 team\u0103, dar dimensiunile sale induc nelini\u0219te. La fel ca \u0219i complexitatea a ceea ce se petrece \u00een jur.<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea cre\u0103rii serviciului de cloud, condimentat\u0103 cu cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/8622d43e0cb963bc9ef2a2ce59a32499.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>OpenStack este nucleul platformei noastre.<\/p>\n<p><\/p>\n<p>OpenStack are mai multe subsisteme, dintre care cele pe care le folosim cel mai activ sunt Nova, Glance \u0219i Cinder. Fiecare dintre ele are propriul API. Nova se ocup\u0103 de resursele compute \u0219i crearea instan\u021belor, Cinder gestioneaz\u0103 volumele \u0219i instantan\u021bele acestora, Glance este un serviciu de imagini, care gestioneaz\u0103 \u0219abloanele sistemului de operare \u0219i metainforma\u021biile aferente acestora.<\/p>\n<p><\/p>\n<p>Fiecare serviciu este lansat \u00eentr-un container, iar brokerul de mesaje este \"iepura\u0219ul alb\" \u2014 RabbitMQ.<\/p>\n<p><\/p>\n<p>Aceast\u0103 sistem\u0103 ne-a adus cele mai multe nepl\u0103ceri nea\u0219teptate.<\/p>\n<p><\/p>\n<p>\u0218i prima problem\u0103 nu s-a l\u0103sat a\u0219teptat\u0103, c\u00e2nd am \u00eencercat s\u0103 conect\u0103m un volum suplimentar la server. API-ul Cinder a refuzat categoric s\u0103 \u00eendeplineasc\u0103 aceast\u0103 sarcin\u0103. Mai precis, dac\u0103 avem \u00eencredere \u00een OpenStack, conexiunea se stabile\u0219te, \u00eens\u0103 \u00een interiorul serverului virtual dispozitivul de disc lipse\u0219te.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea cre\u0103rii serviciului de cloud, condimentat\u0103 cu cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/b4755d893f3f8ad7d7aeab3af69f35cf.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Am decis s\u0103 \u201eo ocolim\u201d \u0219i am cerut aceea\u0219i ac\u021biune de la API-ul Nova. Rezultatul \u2014 dispozitivul se conecteaz\u0103 corect \u0219i este disponibil \u00een interiorul serverului. Se pare c\u0103 problema apare atunci c\u00e2nd stocarea pe blocuri nu r\u0103spunde la Cinder.<\/p>\n<p><\/p>\n<p>O alt\u0103 dificultate ne a\u0219tepta la lucru cu discurile. Volumul de sistem nu putea fi deconectat de la server.<\/p>\n<p><\/p>\n<p>Din nou, OpenStack \u201epromite\u201d c\u0103 a distrus conexiunea \u0219i acum se poate lucra corect cu volumul separat. Dar API-ul refuza categoric s\u0103 efectueze opera\u021biuni asupra discului. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea cre\u0103rii serviciului de cloud, condimentat\u0103 cu cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/952fd7cd11181605c52a7df71cd4f69f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aici am decis s\u0103 nu mai lupt\u0103m, ci s\u0103 schimb\u0103m perspectiva asupra logicii de func\u021bionare a serviciului. Dac\u0103 exist\u0103 un instance, trebuie s\u0103 existe \u0219i un volum de sistem. A\u0219adar, utilizatorul nu poate elimina sau deconecta \u201ediscul\u201d de sistem f\u0103r\u0103 a \u0219terge \u201eserverul\u201d.<\/p>\n<p><\/p>\n<p>OpenStack este un complex de sisteme destul de complicat cu propria logic\u0103 de interac\u021biune \u0219i un API complex. Ne ajut\u0103 documenta\u021bia destul de detaliat\u0103 \u0219i, desigur, metoda probelor \u0219i erorilor (altfel cum?).<\/p>\n<p><\/p>\n<h3 id=\"testovyy-zapusk\">Lansare de test<\/h3>\n<p><\/p>\n<p>Lansarea de test am efectuat-o \u00een decembrie anul trecut. Scopul principal a fost verificarea \u00een condi\u021bii reale a proiectului nostru din punct de vedere tehnic \u0219i din perspectiva UX. Am invitat selectiv audien\u021ba, iar testarea a fost \u00eenchis\u0103. Totu\u0219i, am l\u0103sat \u0219i posibilitatea de a solicita acces la testare pe site-ul nostru.<\/p>\n<p><\/p>\n<p>Testul, bine\u00een\u021beles, nu a fost lipsit de momente amuzante, c\u0103ci pe ici aventura noastr\u0103 abia \u00eencepe. <\/p>\n<p><\/p>\n<p>\u00cen primul r\u00e2nd, am evaluat oarecum incorect interesul pentru proiect, a\u0219a c\u0103 a trebuit s\u0103 ad\u0103ug\u0103m rapid noduri compute exact \u00een timpul testului. Un caz obi\u0219nuit pentru un cluster, dar \u0219i aici au fost anumite nuan\u021be. \u00cen documenta\u021bia pentru versiunea specific\u0103 a TF este indicat\u0103 o versiune specific\u0103 a kernel-ului pe care s-a testat func\u021bionarea cu vRouter. Am decis s\u0103 lans\u0103m nodurile cu kernel-uri mai recente. Ca rezultat \u2014 TF nu a primit rutele de la noduri. A trebuit s\u0103 revenim de urgen\u021b\u0103 la kernel-uri.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea cre\u0103rii serviciului de cloud, condimentat\u0103 cu cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/377208246d5e396317fb934a35ed1227.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un alt moment amuzant este legat de func\u021bionalitatea butonului \u201eschimb\u0103 parola\u201d din contul personal. <\/p>\n<p><\/p>\n<p>Am decis s\u0103 folosim JWT pentru a organiza accesul la cabinetul personal, pentru a nu lucra cu sesiuni. Deoarece sistemele sunt diverse \u0219i dispersate pe scar\u0103 larg\u0103, gestion\u0103m propriul nostru token, \u00een care \u201e\u00eempachet\u0103m\u201d sesiuni de la facturare \u0219i token de la OpenStack. La schimbarea parolei, token-ul, bine\u00een\u021beles, devine \u201eexpirat\u201d, deoarece datele utilizatorului nu mai sunt valide \u0219i trebuie s\u0103 fie regenerat. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea cre\u0103rii serviciului de cloud, condimentat\u0103 cu cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/daa27256d0b888b2c59d4bc6129f600d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Am omis acest aspect, iar resursele pentru a completa rapid aceast\u0103 parte ne-au lipsit. A trebuit s\u0103 elimin\u0103m func\u021bionalitatea \u00eenainte de lansarea \u00een test.<br \/>\n\u00cen prezent, facem logout utilizatorului dac\u0103 parola a fost schimbat\u0103.<\/p>\n<p><\/p>\n<p>\u00cen ciuda acestor nuan\u021be, testarea a decurs bine. \u00cen decurs de c\u00e2teva s\u0103pt\u0103m\u00e2ni, am avut aproximativ 300 de persoane care ne-au vizitat. Am reu\u0219it s\u0103 privim produsul prin ochii utilizatorilor, s\u0103-l test\u0103m \u00een condi\u021bii reale \u0219i s\u0103 colect\u0103m feedback de calitate. <\/p>\n<p><\/p>\n<h3 id=\"prodolzhenie-sleduet\">Continuarea urmeaz\u0103<\/h3>\n<p><\/p>\n<p>Pentru mul\u021bi dintre noi, acesta este primul proiect de o asemenea amploare. Am \u00eenv\u0103\u021bat o serie de lec\u021bii valoroase despre cum s\u0103 lucr\u0103m \u00een echip\u0103, s\u0103 lu\u0103m decizii arhitecturale \u0219i de design. Cum s\u0103 integr\u0103m sisteme complexe cu resurse limitate \u0219i s\u0103 le lans\u0103m \u00een produc\u021bie. <\/p>\n<p><\/p>\n<p>Desigur, exist\u0103 multe aspecte care necesit\u0103 lucr\u0103ri, at\u00e2t \u00een privin\u021ba codului, c\u00e2t \u0219i la interfe\u021bele de integrare a sistemelor. Proiectul este destul de t\u00e2n\u0103r, dar suntem plini de ambi\u021bie s\u0103-l transform\u0103m \u00eentr-un serviciu fiabil \u0219i convenabil.<\/p>\n<p><\/p>\n<p>Sistemele au fost deja convinse. Bill se ocup\u0103 ascult\u0103tor de calcularea, emiterea facturilor \u0219i solicit\u0103rile utilizatorilor \u00een c\u0103m\u0103ru\u021ba sa. \u201eMagia\u201d c\u00e2mpurilor de tungsten ne asigur\u0103 o conexiune stabil\u0103. \u0218i doar OpenStack se mai comport\u0103 uneori capricios, strig\u00e2nd ceva de genul \u201eWSREP nu a preg\u0103tit \u00eenc\u0103 nodul pentru utilizarea aplica\u021biei\u201d. Dar aceasta este o poveste complet diferit\u0103\u2026<\/p>\n<p><\/p>\n<p>Chiar recent am lansat serviciul.<br \/>\nToate detaliile le pute\u021bi afla pe <noindex><a rel=\"nofollow\" href=\"https:\/\/clo.ru?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=product&amp;utm_term=first_clo\">site<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Povestea cre\u0103rii serviciului de cloud, condimentat\u0103 cu cyberpunk\" src=\"\/wp-content\/uploads\/2020\/04\/32550980b529a5d7b395b3962218e53e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Echipa de dezvoltare CLO<\/em><\/p>\n<p><\/p>\n<p>                        <b class=\"spoiler_title\">Linkuri utile<\/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>Sursa: <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.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\/ro\/blog\/administrirovanie\/istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Povestea cre\u0103rii serviciului cloud, condimentat\u0103 cu cyberpunk | ProHoster","description":"Pe m\u0103sur\u0103 ce experien\u021ba cre\u0219te.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/istoriya-sozdaniya-oblachnogo-servisa-pripravlennaya-kiberpankom","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/79153","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=79153"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/79153\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/79154"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=79153"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=79153"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=79153"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}